WordPress 親ターム子タームの一覧に紐づく投稿一覧を表示する方法

WordPress 親ターム子タームの一覧に紐づく投稿一覧を表示する方法

WordPress で親タームと子タームの一覧と、各タームに紐づく投稿一覧を表示する方法を紹介します。
例えば、タクソノミーのタームに紐づく記事一覧をツリー構造のように表示したい場合に便利な方法です。

親ターム子タームの一覧に紐づく投稿一覧を表示する方法

親タームと子タームの一覧と各タームに紐づく投稿一覧を表示する場合は、関数 get_terms() を使用します。
例えば、カスタム投稿タイプが product、タクソノミーのスラッグが product-category のターム一覧に紐づく投稿一覧を表示したい場合、次のコードをテンプレートファイルに追加します。

<?php // タームの親・子の一覧にタームに紐づく投稿一覧を表示する方法
$posttype_slug = 'product';
$taxonomy_slug = 'product-category';
$categories = get_terms($taxonomy_slug,'parent=0');
foreach ( $categories as $cat ) {
echo '<h2>' . esc_html($cat->name) . '</h2>'; // 親タームタイトル
$children = get_terms($taxonomy_slug,'hierarchical=0&parent='.$cat->term_id);
if($children){ // 子タームの有無
foreach ( $children as $child ) {
echo '<h3>' . esc_html($child->name) . '</h3>'; // 子タームタイトル
$catslug = $child->slug;
$args = array(
'post_type' => $posttype_slug,
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => $taxonomy_slug, // タクソノミースラッグを指定
'field' => 'slug',
'terms' => $catslug, // タームスラッグを指定
)
)
);
$myquery = new WP_Query( $args );
?>
<?php if ( $myquery->have_posts()): ?>
<ul>
<?php while($myquery->have_posts()): $myquery->the_post(); ?>
<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
<?php } //子タームに紐づく記事一覧の表示終了 ?>
<?php
} else { // 子タームがなければ親タームに紐づく記事一覧を表示
$catslug = $cat->slug;
$args = array(
'post_type' => $posttype_slug,
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => $taxonomy_slug, // タクソノミースラッグを指定
'field' => 'slug',
'terms' => $catslug, // タームスラッグを指定
)
)
);
$myquery = new WP_Query( $args ); ?>
<?php if ( $myquery->have_posts()): ?>
<ul>
<?php while($myquery->have_posts()): $myquery->the_post(); ?>
<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
<?php } // 子ターム終了 ?>
<?php } // 親ターム終了 ?>

スラッグは適宜変更を加えてご利用ください。
このコードの場合、各ターム名は見出しタグで囲われて表示されます。
各投稿はリストタグで囲われて表示されます。

まとめ

WordPress で親ターム子タームの一覧に紐づく投稿一覧を表示する方法を紹介しました。
紹介した方法は、投稿に親・子のタームにチェックが無い場合や、同一階層のタームを複数チェックする場合には対応していません。
タームが親・子・孫まである場合は、WordPress タームの親・子・孫の一覧に孫タームの投稿一覧を表示する方法をご覧ください。