wordpress:親カテゴリ、最上位カテゴリを取得する
wordpressでWEBサイトを作成していると、親カテゴリとか最上位カテゴリを取得する必要が出てきたります。
親カテゴリによって分岐したり、最上位カテゴリでデザイン変えたりと。
そんな時に使える方法を書いていますのでよろしければご参考まで。
カテゴリーアーカイブ(category.php)
カテゴリーアーカイブでの取得方法です。
カテゴリ構成はこのようにしています。
BLOG > アニメ > SF
※例は3階層目の「SF」ページでの結果です。
親カテゴリを取得する
カテゴリーアーカイブではwp_queryの「queried_object」にカテゴリ情報セットされています。
その情報は「get_queried_object()」という関数で取得できます。
$category = get_queried_object(); print_r( $category ); //結果 WP_Term Object ( [term_id] => 16 [name] => SF [slug] => sf [term_group] => 0 [term_taxonomy_id] => 16 [taxonomy] => category [description] => [parent] => 14 [count] => 1 [filter] => raw [cat_ID] => 16 [category_count] => 1 [category_description] => [cat_name] => SF [category_nicename] => sf [category_parent] => 14 )
親カテゴリですので、その中の「category_parent」を取り出してやればOKです。
あとは「get_category()」でそのカテゴリー情報を取得し必要なものだけ出力してやれば完了です。
$category = get_queried_object(); $parentid = $category->category_parent; $parent = get_category( $parentid ); print_r( $parent ); //結果 WP_Term Object ( [term_id] => 14 [name] => アニメ [slug] => anime [term_group] => 0 [term_taxonomy_id] => 14 [taxonomy] => category [description] => [parent] => 10 [count] => 2 [filter] => raw [cat_ID] => 14 [category_count] => 2 [category_description] => [cat_name] => アニメ [category_nicename] => anime [category_parent] => 10 ) //カテゴリ名の出力 echo esc_html( $parent->name );
最上位カテゴリを取得する
最上位カテゴリを取得する場合はwordpressで用意されている関数、「get_category_parents()」を使用します。
テンプレートタグ/get category parents – WordPress Codex 日本語版
まずget_query_var()で現在のカテゴリを取得してそのIDを元に最上位カテゴリを取得します。
$catid = get_query_var( 'cat' ); $parents = get_category_parents( $catid ); print_r( $parents ); //結果 BLOG/アニメ/SF/
get_category_parents()には引数が設定でき、リンク付きで返したりも出来ます。パンくず作る時とかに便利ですね。
今回は最上位カテゴリの取得なので下記のようにします。
$catid = get_query_var( 'cat' ); $parents = get_category_parents( $catid, false, ',', true); $parents = explode( ',', $parents ); $root = get_category_by_slug( $parents[0] ); print_r( $root ); //結果 WP_Term Object ( [term_id] => 10 [name] => BLOG [slug] => blog [term_group] => 0 [term_taxonomy_id] => 10 [taxonomy] => category [description] => [parent] => 0 [count] => 2 [filter] => raw [cat_ID] => 10 [category_count] => 2 [category_description] => [cat_name] => BLOG [category_nicename] => blog [category_parent] => 0 ) //カテゴリ名の出力 echo esc_html( $root->name );
- get_category_parents( $catid, false, ‘,’, true);
引数はこのようになっています。
現在のカテゴリー,リンク無し,区切りは半角カンマ,スラッグで取得 - explode( ‘,’, $parents );
get_category_parentsで帰ってくるのはカンマ区切りの文字列なのでそれを配列に変換してやります。 - get_category_by_slug( $parents[0] );
スラッグからカテゴリー情報を取得します。$parents[0]で一番上の、つまり最上位カテゴリということになります。
記事詳細(single.php)
詳細ページでの取得方法です。
カテゴリーはこのようにチェックしています。
※複数カテゴリーにチェックしている場合は下記方法ではうまく取得できない可能性があります。
記載している内容は1記事1カテゴリーでの取得・表示になります。
親カテゴリを取得する
まずは現在のカテゴリを取得します。
取得するには「get_the_category()」を使用します。
$cats = get_the_category(); $category = $cats[0]; print_r( $category ); //結果 WP_Term Object ( [term_id] => 16 [name] => SF [slug] => sf [term_group] => 0 [term_taxonomy_id] => 16 [taxonomy] => category [description] => [parent] => 14 [count] => 1 [filter] => raw [object_id] => 246 [cat_ID] => 16 [category_count] => 1 [category_description] => [cat_name] => SF [category_nicename] => sf [category_parent] => 14 )
wordpressは複数カテゴリーを選択できる設計になっているのでget_the_categoryで返ってくるカテゴリーは1つであっても配列になっています。
ですので$cats[0]で1番めのカテゴリーを抜き出してやります。
※複数のカテゴリにチェックを入れている場合にうまくいかないのは0番目に必ずしも最下層のカテゴリが来るわけではないということです。
これで$categoryに属しているカテゴリ情報が入っていますのでそのなかの「category_parent」が親カテゴリーのIDになります。
$cats = get_the_category(); $category = $cats[0]; $parent = get_category( $category->category_parent ); print_r( $parent ); //結果 WP_Term Object ( [term_id] => 14 [name] => アニメ [slug] => anime [term_group] => 0 [term_taxonomy_id] => 14 [taxonomy] => category [description] => [parent] => 10 [count] => 2 [filter] => raw [cat_ID] => 14 [category_count] => 2 [category_description] => [cat_name] => アニメ [category_nicename] => anime [category_parent] => 10 ) //カテゴリ名の出力 echo esc_html( $parent->name );
最上位カテゴリを取得する
最上位カテゴリの取得はアーカイブページと同様「get_category_parents()」を使用します。
やり方は一緒なので最上位カテゴリを取得する(カテゴリーアーカイブ)を御覧ください。
親カテゴリ取得時と同様、まず属しているカテゴリを取得してから最上位カテゴリを取得します。
$cats = get_the_category(); $category = $cats[0]; $parents = get_category_parents( $category->term_id, false, ',', true); $parents = explode( ',', $parents ); $root = get_category_by_slug( $parents[0] ); print_r( $root ); //結果 WP_Term Object ( [term_id] => 10 [name] => BLOG [slug] => blog [term_group] => 0 [term_taxonomy_id] => 10 [taxonomy] => category [description] => [parent] => 0 [count] => 2 [filter] => raw [cat_ID] => 10 [category_count] => 2 [category_description] => [cat_name] => BLOG [category_nicename] => blog [category_parent] => 0 ) //カテゴリ名の出力 echo esc_html( $root->name );
いかがでしたでしょうか?
少ないカテゴリーであればis_categoryやin_categoryで分岐を書いてもいいかと思うんですが、多くなってくるとそういうわけにもいかないと思うのでこういう方法が必要になってくるかなと。
複雑なカテゴリ構成だとterm_metaに予め階層を入れておいたり、記事更新の際にカテゴリーツリーをカスタムフィールドで入れておくとかすると取り出しも楽になるのでそっちの方がおすすめですかねー。
固定ページの親・最上階層ページについても書いてますのでよろしければどうぞ。