WordPressでカテゴリ一覧ページを作成する際に、説明文も出したい時、ありますよね。
そのためには、
1 2 |
$cat = get_the_category(); echo $cat[0]->category_description; |
みたいな感じで出せばよさそうなのですが、この場合カテゴリーに親子関係があったりすると必ずしも狙ったものが出るとは限りません。
そうすると、子カテゴリの一覧なのに説明文は親のものになってしまったりと、なかなかうまく行かなかったのですが、あっさり解決する方法がありました。
悩んだポイント
get_the_category()すると、カテゴリ情報がまるっと取得出来ます。親のみなら1こ、子もいるとそいつらも取れます。
なので、子持ちのカテは配列がどんどん増えていくことを利用して複数になるからそれを数えてみようかとかいろいろ考えたのですが、どう考えても効率悪い。。
そういえば!
よくよく考えてみると、カテゴリ名を表示する「single_cat_title();」って関数は自分が試した限り常に正しい(親なら親の、子なら子の)カテゴリ名を返してくれていることに気づきました。
ということは、この関数が裏でどういうことをやってるのかがわかれば解決出来るんじゃないか!と思い、早速調べてみることにしました。
調べてみた
どのファイルにどの関数が書かれてるかを探すなら英語版Codexがオススメです。ほぼ確実にセクションの終わりの方に wordpress のソースコードを管理している trac の該当ファイルへのリンクが付いてるから。(日本語の方はついてたりついてなかったりまちまちなんですよね。。)
と、いうことで早速英語版Codexでsingle_cat_titleを調べます。
Function Reference/single cat title « WordPress Codex
Source Fileというセクションに、
single_cat_title() is located in wp-includes/general-template.php
.
という記述がありますね。
どうやらこの関数は、「general-template.php」というファイルの中に書かれているそうなので、そのコードを読んでみます。
general-template.php in tags/3.5.1/wp-includes – WordPress Trac
おもむろにCmd+Fでページ内検索をかけてみると、683行目にありました ((この行番号は記事作成当時のものです。WordPressのバージョンアップなどによって行数が変化する場合があります。)) 。
683 684 685 |
function single_cat_title( $prefix = '', $display = true ) { return single_term_title( $prefix, $display ); } |
どうやら、内部で「single_term_title」という関数を呼び出してるようです。
ではこの single_term_title() がなにをしてるのか調べてみます。
幸い同じファイルの中にありました。
725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 |
function single_term_title( $prefix = '', $display = true ) { $term = get_queried_object(); if ( !$term ) return; if ( is_category() ) $term_name = apply_filters( 'single_cat_title', $term->name ); elseif ( is_tag() ) $term_name = apply_filters( 'single_tag_title', $term->name ); elseif ( is_tax() ) $term_name = apply_filters( 'single_term_title', $term->name ); else return; if ( empty( $term_name ) ) return; if ( $display ) echo $prefix . $term_name; else return $term_name; } |
すると、中では「get_queried_object();」を呼び出してますね。
この関数は、ページの情報(オブジェクト)を取得することが出来るものです。
カテゴリテンプレートに
1 2 3 4 5 6 7 8 |
$current_cat = get_queried_object(); $current_cat2 = get_the_category(); echo '<pre>'; echo 'get_queried_object()<br>'; print_r($current_cat); echo 'get_the_category()<br>'; print_r($current_cat2); echo '</pre>'; |
とかして、親カテ、子カテと交互に行ってみるとわかりますが、「get_the_category();」ではそのカテゴリーが属する全てのカテゴリー情報がとれたのに対し、こちらは「現在のカテゴリそのもの」の情報だけが取れます。
つまり、「get_queried_object();」を使用してカテゴリ情報を取得すれば、親カテ子カテ関係なく、現在のカテゴリを表示させることができそうですね。
ということで出来上がったコードがこちら
1 2 3 4 |
$current_cat = get_queried_object(); $return = '<p>'; $return .= $current_cat->category_description; $return .= '</p>'; |
これでまた1つ悩みが解決出来ました。やったー。
非常に助かりました。
心より感謝致します!
reprepsuicaさん、
お役に立てたようで良かったです!