WordPressでタームごと記事一覧を表示する方法
WordPressで特定のタクソノミーに属するタームの一覧を表示して、そのタームごとの記事の一覧を合わせて表示する方法の備忘録です。
タームの一覧を表示する
はじめに、特定のタクソノミーに属しているタームの一覧を表示します。
今回は例としてカスタムタクソノミー「area」に属するタームの一覧を表示します。
<?php
$terms = get_terms('area', array('hide_empty' => false));
if (!empty($terms) && !is_wp_error($terms)):
foreach($terms as $term):
?>
<h2><?php echo $term->name; ?></h2>
<?php
endforeach;
endif;
?>
get_terms()
で表示したいタームのタクソノミー「area」を設定しています。配列で「’hide_empty’ => false」を設定して投稿のないタームも取得するように設定しています。投稿のないタームを取得しない場合は、「true」を設定します。
取得したタームをforeach
のループで表示しています。echo $term->name;
でh2
タグにタームの名称を表示しています。
タームごとの記事一覧を表示する
続いてforeach
のループの中で、タイトルに表示したタームの記事一覧を表示します。
h2
タグの下に記事を出力するコードを追加します。
<?php
$terms = get_terms('area', array('hide_empty' => false));
if (!empty($terms) && !is_wp_error($terms)):
foreach($terms as $term):
?>
<h2><?php echo $term->name; ?></h2>
<?php
$args = array(
'post_type' => 'post',
'tax_query' => array(
array(
'taxonomy' => 'area',
'field' => 'slug',
'terms' => $term->slug
),
),
);
$query = new WP_Query($args);
if ($query->have_posts()):
?>
<ul>
<?php
while ($query->have_posts()): $query->the_post();
?>
<li><a href="<?php echo get_permalink(); ?>"><?php echo get_the_title(); ?></a></li>
<?php
endwhile;
wp_reset_postdata();
?>
</ul>
<?php
endif;
endforeach;
endif;
?>
WP_Query($args)
で記事の一覧を取得して、while
のループで表示しています。
配列で「’taxonomy’ => ‘area’」「’field’ => ‘slug’」「’terms’ => $term->slug」の3つを設定することで、「area」タクソノミーのタイトルに表示しているタームに属する記事を取得しています。
get_terms()
、WP_Query()
ともに配列のパラメータで表示するタームや記事の一覧の選別や並び替えが可能です。