【WordPress】混乱しやすいget_categoryとget_the_categoryの違いと使い分け方
※当ブログのリンクには一部広告が含まれています。
先日、カスタム投稿タイプのタクソノミーやターム関連のテンプレートタグや関数について書きましたが、WordPressのカテゴリー関連のタグ・関数もたくさんありますよね。
恐らくカスタム投稿よりカテゴリーの方が使用頻度は高いと思うので、カテゴリーで紛らわしいget_category
とget_the_category
について解説します。
get_category
カテゴリーIDかカテゴリーオブジェクトを指定して、カテゴリーの情報を取得します。
<?php get_category( $category, $output, $filter ) ?>
パラメーター
- $category
- (整数|オブジェクト)(必須):カテゴリー ID またはカテゴリー行オブジェクト
- $output
- (文字列)(オプション):定数 OBJECT, ARRAY_A または ARRAY_N
- $filter
- (文字列)(オプション):デフォルト(’raw’)では WordPress が予め定義したフィルターはどれも適用されません。
戻り値
カテゴリーアーカイブページcategory.phpにて、カテゴリー「お知らせ(news)」を表示している時の値です。
object(stdClass)#3343 (16) { ["term_id"]=> &int(31) ["name"]=> &string(12) "お知らせ" ["slug"]=> &string(4) "news" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(31) ["taxonomy"]=> string(8) "category" ["description"]=> &string(0) "" ["parent"]=> &int(0) ["count"]=> &int(1) ["filter"]=> string(3) "raw" ["cat_ID"]=> &int(31) ["category_count"]=> &int(1) ["category_description"]=> &string(0) "" ["cat_name"]=> &string(12) "お知らせ" ["category_nicename"]=> &string(4) "news" ["category_parent"]=> &int(0) }
サンプルコード
<?php //現在表示されているカテゴリーアーカイブページのカテゴリー情報を取得 $cat = get_category($cat); //上記カテゴリーのスラッグを取得→出力 $catSlug = $cat->slug; echo '$catSlug'; //上記カテゴリーの名前を取得→出力 $catName = $cat->name; echo '$catName'; ?>
カテゴリーアーカイブページ(category.php)では、変数$catには現在表示されているカテゴリーのIDが自動的に入ります。便利!
また、以下のような書き方もあります。
<?php //現在表示されているカテゴリーアーカイブページのカテゴリーIDを取得 $catId = get_query_var('cat'); //上記で取得したカテゴリーIDを代入してカテゴリー情報を取得 $cat = get_category( $catId, false ); ?>
ここで「get_query_var(‘cat’); 」という気になる関数が出てきました。
get_query_var($var)とは、「グローバル $wp_query オブジェクトの WP_Query クラス内の public query variableを取得する」関数で、現在表示されているページの$wp_queryに入っている値を取り出すことができるようですが、catならカテゴリーID、post_typeなら投稿タイプ、が取得できます。
get_query_var($var)ってなんだ?(「WordPressのカテゴリ判定について」より)
上記は「カテゴリーアーカイブページ(category.php)」でカテゴリー情報を取得し出力するための方法でしたが、投稿記事(single.php)が属するカテゴリー情報を取得するためには以下の「get_the_category」というテンプレートタグを使用します。
get_the_category
現在の投稿が属するカテゴリーの情報をオブジェクトの配列で返します。パラメータとして投稿 ID を渡すことで、ループの外でも使うことができます。
<?php get_the_category( $id ); ?>
パラメーター
- $id
- (整数)(オプション):投稿 ID。
初期値: $post->ID (現在の投稿の ID)
戻り値
「webデザイン」と「本」という2つのカテゴリーに属する投稿記事(single.php)でカテゴリー情報を取得した場合。
array(2) { //配列1つめ [0]=> object(stdClass)#3275 (17) { ["term_id"]=> &int(16) ["name"]=> &string(15) "Webデザイン" ["slug"]=> &string(9) "webdesign" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(16) ["taxonomy"]=> string(8) "category" ["description"]=> &string(0) "" ["parent"]=> &int(0) ["count"]=> &int(7) ["object_id"]=> int(742) ["filter"]=> string(3) "raw" ["cat_ID"]=> &int(16) ["category_count"]=> &int(7) ["category_description"]=> &string(0) "" ["cat_name"]=> &string(15) "Webデザイン" ["category_nicename"]=> &string(9) "webdesign" ["category_parent"]=> &int(0) } //配列2つ目 [1]=> object(stdClass)#3277 (17) { ["term_id"]=> &int(37) ["name"]=> &string(3) "本" ["slug"]=> &string(5) "books" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(37) ["taxonomy"]=> string(8) "category" ["description"]=> &string(0) "" ["parent"]=> &int(0) ["count"]=> &int(2) ["object_id"]=> int(742) ["filter"]=> string(3) "raw" ["cat_ID"]=> &int(37) ["category_count"]=> &int(2) ["category_description"]=> &string(0) "" ["cat_name"]=> &string(3) "本" ["category_nicename"]=> &string(5) "books" ["category_parent"]=> &int(0) } }
サンプルコード
先頭のカテゴリーの名前を表示させます。上記の戻り値のサンプルだと、一番先頭のカテゴリは[0]の「Webデザイン」なので、「Webデザイン」と表示されます。
<?php $category = get_the_category(); echo $category[0]->cat_name; ?>
ループの外で投稿のカテゴリーを取得する場合
<?php global $post; $categories = get_the_category( $post->ID ); ?>
まとめ
というわけで、ページの種類によって使用する関数も変わることが分かりました。簡単に言うと、category.phpではget_category、single.phpではget_the_category(状況に応じてget_categoryも)を使う、ということでしょうか?
こちらのページに書かれているように、この2つのタグを条件分岐でひとつの変数にまとめると楽そうです。
//カテゴリーアーカイブページが表示されていたら if(is_category()){ $cat = get_category(get_query_var('cat'),false); //投稿ページが表示されていたら } elseif(is_single()) { $cat = get_the_category(); $cat = $cat[0]; } ?>