特定のタクソノミーの親子タームを一覧で表示する方法 【WordPressカスタマイズ】

こんにちは!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で形を整えれば完成です。

ぜひトライしてみてください。それでは!

目次
閉じる