プログラミング

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

例えば「支部地域」というタクソノミーに「中部」「近畿」といった親タームが存在し、「愛知」「大阪」といった子タームがあるとします。

今回はこういった親子関係のタームをWordPressで一覧で表示し、さらにそれぞれのタームごとの記事数を表示する方法を解説します。

表示したい箇所に以下のように記述します。

<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で形を整えれば完成です。お疲れ様でした!

ABOUT ME
マッチ
マッチ
サラリーマンをしながら筋トレブログを2020年1月より運営。 体型に自信が持てないあなたへ、筋トレの魅力を発信中。 趣味はアジア旅で訪問国は20カ国以上。