[WordPress]termを階層表示する

termを階層表示したい場合。
多階層の場合は再帰を使うと便利。というか、階層の深さが決まっていない場合は再帰を使うしかありません。

 

まずは再帰の為にfunctionを作ります。
functions.phpに置いておいてもいいのかも。

<?php
function output_terms( $this_id ){
  if( !$this_id ) $this_id = 0;
  $taxonomy = 'taxonomy_name';
  $args = array(
    'parent' => $this_id
    //  , hide_empty => 0  //記事無しのtermも表示したい場合はコメントアウトを解除しよう
  );
  $terms = get_terms( $taxonomy, $args );
  if( count($terms) > 0 ){
    if( $this_id != 0 ) echo '<ul>';
    foreach ( $terms as $term ) {
      echo '<li><a href="' . esc_url( get_term_link( $term->term_id )) . '">' . $term->name . '</a>';
      output_terms($term->term_id); //ここで再帰して子孫termを表示
      echo '</li>';
    }
    if( $this_id != 0 ) echo '</ul>';
  }
}
?>

引数0または無しで呼び出すと最上位(親無し)から書き出せます。
任意のtermがある場合は、初期の呼び出しをそのtermのIDにすればOK。

 

手打ちで「全記事」とか足したい場合用に、親無しの場合は、ulタグの出力をしないようにしてあります。
任意のtermからスタートする場合で何か静的に足したい場合は、上のコード中の「if( $this_id != 0 )」の2か所を書き換えればOK。

 

呼び出し部分の記述はこんな感じです。

<ul>
  <li><a href="#">全記事</a></li>
<?php
  output_terms(0);
?>
</ul>

© 2018- Saruzie.