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

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

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

このページは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)
  • (`・ω・´) 役に立った (0)