[WordPress] タクソノミー・タームを全て取得&表示する

WordPressのタクソノミー・タームに関する備忘録です。
サイドバーに「カテゴリ一覧」のナビゲーションリストを表示させたい、といったケースに使える実装サンプルもご紹介します。

前提:カスタムタクソノミーの定義

functions.php で定義します。

下記は、カスタム投稿タイプ「ブログblogに、
タクソノミー「カテゴリblog_categoryを定義する例です。

register_post_type( 'blog', [
  'label' => 'ブログ',
  'public' => true,
  'has_archive' => true,
]);
register_taxonomy( 'blog_category', 'blog', [
  'label' => 'カテゴリ',
  'hierarchical' => true,
  'show_in_rest' => true
]);

管理画面で登録したカテゴリひとつひとつをタームと呼びます。

参考:
関数リファレンス/register post type
関数リファレンス/register taxonomy

タームの取得方法

get_terms()で、タクソノミーに登録したタームの情報をすべて取得できます。
ターム一覧ページへのリンクURLが欲しい場合は、get_term_link()を使います。

$terms = get_terms('タクソノミー名');
foreach($terms as $term):

  echo $term->name;  //ターム名
  echo $term->slug;  //スラッグ
  echo $term->count; //件数

  //taxonomy.phpへのURL
  echo get_term_link($term);
  echo get_term_link($term->slug, 'タクソノミー名');

endforeach;

get_terms()は、デフォルトでは記事に登録されている件数が1件以上のタームのみを取得します。
0件の場合でも情報を取得したい場合はオプションを追加します。

$terms = get_terms('タクソノミー名', [
  'hide_empty' => false,
]);

また、デフォルトでは名前順で情報を取得しますが、他のルールでソートさせるオプションもあります。

$terms = get_terms('タクソノミー名', [
  'orderby' => 'count', //件数順
]);

参考:
関数リファレンス/get terms
関数リファレンス/get term link

関連記事:
特定の記事に登録されたタームを取得する「get_the_terms」の紹介はこちら。
[WordPress] 記事に紐づいたタクソノミー・タームを表示する

実装サンプル

基本のリンクつきリスト

<?php
$terms = get_terms('タクソノミー名');
foreach($terms as $term):
?>
<a href="<?php echo get_term_link($term); ?>">
  <?php echo $term->name; ?>
</a><br>
<?php
endforeach;
?>

リンクつきリスト+件数表示(0件でも表示)

表示例:
カテゴリA (0)
カテゴリB (5)
カテゴリC (2)
<?php
$terms = get_terms('タクソノミー名', ['hide_empty'=>false]);
foreach($terms as $term):
?>
<a href="<?php echo get_term_link($term); ?>">
  <?php echo $term->name; ?>
  (<?php echo $term->count; ?>)
</a><br>
<?php
endforeach;
?>

カレント用のクラスを付ける(taxomony.php)

taxomony.php 系のテンプレートを表示しているときは、デフォルトで変数 $term に現在地となるタームのスラッグが入っています。これを利用して、カレント表示を作ることができます。

表示例:
カテゴリA ←クラス.is-active(太字スタイル)がついている
カテゴリB
カテゴリC
<?php
//taxomony.php では、変数 $term に表示中のタームスラッグが入っている
$allterms = get_terms('タクソノミー名');
foreach($allterms as $allterm):
?>
<a
href="<?php echo get_term_link($allterm); ?>"
class="<?php if($allterm->slug == $term){ echo ' class="is-active"'; } ?>"
>
  <?php echo $allterm->name; ?>
</a><br>
<?php
endforeach;
?>

親子関係を踏まえたリストを表示

表示例:
親カテゴリA ←クラス.is-parent(太字スタイル)がついている
子カテゴリA-1 ←クラス.is-childがついている
子カテゴリA-2
親カテゴリB
子カテゴリB-1
子カテゴリB-2
<?php
$terms_basic = get_terms('タクソノミー名');
$terms_custom = [];

// 親子関係を反映した新しい配列 $terms_custom を作成
if($terms_basic){
  foreach($terms_basic as $term){
    if($term->parent === 0){
      $terms_custom[] = $term;
    }
  }
  foreach($terms_custom as $key=>$val){
    $terms_custom[$key]->children = [];
    foreach($terms_basic as $term){
      if($val->term_id === $term->parent){
        $terms_custom[$key]->children[] = $term;
      }
    }
  }
}

// 表示
foreach($terms_custom as $term){
  echo '<span class="is-parent">'. $term->name .'</span><br>';
  foreach($term->children as $child){
    echo '<span class="is-child">'. $child->name .'</span><br>';
  }
}
?>