こんにちは!Weblattです。
今日は、「特定のタクソノミーで、親子関係になっているターム」を、一覧で表示する方法について紹介します。
少しわかりにくいですが、例えば「地域」というタクソノミーに「中部」「近畿」といった親タームが存在し、「愛知」「大阪」といった子タームがあるとします。
今回はこういった「親子関係になっているターム」を一覧で表示し、さらにそれぞれのタームごとに投稿されている記事数を表示してみたいと思います。(下の画像のようなイメージです)

一覧を表示したい箇所に、以下のように記述します。
<ul>
<div>
<?php
$taxonomy = 'branch_area'; //タクソノミー名
$args = array(
'pad_counts' => true,
'hide_empty' => true,
'parent' => 0
);
$terms = get_terms( $taxonomy , $args );
foreach ( $terms as $term ) : //親タームのみ回す
$term_id = $term->term_id;
$term_count = $term->count;
$term_name = $term->name;
$term_url = get_term_link($term);
$term_slug = $term->slug;
$termchildren = get_term_children( $term_id, $taxonomy );
?>
<li class="rural"><a href="<?php echo home_url().'/branch/?branch_area='.$term_slug; ?>"><?php echo $term_name; ?>(<?php echo $term_count;?>)</a>
<ul class="pref">
<?php
foreach ( $termchildren as $child ): //その中で子タームを回す
$termC = get_term_by( 'id' , $child, $taxonomy );
$child_count = $termC->count;
$child_name = $termC->name;
$child_slug = $termC->slug;
$child_url = get_term_link($termC);
?>
<li><a href="<?php echo home_url().'/branch/?branch_area='.$child_slug; ?>">- <?php echo $child_name; ?>(<?php echo $child_count;?>)</a></li>
<?php endforeach; ?>
</ul>
</li>
<?php endforeach; ?>
</div>
</ul>
順番に解説していきます。
目次
親タームをループさせる
まずは指定するタクソノミー(今回は「branch_area」 )の各タームをget_terms関数で取得します。
引数parentに0を指定すると、トップレベルのターム(親ターム)のみを取得できます。
$taxonomy = 'branch_area'; //タクソノミー名
$args = array(
'pad_counts' => true,
'hide_empty' => true,
'parent' => 0
);
$terms = get_terms( $taxonomy , $args );
それから、まず親タームのみをforeach構文でループさせます。
その際、get_term_chilren関数でそれぞれの子タームを全て取得します。
foreach ( $terms as $term ) : //親タームのみ回す
$term_id = $term->term_id;
$term_count = $term->count;
$term_name = $term->name;
$term_url = get_term_link($term);
$term_slug = $term->slug;
$termchildren = get_term_children( $term_id, $taxonomy );
親タームの中で子タームをループさせる
さらに親タームのfoeachの中でそれぞれの子タームをforeachでループさせます。
get_term_by関数を使って、term_idをキーにそれぞれの子タームを取得します。
foreach ( $termchildren as $child ): //その中で子タームを回す
$termC = get_term_by( 'id' , $child, $taxonomy );
$child_count = $termC->count;
$child_name = $termC->name;
$child_slug = $termC->slug;
$child_url = get_term_link($termC);
ここまでできたら、あとはCSSで形を整えれば完成です。
ぜひトライしてみてください。それでは!