ミギムキ

[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です。