東京都府中市、九段下のWEB制作会社Maromaroのブログです

2016.06.20

hoshida

WordPressで親の親など祖先のカテゴリーを get_ancestors() で全部出力する

くっくっく…
たとえ私が倒れても第二第三のバグが現れてこの案件の平和ぐわああああぁぁぁぁグシャアァ!!
こんにちは。Maromaroのhoshidaです。

WordPressのサイトをカテゴリーで階層化した場合に、孫カテゴリーやひ孫カテゴリーのページに祖先のカテゴリー情報をまとめて出力する方法を紹介します。
get_ancestors() 関数で祖先のidを配列で取得できるので、こちらを使います。

今回はカテゴリー(タクソノミー)の出力方法で説明しますが、get_ancestors() 関数は第二引数に投稿タイプを指定すると、「固定ページ」などの階層型投稿の祖先idも取得できるので、固定ページで階層化したサイトのパンくずなども簡単に出力できます。

子孫ターム一覧ページで祖先タームを出力するコード

カテゴリーの一つ一つのキーワードのことを「ターム」と呼びます。以下のコードで、祖先のターム情報を出力できます。

//現在のタームのidを取得
$term_id = get_queried_object()->term_id;

//祖先タームのidを取得
$ancestors = get_ancestors( $term_id, 'my_taxonomy' );

//get_ancestors()は孫から親への順番で配列になるので、順番を入れ替える
$reversed_ancestors = array_reverse($ancestors); 

//情報の出力
foreach($reversed_ancestors as $ancestor){ //foreach文で祖先タームごとに情報を出力
  echo get_term($ancestor)->name; //ターム名
  echo get_term($ancestor)->slug; //タームのスラッグ
  echo get_term_link($ancestor);  //タームのリンク
  //get_ancestors()では祖先タームのidが取得できるので、idで取得できるものなら上の三つ以外にも持ってこれます。
}

「my_taxonomy」を任意のタクソノミースラッグにしてくださいね。

パンくずリストを出力するなら出力のところが以下のような感じになるでしょうか。


<?php $reversed_ancestors = array_reverse($ancestors); ?>
<ul>
  <li><a href="/">トップページ</a></li>
  <?php
    if($ancestors){ foreach($reversed_ancestors as $ancestor){
      echo '<li><a href="'.get_term($ancestor)->name.'">'.get_term($ancestor)->slug.'</a><li>' ;
    } }
  ?>
  <li><?php echo get_queried_object()->name; ?></li>
</ul>

これで祖先タームの分だけトップページと現在のページの間に情報の入った「li」が出力されます。
get_ancestors() 関数で取得できる祖先idには現在のタームは含まれないので、パンくずリストにするときは現在のタームも別途出力してあげるのをお忘れなく。

子孫タームが指定されている投稿ページで祖先タームを出力するコード

ターム一覧でなく、タームが指定されている投稿ページで祖先タームを取得したい場合は以下のようなになります。タームidの取得の仕方が変わります。

//投稿についているタームのidを取得
$terms = wp_get_object_terms( $post->ID, 'my_taxonomy');
$term_id = $terms[0]->term_id;

//以下はターム一覧ページの場合と同じ
$$ancestors = get_ancestors( $term_id, 'my_taxonomy' );

$reversed_ancestors = array_reverse($ancestors); 

foreach($reversed_ancestors as $ancestor){
  echo get_term($ancestor)->name;
  echo get_term($ancestor)->slug;
  echo get_term_link($ancestor);
}

なお、複数のタームが投稿についている場合は要注意です。

仮に階層の浅いタクソノミーやページでも、将来的に階層が深くなることを考えて親単体の情報でなく祖先の配列の情報でパンくずなどを出力することをお勧めします。

ではでは