WordPressで親子のカスタムタクソノミーを表示する方法

WordPressで、親子関係にあるカスタムタクソノミーのタームを表示する方法の備忘録です。
親タームと子タームの一覧を表示する
親タームを見出しに、該当する子タームの一覧をリスト形式で表示します。

親タームと子タームを一覧表示するコードです。
$parent_terms = get_terms('tax-name', ['parent' => 0, 'hide_empty' => false]);
foreach ($parent_terms as $parent_term) {
echo '<h3>' . $parent_term->name . '</h3>';
echo '<ul>';
$child_terms = get_terms('tax-name', ['parent' => $parent_term->term_id, 'hide_empty' => false]);
foreach ($child_terms as $child_term) {
echo '<li><a href="' . get_term_link($child_term->term_id) . '">' . $child_term->name . '</a></li>';
}
echo '</ul>';
}
はじめに、トップレベルの親タームをget_terms()で取得します。get_terms()の第一引数「tax-name」部分には、出力したいカスタムタクソノミーの名称(タクソノミー名)を設定します。
パラメーターに'parent' => 0を指定することで、親要素を持たないタームも含めて出力しています。
また、通常は投稿がないタームは一覧に含まれませんが、'hide_empty' => falseを設定することで、投稿がない空のタームも含めて取得しています。
取得した親タームの配列をforeachのループを使用して、さらに子タームを取得して表示します。
子タームを取得する際、パラメーターに'parent' => $parent_term->term_idを指定することで、現在処理している親タームの直下にある子タームのみを限定して取得できます。
子タームの投稿一覧を表示する
さらに、親タームを見出しとして表示し、その配下にある子タームと所属する投稿の一覧を表示します。

子タームに属する投稿を一覧表示するコードを追加したソースです。
$parent_terms = get_terms('tax-name', ['parent' => 0, 'hide_empty' => false]);
foreach ($parent_terms as $parent_term) {
echo '<h3>' . $parent_term->name . '</h3>';
$child_terms = get_terms('tax-name', ['parent' => $parent_term->term_id, 'hide_empty' => false]);
foreach ($child_terms as $child_term) {
echo '<h4>' . $child_term->name . '</h4>';
$args = array(
'post_type' => 'post',
'posts_per_page' => 3,
'tax_query' => array(
array(
'taxonomy' => 'tax-name',
'field' => 'term_id',
'terms' => $child_term->term_id,
),
),
);
$query = new WP_Query($args);
if ($query->have_posts()) {
echo '<ul>';
while ($query->have_posts()) {
$query->the_post();
echo '<li><a href="' . get_the_permalink() . '">' . get_the_title() . '</a></li>';
}
echo '</ul>';
}
wp_reset_postdata();
}
}
取得した子タームをタイトル(h4)に変更しています。
さらに、各子タームのループ内でWP_Queryを実行して、該当する記事を取得して一覧表示しています。
WordPressでタームごとの記事一覧を表示する方法の詳細は、こちらの記事でまとめています。


