【WordPress】混乱しやすいget_categoryとget_the_categoryの違いと使い分け方

※当ブログのリンクには一部広告が含まれています。

先日、カスタム投稿タイプのタクソノミーやターム関連のテンプレートタグや関数について書きましたが、WordPressのカテゴリー関連のタグ・関数もたくさんありますよね。

恐らくカスタム投稿よりカテゴリーの方が使用頻度は高いと思うので、カテゴリーで紛らわしいget_categoryget_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なら投稿タイプ、が取得できます。

上記は「カテゴリーアーカイブページ(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];
}
?>