wordpressのget_the_categoryで親又は子カテゴリーのみ取得

wordpressに関するテンプレートタグのget_the_categoryとget_categoryについて述べたいと思います。両者はその文字列から似ているような印象を受けますが、使いどころが違います。あえて似ている点をあげれば、両者とも配列で入っているキーの文字列が同一であるというところです。また、前者は多次元配列になっています。

wordpressのget_the_category

このwordpress関数は親カテゴリーのみであれば、以下のように記述すればIDやタイトルを取り出せます。対象テンプレートは、投稿、固定ページ、カテゴリー、アーカイブなどです。しかし、子カテゴリーがある場合はそれを含めた多次元配列を形成し、添え字の[0]で取り出せない場合が出てきます。その場合、親や複数の子の内、いずれか一つが選択、もしくは表示されます。

通常の取得

$cats = get_the_category();
echo $cats[0]->cat_name;
echo $cats[0]->cat_ID;

親のみ取得

ループ内外で常に親カテゴリー情報を取得します。子であっても、親を出力します。以下の例ではタイトルを取得していますが、この関数の配列のキーを変えたり追加すれば、他の情報も取り出せます。配列情報は、後述していますので参考にして下さい。

$a = get_the_category();
foreach($a as $cats){
$name=$cats->name;
if($cats->parent==0){$c=$name;}
}
echo $c;

別の方法

上のコードと同じ結果になりますが、こちらはforeachを二度使って処理しています。

$cats = get_the_category();
foreach($cats as $val){
foreach($val as $key => $val2){
if($key=="name"){$name=$val2;}
if($key=="parent" && $val2==0){$c=$name;}
}
}
echo $c;

wordpressのget_category

カテゴリーとアーカイブのテンプレートでは、$catという変数に初めから現在いるカテゴリーのIDが入ります。この変数は投稿や固定ページでは使えません。

$catをこのwordpress関数の引数として記述すると、現在いるカテゴリーの情報を配列で返します。ただし、「$cat = get_the_category();」のようにテンプレート内でこのタグより先に記述しているとうまく動作しませんのでワードプレスが利用している変数は使わないようにしましょう。この例では、一番目のID情報が無条件に出力されるようです。同一ファイル内で他の値を代入しているケースでもおそらく同様でしょう。

この関数の使い道は、現在いるカテゴリーの情報をループ外で出力するだけと思われます。カテゴリーとアーカイブのワードプレステンプレートで動作します。アロー演算子の右側の文字列は、配列の左側のキーの部分ですので、必要に応じて変更して下さい。

echo get_category($cat)->name;

配列情報は以下のような感じになります。

WP_Term Object
(
[term_id] => 2
[name] => WordPress
[slug] => wordpress
[term_group] => 0
[term_taxonomy_id] => 2
[taxonomy] => category
[description] =>
[parent] => 0
[count] => 12
[filter] => raw
[term_order] => 2
[cat_ID] => 2
[category_count] => 12
[category_description] =>
[cat_name] => WordPress
[category_nicename] => wordpress
[category_parent] => 0
)

ループ内外で単純に現在のカテ情報を得たいだけなら、「get_queried_object()->name;」などで取得します。配列の内容は同じため、アロー演算子のあとに「term_id」や「slug」などと繋げます。ちなみにこの配列には、キーは違っても値が同じになるものが幾つかありますので、どちらを用いても構いません。ただ、foreachをかけて回す時は順番が違ってうまく取り出せない場合もありますので、先に処理するものは上から選んだほうが無難です。

echo get_queried_object()->name;

wordpressのwp_list_categories

以下は、親を除いて子カテゴリーのみを表示します。最後のULタグの部分を自由に変更できますが、そのままでも問題ありません。フッターのテンプレートに貼れば投稿、固定、カテなどのページで表示しますが、メインインデックスでは目的の子カテがうまく出力されません。そのため、条件分岐で非表示にしています。

上二つと違い、このワードプレス関数は引数に配列を与えて複数の条件を指定しています。title_liは空を指定することで箇条書きの外側に自動的に出力されるタグを非表示にします。echoは0にすると、結果を変数へ代入できるようになります。child_ofは指定した親の子カテのみ表示させます。hide_emptyは1を指定すると記事のないカテを非表示にします。

if(!is_home()||!is_front_page()){
$c=get_the_category()[0]->category_parent;
if($c==0){
$c=get_the_category()[0]->cat_ID;
}
$wordpress_c=wp_list_categories(['title_li'=>0,'echo'=>0,'child_of'=>$c,'hide_empty'=> 1,]);
if(preg_match('/ <li .*?カテゴリーなし.*?>/', $wordpress_c)){
$wordpress_c="";
}else{
echo "<UL style='font-size:14px;'>".$wordpress_c."</UL>";
}
}

まとめ

ワープレのカテゴリーに関するタグは、テンプレートによって若干異なる挙動をします。例えば$catはカテゴリーやアーカイブの編集ファイルで何もしないでも使えます。また、親カテのみで運営していたものの子カテを増やしたら表示がおかしくなった、ということも起こります。

四つワープレの関数をご紹介させて頂きましたが、それぞれ使いどころが違います。一つ目は最もよく利用されることと思います。特にループ内で投稿記事がどのカテに属していて、どういう表示にするかといった形で使われます。二つ目と三つ目の関数はカテやアーカイブに限定されます。三つ目の関数はサイドバーやフッターなどに使われます。