WordPressでカテゴリIDを所得する時にはまった件
先日ある案件で現在のカテゴリIDと親カテゴリーのIDを所得する必要がありました。
色々としらべてみると、
WordPressでカテゴリID/カテゴリ名を取得する | OpenMediaLaboratory
というサイトにあるコードがドンピシャだったので、ありがたく使わせていただいたのですが…
どうもある条件が揃うと、正しくカテゴリーIDが所得できないケースがありました。
使わせていただいたコードは下記のようになります。
[html]
< ?php /* 現在のカテゴリ-の取得 */
$cat_now = get_the_category();
$cat_now = $cat_now[0];
/*親カテゴリーのID取得*/
$parent_id = $cat_now->category_parent;
/*現在のカテゴリーID/カテゴリー名取得*/
$now_id = $cat_now->cat_ID; /* カテゴリID */
$now_name = $cat_now->cat_name; /* カテゴリ名 */
?>
[/html]
何が問題だったかというと、$cat_now[0]の部分。
get_the_category()で所得される配列は、普通は一番最初が現在のカテゴリの情報になるはずです。だから、このコードも一番最初の配列である[0]を指定しているわけです。
ところが、
現在のカテゴリー(親カテゴリー有り)に含まれる記事で一番最後のものに親と子の両方のカテゴリーにチェックが入っている
+何らかの条件
が揃うとなぜか[0]のデータが親カテゴリー、[1]のデーターが現在のカテゴリーのデータになってしまいます。
親と子の両方にチェックが入っていても問題無いケースもあり、「何らかの条件」というのが結局わかりませんでした。
原因不明でも対策はする必要があるわけで、今回は配列の最初をとってくるという方法は諦めてget_queried_object()を使う方法にしました。
[html]
<?php /* 現在のカテゴリーページの情報を所得 */
$cat_now = get_queried_object();
$now_id = $cat_now -> cat_ID;/* カテゴリID */
$now_name = $cat_name;/* カテゴリ名 */
$parent_id = $cat_now -> parent;/* 親テゴリID */
?>
[/html]
処理速度やサーバーの負荷という面でどちらが有利なのかわかりませんが、こちらの方がより直接的にIDを所得できるかなと思います。
ただし、グローバル変数$wp_queryの情報を引っぱってくる関数なので、ページリクエストが行われた後でないと使うことができません。そこだけはご注意を。
親カテゴリと子カテゴリ両方チェックをいれると、重複ページができてしまい、子カテゴリのみチェックいれてましたが、それだと親カテゴリのID取得、子カテゴリ名の取得が、get_the_category()ではできなかったため大変助かりました!!!!
ありがとうございます!!!
ちなみに、以下の点ですが、
$now_name = cat_name;/* カテゴリ名 */
cat_nameの$cat_nowが抜けてました!
>n_85さん
ご指摘ありがとうございます!修正させていただきました。
まさにこれで困ってました…むちゃくちゃ助かりました…ありがとうございました…
shehers さん
お役に立ててよかったです!