WordPress ターム一覧とそのタームに紐づく投稿一覧の表示方法

WordPress ターム一覧とそのタームに紐づく投稿一覧の表示方法

WordPress でターム一覧とそのタームに紐づく投稿一覧の表示方法を紹介します。
例えば、カテゴリーごとに分けられた投稿一覧を表示したい時に便利な方法です。

  1. タームに紐づく投稿一覧を表示する方法
  2. タームに紐づく投稿がない場合でもターム名を表示する方法

タームに紐づく投稿一覧の表示方法

タームに紐づく投稿一覧を表示するには get_terms でタームを取得して foreach でループを回して表示します。

例えば、タクソノミーが recruit-category で投稿タイプが recruit の場合に、ターム名を見出しとして表示して、そのタームに紐づく投稿一覧を表示する場合、次のコードをテンプレートファイルに追加します。

<?php // タームに紐づく投稿一覧を表示
$taxonomy_slug = 'recruit-category'; // カスタムタクソノミーのスラッグを指定
$post_type_slug = 'recruit'; // 投稿タイプのスラッグを指定
$terms = get_terms($taxonomy_slug); // タームを取得
foreach ( $terms as $value ) {
echo '<h2>'.esc_html($value->name).'</h2>'; // ターム名を表示
$term_slug = $value->slug; // タームに紐づく投稿一覧のクエリを設定
$args = array(
'post_type' => $post_type_slug, // 投稿タイプの指定
$taxonomy_slug => $term_slug , // タクソノミーからタームを指定
'posts_per_page' => -1, // タームに紐づく投稿を全てを表示
'post_status' => 'publish' // 公開済みの投稿を表示
);
$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 } // ループの終了 ?>

タクソノミーの指定は $taxonomy_slug = 'recruit-category’;recruit-category を変更。
投稿タイプの指定は $post_type_slug = 'recruit';recruit を変更してください。

タームに紐づく投稿がない場合でもターム名を表示する方法

先に紹介した方法では、投稿の紐付けがないタームは一覧に表示されません。
投稿がない場合でもターム名を表示したい場合もあるので、投稿がないときでもターム名を表示するように手を加えます。

例えば、タクソノミーが recruit-category で投稿タイプが recruit の場合に、投稿がないタームでもターム名を表示するには、次のコードをテンプレートファイルに追加します。

<?php // タームに紐づく投稿がない場合でも一覧を表示
$taxonomy_slug = 'recruit-category'; // カスタムタクソノミーのスラッグを指定
$post_type_slug = 'recruit'; // 投稿タイプのスラッグを指定
$args = array(
'hide_empty' => false // 投稿の紐付けがないタームも表示
);
$terms = get_terms($taxonomy_slug,$args); // タームを取得
foreach ( $terms as $value ) {
echo '<h2>'.esc_html($value->name).'</h2>'; // ターム名を表示
$term_slug = $value->slug; // タームに紐づく投稿一覧のクエリを設定
$args = array(
'post_type' => $post_type_slug, // 投稿タイプの指定
$taxonomy_slug => $term_slug , // タクソノミーからタームを指定
'posts_per_page' => -1, // タームに紐づく投稿を全てを表示
);
$myquery = new WP_Query( $args );
?>
<ul>
<?php if ( $myquery->have_posts()): ?>
<?php while($myquery->have_posts()): $myquery->the_post(); ?>
<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
<?php else: ?>
<li>このタームに紐づく投稿はありません</li>
<?php endif; ?>
</ul>
<?php wp_reset_postdata(); ?>
<?php } // ループの終了 ?>

まとめ

WordPress でターム一覧とそのタームに紐づく投稿一覧の表示方法を紹介しました。