BLOG

Paakのスタッフが得た知見や情報を発信するブログです。
たまに会社の出来事に関する記事もお届けします。

WordPress カスタム投稿タイプのターム一覧ページ

カスタム投稿タイプ名・・・item
タクソノミー 名・・・item_category, item_member
item_categoryのタームの例:FOOD, DRINK, FASHION,OTHER…
item_memberのタームの例:Aさん, Bさん, Cさん…

上記のカスタム投稿タイプの設定を想定します。タームはあくまでもイメージを付きやすくするための一例です。

ターム一覧ページのパスは、
http://〇〇.com/[タクソノミー名]/[ターム名] です。
例えば、こんな感じです。
http://〇〇.com/item_category/food
http://〇〇.com/item_member/a

item_categoryとitem_memberではテンプレートファイルが基本的に別になります。
他のカスタム投稿タイプのターム一覧ページが存在しなければ、taxonomy.phpとして一緒にしても問題ないです。

テンプレートファイルを分けるが、同じコードを使用する場合、下記のように片方からは読み込むだけでOKです。

 <?php get_template_part( 'taxonomy-item_category' ); ?>

では、taxonomy-item_category.phpを解説していきます。

・ターム一覧をループで取得し、メニューとして使いたい
・タームで絞った記事一覧を表示したい

この2パターンについて解説します。

とりあえず、下記をファイル上部に記述します。

taxonomy-item_category.php
 
<?php 
   $taxonomy = get_query_var('taxonomy');//現在ページのタクソノミー取得
 ?>
 ...

・ターム一覧をループで取得し、メニューとして使いたい場合

taxonomy-item_category.php
 
<ul>
   <li><a href="<?php echo home_url(); ?>/item">ALL</a></li>
   <?php 
   $categories = array(
     'post_type' => 'item',//カスタム投稿タイプ名
     'taxonomy' => 'item_category'//取得したいタクソノミー名
   );
   $categories = get_categories( $categories );//上で指定した配列を条件にターム一覧を取得
   if($categories):
   foreach($categories as $cat):
   if($term === $cat->slug)://$termはグローバル変数で現在ページのタームが自動で入る
   ?>
   <li class="isActive"><a href="javascript:void(0);"><?php echo $cat->name ?></a></li>
   <?php else: ?>
   <li><a href="<?php echo home_url(); ?>/item_category/<?php echo $cat->slug ?>"><?php echo $cat->name ?></a></li>
   <?php
   endif;
   endforeach;
   wp_reset_postdata();
   endif;
   ?>
 </ul>

別のタクソノミーのターム一覧を取得したい場合は、「item_category」の部分を任意で変更してください。
$termに現在ページのタームが入っているのがミソです。これを利用してif文で分岐することで、現在ページのタームにclass名を付けれます。

・タームで絞った記事一覧を表示したい場合

taxonomy-item_category.php
 
<ul>
   <?php 
   $args = array(
     'post_type' => 'item',
     'posts_per_page' => -1,
     'tax_query' => array(
       array(
           'taxonomy' => $taxonomy,//現在ページのタクソノミー
           'field' => 'slug',
           'terms' => $term,//現在ページのターム
       ),
     ),
   );
   $the_query = get_posts( $args );
   if ( $the_query ) :
   foreach ( $the_query as $post ) : setup_postdata( $post );//上の配列で指定した通り、現在ページのタームの記事一覧をループ
   $item_category = get_the_terms($post->ID, 'item_category');//記事のitem_categoryのタームを取得
   $item_member = get_the_terms($post->ID, 'item_member');//記事のitem_memberのタームを取得
   ?>
   <li>
     <h3><?php the_title() ?></h3>
     <p><?php echo $item_category[0]->name; ?></p>//ターム名を表示 タームが複数ある場合はループで表示する
     <p><?php echo $item_member[0]->name; ?></p>//ターム名を表示
     <p><?php echo get_the_excerpt() ?></p>
   </li>
   <?php
   endforeach;
   wp_reset_postdata();
   endif;
   ?>
 </ul>

上記コードで現在ページのタームに絞った記事一覧が表示されます。
配列で取得する記事を指定する際に、変数で現在ページのタクソノミーとタームを指定することで、
別のタクソノミーのテンプレート(taxonomy-item_category.php)で読み込んだ場合も変更点がないというのがミソです。

CONTACT /

webサイトでお困りのことがあれば、お気軽にご相談ください。

お問い合わせはこちら

CONTACT /

Paakについて、案件のご相談、採用についてはお問い合わせフォームからご連絡ください。