【WordPress】子孫カスタムタクソノミーの一覧をつくる

深いカテゴリ階層を順番にたどっていけるアーカイブページが欲しい

  • 親カテ1
    • 子カテ1
      • 孫カテ1
      • 孫カテ2
    • 子カテ2
      • 孫カテ3
      • 孫カテ4
    • 子カテ3
      • 孫カテ5
  • 親カテ2
    • 子カテ4
      • 孫カテ6
      • 孫カテ7
    • 子カテ5
      • 孫カテ8

こんなカテゴリ(実際にはタクソノミー)階層だった場合に、

  • 投稿トップには「親カテ1」「親カテ2」のリンク
  • 「親カテ1」を押すとその先には「子カテ1」「子カテ2」「子カテ3」のリンク
  • 「子カテ1」を押したその先には「孫カテ1」「孫カテ2」のリンク

というように、カテゴリ(タクソノミー)の階層を順番にたどっていけるアーカイブページが必要になりました。

今開いているタームの直接の子タームだけを表示

taxonomy-タクソノミー名.phpのためのコード

<nav class="category-navigation">
    <ul>
        <?php
        $term_id = get_queried_object_id();// 今開いているタームのID
        $taxonomy_name = 'cat_product';// ターム名
        //$termchildren = get_term_children($term_id, $taxonomy_name);
        $terms = get_terms($taxonomy_name, array(// 親が今開いているタームのIDのやつだけ出す書き方
            'parent' => $term_id,// 今開いているタームのID
            'hide_empty' => true,
            'orderby' => 'term_order',
        ));
        foreach ($terms as $term) :?>
            <li><span><a href="<?php echo get_term_link( $term ); ?>"><?php echo $term->name; ?></a></span></li>
        <?php endforeach; ?>
    </ul>
</nav>

 

孫タームの時、ページ名として親タームまで表示させたい

taxonomy-タクソノミー名.phpのためのコード

親タームがあれば、「親 | 子 | 孫」という形でテキストが出力される。

<?php
//現在のタームのidを取得
$term_id = get_queried_object()->term_id;
//祖先タームのidを取得
$ancestors = get_ancestors( $term_id, 'cat_product' );
//get_ancestors()は孫から親への順番で配列になるので、順番を入れ替える
$reversed_ancestors = array_reverse($ancestors); ?>
<h2 class="pagetitle">
    <?php
    if($ancestors){ foreach($reversed_ancestors as $ancestor){
        echo '<span>'.get_term($ancestor)->name.' | </span>' ;
    } }
    ?>
    <span><?php echo get_queried_object()->name; ?></span>
</h2>

 

おまけ:孫タクソノミー一覧が欲しい

必要なものが孫タクソノミー一覧だった時のためのコード。

親・子・孫それぞれforeach分でループしているけれども、echoで出力しているのが孫だけなので孫だけの一覧になるという冗長なコード。

親だけの出力を書けば親だけの一覧もできる。

<nav class="category-navigation">
    <ul>
        <?php // WordPress タームの親・子・孫の一覧に孫タームの投稿一覧を表示
        $taxonomy_slug = 'cat_product'; // タクソノミースラッグを指定
        $parents = get_terms($taxonomy_slug,'parent=0&hide_empty=1&include='.$term_object->term_id); // 親のいないタームを取り出します、つまり親
        foreach ( $parents as $parent ) { // 親タームのループを開始
            //何も表示せずに次のループループへ
            $children = get_terms($taxonomy_slug,'hierarchical=0&hide_empty=1&parent='.$parent->term_id);
            foreach ( $children as $child ) { // 子タームのループを開始
                //何も表示せずに次のループへ
                $grands = get_terms($taxonomy_slug,'hierarchical=0&hide_empty=1&parent='.$child->term_id);
                foreach ( $grands  as $grandson ) { // 孫タームのループを開始
                  echo '<li><a href="'.get_term_link($grandson).'">'.esc_html($grandson->name).'</a></li>'; // 孫タームのタイトルを表示
                <?php } // 孫ターム終了 ?>
            <?php } // 子ターム終了 ?>
        <?php } // 親ターム終了 ?>
    </ul>
</nav>