2021/04/28
Wordpress /
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)で読み込んだ場合も変更点がないというのがミソです。