UNORTHODOX WORKBOOK

BLOG TOPWordPress【WordPress】一覧ページなどで記事ごとに複数の親子カテゴリーを表示する方法

【WordPress】一覧ページなどで記事ごとに複数の親子カテゴリーを表示する方法

wp-cat-parent

あまり複雑なことをしているつもりはないのですが、WordPressでカテゴリーを取り扱う際に、よく土壺にはまって動けなくなってしまうことがあります。カテゴリーの取得って意外と難しい…そう思っているのは自分だけでしょうか。

すぐ忘れてしまう脳みそを持ち合わせてしまったことを嘆きつつ、未来の自分の為にカテゴリーの取得に関してはまってしまったことをシェアしておきたいと思います。

何がしたかったのか

最初にも書きましたが、そんなに複雑なことをしたかったわけではありません。例えば、以下のようなカテゴリー構成で、

果物(親)
 ├ イチゴ(子)
 ├ みかん(子)
 └ リンゴ(子)

カラー(親)
 ├ あか(子)
 ├ 黄色(子)
 └ みどり(子)

カテゴリーアーカイブや最新記事一覧ページ等の各記事へ、下記のようにその記事が属するカテゴリーを表示させたかっただけです。

果物 : イチゴ
カラー : あか, みどり

条件としては、
・どちらの系統のカテゴリー(果物・カラー)にも必ず属する
・上下の位置は固定。必ず果物が上でカラーを下に
・カラーについては、複数の色を選択している場合があるので、全てを表示する
・子カテゴリーにはそれぞれ一覧へのリンクをつける
・選択するのは子カテゴリーのみ(子カテゴリーを選択することで自動的にその親に属する感じ)
・タグは使いたくなかったので、あくまでもカテゴリーで実現する
という感じです。親カテゴリーを選択して子カテゴリーも選択した状態にすると、たまにおかしくなるので、親カテゴリーは選択しないようにしてます(選択しても問題ないような気もする。試してないが・・・)。

また、親カテゴリーの上下の位置は固定なので、今回は親カテゴリーについてはべた書きしています。

特に難しいことは何もないように見えるのですけど、子カテゴリーをその親カテゴリーと関連づける点で躓き、完全にはまってしまいました。

カテゴリーで厄介なのが並び順

ワードプレスのカテゴリーの並び順は常に五十音順(数字→アルファベット→ひらがな→カタカナ→漢字)になっています。所属するカテゴリーを記事ごとにただ単に取得する、だけであればこの点は特に問題にはならないのですが、上記のように「記事ごとにその記事が属する子カテゴリーを親カテゴリーと関連づけてそれぞれ抜き出す」という場合、この並び順のルールによって色々と厄介なことになってしまいました。

プラグインを使えば表示順を変えることはできますが、複数の親カテゴリーに対して複数の子カテゴリーがある場合、条件(カテゴリーの名前)によっては希望の表示を実現することができませんでした。

注)本来であれば、ここで何をやって厄介なことになったのかを記載しないといけないのでしょうが、記載しようとしたら逆にかなり厄介なことになってしまったので、すみませんが割愛させて頂きます。分かりづらくてすみません。とりあえず色々やったが並び順がネックになったということだけ強調しておきます。

cat_is_ancestor_ofという条件分岐タグを使った

上にも書きましたが、とりあえずなんやかんやあって、以下の通りやったら思い通りの表示を実現することができました。

<p>果物 : 
<?php
 $cat = get_the_category();
 foreach($cat as $category){
  if(cat_is_ancestor_of(果物のID, $category)){
   echo '<a href="'.get_category_link($category->term_id).'">'.$category->name.'</a>';
  };
 };
?>
</p>
<p>カラー : 
<?php
 $cat = get_the_category();
 $result = array();
 foreach($cat as $category){
  if(cat_is_ancestor_of(カラーのID, $category)){
   $result[] = '<a href="'.get_category_link($category->term_id).'">'.$category->cat_name.'</a>';
  };
 };
echo implode(", ",$result);
?>
</p>

こんな感じ。

簡単に解説すると、cat_is_ancestor_ofという条件分岐タグを使って、子カテゴリー内をforeachでぶん回しつつ、親子関係にあるかどうかを検証し、親子関係があれば子カテゴリーを表示する、とまあ至って簡単なものなんですが、cat_is_ancestor_of←こいつがなかなかでてこなかった(知らなかったw)ことで異常に時間を取られてしまいましたとさorz

なお、親カテゴリー名とIDはべた書きしてしまいましたが、これだと親カテゴリーが増えた場合、いちいちめんどくさいので、本来であれば親カテゴリー分ループさせたほうがいいのでしょうが、もうとりあえずめんどくさいのでこの形になりました。時間があればまたやってみます。

まとめ

WordPressはまだまだ分からないことだらけ、精進しなければいけないと改めて思いました。上記で何か間違っていたり、こっちの方がいいだろ馬鹿がとか、何かアドバイスがありましたら、ぜひご教授ください。

ABOUT

it's me

長野県北部を拠点にフリーランスとして活動しています。
Webサイトの制作をメインに、グラフィックデザインなどの制作も行っています。 Twitter / GitHub / About

PAGE TOP