どもです。
WordPressが複雑に階層化すると、最上位カテゴリを取得する必要性が出てくることがあります。
functions.phpに関数を記載する方法はいくつかありますが、テンプレート内で済ませたいことが多いのでその方法をば。
category.php
$cat_id = get_query_var('cat');
if( !$cat_id ){
$cat_now = get_the_category();
$cat_now = $cat_now[0];
$cat_id = $cat_now->cat_ID;
}
$cat_parent = get_category($cat_id);
for($i = 1; $i <= 100; $i++){
if($cat_parent -> category_parent == 0){
break;
}
$cat_parent = $cat_parent -> category_parent;
$cat_parent = get_category($cat_parent);
}
single.php
$cat = get_the_category();
$cat_now = $cat[0];
$cat_id = $cat_now->cat_ID;
$cat_parent = get_category($cat_id);
for($i = 1; $i <= 100; $i++){
if($cat_parent -> category_parent == 0){
break;
}
$cat_parent = $cat_parent -> category_parent;
$cat_parent = get_category($cat_parent);
}
仕組みは結構シンプルで、
$cat_parent = $cat_parent -> category_parent; ←カテゴリの親IDを取得
$cat_parent = get_category($cat_parent); ←IDからカテゴリ情報を取得
した上で、
if($cat_parent -> category_parent == 0){ ←親カテゴリが存在しないなら
break; ←ループを脱出する
}
という仕組みになっています。
実際のソースではifが上に有りますが、現在のカテゴリが最上位カテゴリだった場合のためです。
ループには、何らかのアクシデントにより無限ループに陥ることを防ぐため、最大値100を設定。
流石に100階層以上のカテゴリはありえまい^^;
つまるところ$cat_idの内容を現在のカテゴリのIDにできればおkということです。
が、やっぱりカスタム投稿だと少し仕様が違うようで。
single-coustom.php
$cat = get_the_terms($post->id, 'タクソノミー名');
foreach($cat as $cat_now){
$cat_id = $cat_now->term_id;
break;
}
$cat_parent = get_term($cat_id, 'タクソノミー名');
for($i = 1; $i <= 100; $i++){
if($cat_parent -> parent == 0){
break;
}
$cat_parent = $cat_parent -> parent;
$cat_parent = get_term($cat_parent, 'タクソノミー名');
}
get_the_category()やget_category()の代わりにget_the_terms()とget_term()を使います。
get_the_terms()で取得した配列は[0]で先頭を取得することができないので、foreachでループすると見せかけて初回でループから脱出します。
このforeach内でbreakを使わず、if文を用いて取得する$cat_idを選別しても良いでしょう。