ど素人から毛を生やす。<延>

最上位カテゴリを取得したい件

Web > WordPress > カテゴリー 2014年10月6日(最終更新:10年以上前)

2014年10月6日に作成されたページです。
情報が古かったり、僕が今以上のど素人だった頃の記事だったりする可能性があります。

どもです。
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を選別しても良いでしょう。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (`・ω・´) 役に立った (0)
  • (・∀・) 参考になった (1)