【WordPress】ループ内でカテゴリーの取得と表示

属するカテゴリをclass名としてつける

html

<article class="… … … カテゴリスラッグ1 カテゴリスラッグ2 … カテゴリスラッグn … … ">

上記のように投稿が属するカテゴリをすべてclassとしてつけたいとき

関数でつける

「<?php post_class(); ?>」を使えば、カテゴリー名に加えてタグや公開状態、postIDまでclassとして出力してくれるので便利。

PHP

<article <?php post_class(); ?>>

出力は「category-〇〇」というようにカテゴリースラッグの前に「category-」がつきます。

手動でつける

上記で「category-」をつけたくないとき、不要なclass名は付けたくないときは、下記。
その記事が所属するカテゴリーを全て取得してクラスとして付けます。

PHP

<article class="<?php $category = get_the_category();
                    if ($category) {
                         foreach ($category as $cat) {
                              if ($cat === end($category)) {
                                   echo $cat->category_nicename;
                              } else {
                                   echo $cat->category_nicename;
                                   echo ' ';
                              }
                         }
                    } ?>">

出力は「cate1 cate2 cate3」のようにスラッグのみになります。

属するカテゴリの親カテゴリを表示

第1階層のカテゴリを表示

たとえば下のようなカテゴリがあって、

映画
ー洋画
ーーアメリカ映画
ーーフランス映画
ー邦画
漫画
ー少女漫画
ー少年漫画

どのカテゴリを選んでも取得するのは「映画」や「漫画」の第1階層のカテゴリにしたい場合

カテゴリー1つのみ

取得した属するカテゴリ情報の、ひとつ目のカテゴリーについて第1階層を求めます。

PHP

<?php
//現カテゴリ取得
$cat = get_the_category();
$cat = $cat[0];
$cat_parent = $cat->parent;
$cat_id = $cat->cat_ID;
if ($cat_parent == 0) {
    $slug = $cat->slug;
} else {
    $ancestor = array_pop(get_ancestors($cat_id, 'category'));
    $slug = get_category($ancestor)->slug;
}
?>
array_pop(PHP)配列の最後の要素を取り除く(配列は1つ要素がなくなる)
get_ancestors(WordPress)指定されたオブジェクトの祖先オブジェクトの配列を取得

カテゴリーすべて

取得した属するカテゴリ情報のすべてのカテゴリーに対して第1階層を求めます。
…ので、同じ第1階層を持つカテゴリを複数選択しているとダブる…そのときは調整が必要。

PHP

<?php
$category = get_the_category(); //属するカテゴリを取得
if ($category) { //カテゴリが設定してある場合
    foreach ($category as $cat) { //それぞれのカテゴリーに対して
        $cat_parent = $cat->parent;
        $cat_id = $cat->cat_ID;
        if ($cat_parent == 0) { //第1階層のとき
            $slug = $cat->slug; //自身のスラッグ取得
        } else {
            $ancestor = array_pop(get_ancestors($cat_id, 'category')); //第1階層のカテゴリIDを取得
            $slug = get_category($ancestor)->slug; //第1階層のスラッグを取得
        }
    }
}
?>

第1階層の場合はそのまま、下層の場合は属する第1階層のカテゴリを取得しています。

get_the_category( $id ) で取得できるデータ

term_id(整数) カテゴリー ID
name(文字列) カテゴリー名
slug(文字列) カテゴリーのスラッグ
term_group(整数) カテゴリーのグループ
term_taxonomy_id(整数) カテゴリーのタクソノミー ID
taxonomy(文字列) タクソノミー名 'category'
description(文字列) カテゴリーの説明
parent(整数) 親カテゴリーの ID
count(整数) カテゴリーに登録されている投稿の数
object_id(整数) オブジェクト ID

ひとつ上のカテゴリを表示

下のようにカテゴリが2階層しかないときは

映画
ー洋画
ー邦画
漫画
ー少女漫画
ー少年漫画

こっちのほうが簡単そう

PHP

<?php
$category = get_the_category(); //属するカテゴリを取得
if ($category) { //カテゴリが設定してある場合
	foreach ($category as $cat) { //それぞれのカテゴリーに対して
		if ($cat->category_parent) { //親カテゴリがある場合(親カテゴリのIDがあるかどうか)
			$parent_cat = get_category($cat->category_parent);
			$name = $parent_cat->name; //親のカテゴリ名取得
			$slug = $parent_cat->slug; //親のスラッグ取得
		} else { //親カテゴリがない場合=自身が親の場合
			$name = $cat->name;  //自身のカテゴリ名取得
			$slug = $cat->slug;  //自身のスラッグ取得
		}
	}
}
?>