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

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

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

  1. タームに紐づく投稿一覧を表示する方法
    1. 特定のタームに紐づく投稿一覧を表示
    2. 指定したタームを除外して投稿一覧を表示
  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 を変更してください。

特定のタームに紐づく投稿一覧を表示

特定のタームだけの投稿を表示たい場合は次のコードを追加してください。

<?php // 特定のタームに紐づく投稿一覧を表示
$taxonomy_slug = 'recruit-category'; // カスタムタクソノミーのスラッグを指定
$post_type_slug = 'recruit'; // 投稿タイプのスラッグを指定
$specific_term_slug = 'xxx'; // 表示したい特定のタームのスラッグを指定
$args = array(
'post_type' => $post_type_slug, // 投稿タイプの指定
$taxonomy_slug => $specific_term_slug, // 特定のタームを指定
'posts_per_page' => -1, // タームに紐づく投稿を全てを表示
'post_status' => 'publish' // 公開済みの投稿を表示
);
$myquery = new WP_Query( $args );
?>
<?php if ( $myquery->have_posts()): ?>
<h2><?php echo esc_html(get_term_by('slug', $specific_term_slug, $taxonomy_slug)->name); ?></h2>
<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'; // カスタムタクソノミーのスラッグを指定
$post_type_slug = 'recruit'; // 投稿タイプのスラッグを指定
$exclude_term_slug = 'xxxxx'; // 除外したいタームのスラッグを指定
$terms = get_terms($taxonomy_slug); // タームを取得
foreach ( $terms as $value ) {
if ( $value->slug == $exclude_term_slug ) {
continue; // 除外したいタームはスキップ
}
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 } // ループの終了 ?>

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

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

例えば、タクソノミーが 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 でターム一覧とそのタームに紐づく投稿一覧の表示方法を紹介しました。