[WordPress] タクソノミーの親→子→孫タームを順番に取得したい
タクソノミーに階層構造を持たせたときに、親→子→孫の順にリンクを表示するためのサンプルコードを紹介します。
タクソノミーアーカイブページ内で取得する場合
<?php
$taxonomy_slug = $taxonomy;
$parent_id = get_queried_object_id();
// 子供のタームリストを取得(孫は取得しない)
$childs = get_terms($taxonomy_slug, array('parent' => $parent_id));
if(!empty($childs) && !is_wp_error($childs)) {
echo '<ul>';
foreach($childs as $child) {
// リンクテキストを表示
$child_link = get_term_link($child, $taxonomy_slug);
echo '<li><a href="'. $child_link .'">'. $child->name .'</a></li>';
// 孫のタームリストを取得
$grand_childs = get_terms($taxonomy_slug, array('parent' => $child->term_id));
if(!empty($grand_childs) && !is_wp_error($grand_childs)) {
echo '<ul>';
foreach($grand_childs as $grand_child) {
// リンクテキストを表示
$grand_child_link = get_term_link($grand_child, $taxonomy_slug);
echo '<li><a href="'. $grand_child_link .'">'. $grand_child->name .'</a></li>';
}
echo '</ul>';
}
}
echo '</ul>';
}
?>
「get_terms」関数のパラメータとして「parent」に親のタームIDを指定することで、その親の子にあたるターム(孫やひ孫を含まない)だけを取得することができます。
タクソノミーアーカイブページでは、グローバル変数「$taxonomy」にタクソノミーのスラッグが設定されているため、この値を参照してスラッグ名を意識せずに「get_terms」が実行できます。
取得したタームリストをforeachで取り出し、再度「get_term_link」関数を実行することで、孫のタームリストを取得しています。
入れ子になったループでリンクテキストを出力することで、子供、孫の一覧を順番に表示しています。
アーカイブページ以外で取得する場合
<?php
$taxonomy_slug = 'tax_xxx';
$parent_slug = 'tm_yyy';
$parent_id = get_terms($taxonomy_slug, array('slug' => $parent_slug))[0]->term_id;
// 子供のタームリストを取得(孫は取得しない)
$childs = get_terms($taxonomy_slug, array('parent' => $parent_id));
if(!empty($childs) && !is_wp_error($childs)) {
echo '<ul>';
foreach($childs as $child) {
// リンクテキストを表示
$child_link = get_term_link($child, $taxonomy_slug);
echo '<li><a href="'. $child_link .'">'. $child->name .'</a></li>';
// 孫のタームリストを取得
$grand_childs = get_terms($taxonomy_slug, array('parent' => $child->term_id));
if(!empty($grand_childs) && !is_wp_error($grand_childs)) {
echo '<ul>';
foreach($grand_childs as $grand_child) {
// リンクテキストを表示
$grand_child_link = get_term_link($grand_child, $taxonomy_slug);
echo '<li><a href="'. $grand_child_link .'">'. $grand_child->name .'</a></li>';
}
echo '</ul>';
}
}
echo '</ul>';
}
?>
アーカイブページ以外で同様の処理を行う際は、タクソノミースラッグとタームスラッグを直接指定する形で使用します。
ご質問など受け付けています
記事の中でわかりにくかったところ、もっと知りたかったこと、間違っていることなど、何でもお気軽にご連絡ください。
ご連絡は下記フォームを利用いただくか、ツイッターアカウント@flat8migi宛てでもOKです。