WordPressのカスタム投稿で、特定の子タームに属する子孫タームだけ取り出す方法
WordPressのカスタム投稿で、特定の子タームに属する子孫タームだけ取り出す方法
今回、株式会社ジェイプロさんのwebサイトのコーディングを担当いたしました。
CMSは、もちろんWordPressです。
- URL
その際、今回のサイトが下記の形の投稿スタイルになります。
投稿の概要
-
投稿タイプ
- information
-
カスタム投稿
-
works(タクソノミー名、親ターム)
- PROJECT PRODUCE(タクソノミー名、子ターム)
- 子孫ターム
- 子孫ターム
- CREATIVE CONTENTS(タクソノミー名、子ターム)
- 子孫ターム
- 子孫ターム
- PROJECT PRODUCE(タクソノミー名、子ターム)
-
works(タクソノミー名、親ターム)
今回やりたい事
その際、特定の子タームの子孫タームだけforeachを使ってget_category_linkで表示させたいのが主な目的です。
つまり、PROJECT PRODUCEに属する子孫タームだけ取り出したい。
または、CREATIVE CONTENTSに属する子孫タームだけ取り出したい。
実装方法
今回、案件で使ったコードをそのまま載せられないので、変数含め仮名で記載します。
カスタム投稿の概要
- カスタム投稿
-
football
- イングランドのプレミアリーグ(タクソノミー名、子ターム)
- アーセナル (子孫ターム)
- リバプール (子孫ターム)
- マンチェスターシティ (子孫ターム)
- イタリアのセリエA(タクソノミー、子ターム)
- ACミラン (子孫ターム)
- インテルミラノ (子孫ターム)
- ナポリ (子孫ターム)
- イングランドのプレミアリーグ(タクソノミー名、子ターム)
-
football
海外のサッカーリーグのイングランドのプレミアリーグ、イタリアのセリエAに所属するチーム毎に、子孫タームが増えていく設定です。
<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
<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>
ポイントは
- (int) get_queried_object_id();を使う
これは現在表示されているタクソノミーオブジェクトを取得し、$term_idに代入します。
$term_id = (int) get_queried_object_id();
- ($premier === $premier) ? $premier : $seriea;を使って条件分岐を行う
premierが同じ型である場合、$slugsに代入します。
$slugs = ($premier === $premier) ? $premier : $seriea;
- get_termsを使って、タームの一覧を表示させる
第一引数に$taxonomy_name、第二引数にarray('slug' => $slugs)を入れる。
$terms = get_terms( $taxonomy_name, array('slug' => $slugs));
- get_categoriesに、'parent' => $termparentを入れる
上記URLのパラメータの初期値にもありますが
<?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を入れてしまえばいいのです!
$term = $terms[0];
$termparent = $term->term_id; // IDを取得する
$args = array(
'parent' => $termparent,
);
$categories = get_categories($args);
おまけ
上記の記事にもありますが、
タクソノミーオブジェクトを取得してタクソノミーが子孫関係か調べて、子孫タームを割り当てる事ができます。
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