タクソノミー使用時、一番下の階層のタームを取得する方法
親子関係にある多階層のタームが設定されている場合、その一番下層にあるタームの情報を取得するのはなかなか考えさせられます。
例えば次のような階層構造での状況です。
<タクソノミーの階層構造>
□東京
└□23区
└□新宿区
※実際は他にも多くの地域が登録されているとします。
<状況>
- 基本的には「東京」「23区」「新宿」のように各階層にひとつずつチェックが入っている
- しかし新宿区の階層だけチェックが入っていない場合もある
- チェックが入っているタームの中で一番子孫にあたるターム情報だけ取得したい(新宿区にチェックが入っていないければ「23区」を取得)
上記の状況で、「個別ページ」において、現在表示されている投稿が属しているタームのうち、一番下層のターム情報を取得する際のコードは以下です。
$taxonomy = 'example-cat';
$terms = get_the_terms($post->ID, $taxonomy);
$ancestor_maxnum = 0;
foreach($terms as $term){
$dep = count(get_ancestors($term->term_id, $taxonomy));
if($dep >= $ancestor_maxnum){
$ancestor_maxnum = $depth;
$current_term = $term;
}
}
詳しい解説
$taxonomy = 'example-cat';
取得したいタクソノミーのタクソノミー名を予め変数に格納しておきます。
$terms = get_the_terms($post->ID, 'result-cat');
get_terms()という似たような関数があるが、これはどこのテンプレートからも使用できる汎用的な関数のイメージ。今回は個別ページから今の投稿が属しているタームの情報を得たいのでget_the_terms()ではなくget_terms()を使用する。これはIDの指定が必須で、自分のIDを指定する。
$ancestor_maxnum = 0;
この変数にタームの祖先が何台上まであるか格納する予定なので、まずは0としておきます。
foreach($terms as $term)
get_the_terms()で取得したタームは「名前順に」$termsに格納されています。決して一番先祖にあたるタームから並ぶわけではないのです。
echo ‘<pre>’;
print_r($terms);
echo ‘</pre>’;
試しに$terms = get_the_terms($post->ID, $taxonomy);の後に上記のコードを入れてみると一発でわかります。