💻

WordPressのカスタム投稿で、特定の子タームに属する子孫タームだけ取り出す方法

2023/01/21に公開

WordPressのカスタム投稿で、特定の子タームに属する子孫タームだけ取り出す方法

今回、株式会社ジェイプロさんのwebサイトのコーディングを担当いたしました。
CMSは、もちろんWordPressです。

  • URL

その際、今回のサイトが下記の形の投稿スタイルになります。

投稿の概要

  • 投稿タイプ

    • information
  • カスタム投稿

    • works(タクソノミー名、親ターム)
      • PROJECT PRODUCE(タクソノミー名、子ターム)
        • 子孫ターム
        • 子孫ターム
      • CREATIVE CONTENTS(タクソノミー名、子ターム)
        • 子孫ターム
        • 子孫ターム
           

今回やりたい事

その際、特定の子タームの子孫タームだけforeachを使ってget_category_linkで表示させたいのが主な目的です。

つまり、PROJECT PRODUCEに属する子孫タームだけ取り出したい。
または、CREATIVE CONTENTSに属する子孫タームだけ取り出したい。
 

実装方法

今回、案件で使ったコードをそのまま載せられないので、変数含め仮名で記載します。

カスタム投稿の概要

  • カスタム投稿
    • football
      • イングランドのプレミアリーグ(タクソノミー名、子ターム)
        • アーセナル (子孫ターム)
        • リバプール (子孫ターム)
        • マンチェスターシティ (子孫ターム)
      • イタリアのセリエA(タクソノミー、子ターム)
        • ACミラン (子孫ターム)
        • インテルミラノ (子孫ターム)
        • ナポリ (子孫ターム)

海外のサッカーリーグのイングランドのプレミアリーグ、イタリアのセリエAに所属するチーム毎に、子孫タームが増えていく設定です。
 

sample1.php

<ul>
    <?php
        $taxonomy_name = 'football'; // 親タクソノミー名
        $premier = 'premier'; // 子タクソノミー名
        $seriea = 'seriea'; // 子タクソノミー名
        $term_id = (int) get_queried_object_id();

        // イングランドのプレミアリーグを出したい時
        $slugs = $premier;

        // ちなみにイタリアのセリエAを出したい時
        // $slugs = $seriea;

        $terms = get_terms( $taxonomy_name, array('slug' => $slugs));
        $term = $terms[0];
        $termparent = $term->term_id;
        $args = array(
            'taxonomy' => $taxonomy_name,
            'parent' => $termparent, 
        );
        $categories = get_categories($args);
        foreach($categories as $category) {
            echo '<li><a href="'.get_category_link($category->term_id).'">'.$category->name.'</a></li>';
        }
    ?>
</ul>

生成されるHTML

sample2.php

    <ul>
        <li><a href="https://dummy/football/premier/arsenal/">アーセナル</a></li>
        <li><a href="https://dummy/football/premier/liverpool/">リバプール</a></li>
        <li><a href="https://dummy/football/premier/manchestercity/">マンチェスターシティ</a></li>
    </ul>

 

ポイントは

  1. (int) get_queried_object_id();を使う

これは現在表示されているタクソノミーオブジェクトを取得し、$term_idに代入します。

sample.php
    $term_id = (int) get_queried_object_id();

 

  1. ($premier === $premier) ? $premier : $seriea;を使って条件分岐を行う

premierが同じ型である場合、$slugsに代入します。

sample.php
    $slugs = ($premier === $premier) ? $premier : $seriea;

 

  1. get_termsを使って、タームの一覧を表示させる

第一引数に$taxonomy_name、第二引数にarray('slug' => $slugs)を入れる。

sample.php
    $terms = get_terms( $taxonomy_name, array('slug' => $slugs));

 

  1. get_categoriesに、'parent' => $termparentを入れる

上記URLのパラメータの初期値にもありますが

sample.php

<?php 
    $args = array(
        'type'          => 'post',
        'child_of'      => 0,
        'parent'        => '',
        'orderby'       => 'name',
        'order'         => 'ASC',
        'hide_empty'    => 1,
        'hierarchical'  => 1,
        'exclude'       => '',
        'include'       => '',
        'number'        => '',
        'taxonomy'      => 'category',
        'pad_counts'    => false 
    ); 
?>

parent
(整数) カテゴリー ID で指定されたカテゴリーの直接の子カテゴリーのみを取得します。
このパラメータは 'child_of' パラメータと同じように動作するものではありません。
このパラメータには初期値はありません。

 

つまり、直接の子孫タームのみを取得する 'parent' => '',に、$termsで取得したIDを入れてしまえばいいのです!

 

sample.php

    $term = $terms[0];
    $termparent = $term->term_id; // IDを取得する
    $args = array(
        'parent' => $termparent, 
    );
    $categories = get_categories($args);

 

おまけ

上記の記事にもありますが、
タクソノミーオブジェクトを取得してタクソノミーが子孫関係か調べて、子孫タームを割り当てる事ができます。

sample.php

if( term_is_ancestor_of( 親のタクソノミーID, $term_id, 'タクソノミー名' ) )

しかし、親のタクソノミーIDを動的に取り出す必要があります。
なぜなら、ローカル環境、テスト環境、本番環境とIDが変わる可能性があるため。
動的に取り出す場合、あまりうまく実装できず再度チャレンジはしたい。
 

まとめ

今回、特定の子タームに属する子孫タームだけ取り出す方法ですが、
タームの概念やタクソノミーの概念含め、正直かなりややこしかったです。
get_queried_object_id();とget_categoriesに助けられた感じでした。

参考記事

  • 「指定の親に含まれる子タクソノミー」で条件分岐する方法|WordPress
  • get_queried_object_id() | Function | WordPress Developer Resources
  • 関数リファレンス/get categories

Discussion