HOME>WEBプログラム覚書>WordPressのカテゴリ判定について

WordPressのカテゴリ判定について

WordPressってループ外で何かしようと思うと面倒だなと思ってましたが $wp_queryとか使うとそれほど面倒じゃなくできそうな感じです。

カテゴリの判定

is_category($category)

@params $category
Category ID, Category Title or Category Slug
Default: None
@return Boolean

引数なしの場合、カテゴリであればtrueが返ります。

get_query_var($var)ってなんだ?

カテゴリにアクセスしてるとき、get_query_var('cat')でカテゴリIDが返ってくるらしいんだけど マニュアルではノータッチ。調べてみたら/wp-includes/query.phpにありました。

PHP

  1. <?php
  2. /**
  3.  * Retrieve variable in the WP_Query class.
  4.  *
  5.  * @see WP_Query::get()
  6.  * @since 1.5.0
  7.  * @uses $wp_query
  8.  *
  9.  * @param string $var The variable key to retrieve.
  10.  * @return mixed
  11.  */
  12. function get_query_var($var) {
  13.     global $wp_query;
  14.  
  15.     return $wp_query->get($var);
  16. }
  17. ?>

$wp_query->get($var)は何かっていうと$wp_queryのプロパティである$query_varsから 値を取得してます。

PHP

  1. <?php
  2. /**
  3.  * Query search variables set by the user.
  4.  *
  5.  * @since 1.5.0
  6.  * @access public
  7.  * @var array
  8.  */
  9. var $query_vars = array();
  10. ?>

どれもpublicなので

PHP

  1. <?php
  2. get_query_var("cat");
  3. $wp_query->get($var);
  4. $wp_query->query_vars["cat"];
  5. ?>

上記3つは同じように使っても問題はないでしょう。 推奨はされてませんが。 直でプロパティへアクセスするのは気持ちが悪いので$wp_query->get($var)使うのが 個人的には一番わかりやすいです。

で、重要なのは$wp_query->query_varsには何が入ってるのか? 例によってvar_dump()してみました。

home.phpでvar_dump($wp_query->query_vars)

PHP

  1. <?php
  2. array(49) {
  3.   ["error"]=>string(0) ""
  4.   ["m"]=>int(0)
  5.   ["p"]=>int(0)
  6.   ["post_parent"]=>string(0) ""
  7.   ["subpost"]=>string(0) ""
  8.   ["subpost_id"]=>string(0) ""
  9.   ["attachment"]=>string(0) ""
  10.   ["attachment_id"]=>int(0)
  11.   ["name"]=>string(0) ""
  12.   ["hour"]=>string(0) ""
  13.   ["static"]=>string(0) ""
  14.   ["pagename"]=>string(0) ""
  15.   ["page_id"]=>int(0)
  16.   ["second"]=>string(0) ""
  17.   ["minute"]=>string(0) ""
  18.   ["day"]=>int(0)
  19.   ["monthnum"]=>int(0)
  20.   ["year"]=>int(0)
  21.   ["w"]=>int(0)
  22.   ["category_name"]=>string(0) ""
  23.   ["tag"]=>string(0) ""
  24.   ["cat"]=>string(0) ""
  25.   ["tag_id"]=>int(0)
  26.   ["author_name"]=>string(0) ""
  27.   ["feed"]=>string(0) ""
  28.   ["tb"]=>string(0) ""
  29.   ["paged"]=>string(0) ""
  30.   ["comments_popup"]=>string(0) ""
  31.   ["meta_key"]=>string(0) ""
  32.   ["meta_value"]=>string(0) ""
  33.   ["preview"]=>string(0) ""
  34.   ["category__in"]=>array(0) {}
  35.   ["category__not_in"]=>array(0) {}
  36.   ["category__and"]=>array(0) {}
  37.   ["post__in"]=>array(0) {}
  38.   ["post__not_in"]=>array(0) {}
  39.   ["tag__in"]=>array(0) {}
  40.   ["tag__not_in"]=>array(0) {}
  41.   ["tag__and"]=>array(0) {}
  42.   ["tag_slug__in"]=>array(0) {}
  43.   ["tag_slug__and"]=>array(0) {}
  44.   ["caller_get_posts"]=>bool(false)
  45.   ["suppress_filters"]=>bool(false)
  46.   ["post_type"]=>string(4) "post"
  47.   ["posts_per_page"]=>int(15)
  48.   ["nopaging"]=>bool(false)
  49.   ["comments_per_page"]=>string(2) "50"
  50.   ["order"]=>string(4) "DESC"
  51.   ["orderby"]=>string(23) "wp_posts.post_date DESC"
  52. }
  53. ?>

デザインの汁 « [パブリックドメイン]素材:釣り針で var_dump($wp_query->query_vars)

PHP

  1. <?php
  2. array(49) {
  3.   ["year"]=>int(2009)
  4.   ["monthnum"]=>int(10)
  5.   ["day"]=>int(31)
  6.   ["name"]=>string(4) "hook"
  7.   ["error"]=>string(0) ""
  8.   ["m"]=>int(0)
  9.   ["p"]=>int(0)
  10.   ["post_parent"]=>string(0) ""
  11.   ["subpost"]=>string(0) ""
  12.   ["subpost_id"]=>string(0) ""
  13.   ["attachment"]=>string(0) ""
  14.   ["attachment_id"]=>int(0)
  15.   ["hour"]=>string(0) ""
  16.   ["static"]=>string(0) ""
  17.   ["pagename"]=>string(0) ""
  18.   ["page_id"]=>int(0)
  19.   ["second"]=>string(0) ""
  20.   ["minute"]=>string(0) ""
  21.   ["w"]=>int(0)
  22.   ["category_name"]=>string(0) ""
  23.   ["tag"]=>string(0) ""
  24.   ["cat"]=>string(0) ""
  25.   ["tag_id"]=>string(0) ""
  26.   ["author_name"]=>string(0) ""
  27.   ["feed"]=>string(0) ""
  28.   ["tb"]=>string(0) ""
  29.   ["paged"]=>string(0) ""
  30.   ["comments_popup"]=>string(0) ""
  31.   ["meta_key"]=>string(0) ""
  32.   ["meta_value"]=>string(0) ""
  33.   ["preview"]=>string(0) ""
  34.   ["category__in"]=>array(0) {}
  35.   ["category__not_in"]=>array(0) {}
  36.   ["category__and"]=>array(0) {}
  37.   ["post__in"]=>array(0) {}
  38.   ["post__not_in"]=>array(0) {}
  39.   ["tag__in"]=>array(0) {}
  40.   ["tag__not_in"]=>array(0) {}
  41.   ["tag__and"]=>array(0) {}
  42.   ["tag_slug__in"]=>array(0) {}
  43.   ["tag_slug__and"]=>array(0) {}
  44.   ["caller_get_posts"]=>bool(false)
  45.   ["suppress_filters"]=>bool(false)
  46.   ["post_type"]=>string(4) "post"
  47.   ["posts_per_page"]=>int(15)
  48.   ["nopaging"]=>bool(false)
  49.   ["comments_per_page"]=>string(2) "50"
  50.   ["order"]=>string(4) "DESC"
  51.   ["orderby"]=>string(23) "wp_posts.post_date DESC"
  52. }
  53. ?>

いろいろ入ってますね。

$wp_queryを利用するとループ外でも簡単に カテゴリを取得したり判定したり出来そうです。

カテゴリ判定用の関数

追記:カテゴリ判定にはin_category()っていう関数が存在してます。まったく気がつかなかったわ。

ざっくり書いてみる。

functions.php

plugin化の方法がもちろんわからないのでfunctions.phpでw もっといい設置方法あるはず。

PHP

  1. <?php
  2.  
  3. /**
  4.  * カテゴリID/スラッグの場所にいるか判定
  5.  * スラッグの場合は第2引数にfalseを渡す。
  6.  *
  7.  * @params Int/String $value
  8.  * @params Boolean $bool
  9.  * @return Boolean
  10.  */
  11. function isThisCategory($value, $bool = true)
  12. {
  13.     global $wp_query;
  14.     $here_category = array();
  15.  
  16.     if (is_category()) {
  17.  
  18.         // 親カテゴリは考慮しない。直下のみ
  19.         $here_category[$wp_query->get('cat')] = $wp_query->get('category_name');
  20.  
  21.     } elseif (is_single()) {
  22.         /**
  23.          * $category = get_the_category();
  24.          *
  25.          * @todo 調査
  26.          * 2.7.1で微妙に関係のないカテゴリがでてくるっぽい?
  27.          * ループ外でもOKっぽいけどver低いとダメ?
  28.          * http://codex.wordpress.org/Function_Reference/get_the_category
  29.          */
  30.  
  31.         foreach (get_the_category($wp_query->posts[0]->ID) as $obj) {
  32.             $here_category[$obj->term_id] = $obj->slug;
  33.         }
  34.     }
  35.  
  36.     if ($bool) {
  37.         return array_key_exists($value, $here_category) ? true : false;
  38.     } else {
  39.         return in_array($value, $here_category) ? true : false;
  40.     }
  41. }
  42. ?>

sidebar.phpとか

PHP

  1. <?php
  2. if (isThisCategory(10)) {
  3.     // カテゴリIDが10の時の処理
  4. }
  5. /* ------------------------ */
  6. if (isThisCategory('slug', false)) {
  7.     // カテゴリスラッグがslugの時の処理
  8. }
  9. ?>

テストコード

ゲームカテゴリの場合、バナーを出す。

PHP

  1. <?php
  2. if (isThisCategory('game', false)) {
  3.     echo '<a href="affiliate"><img src="bana.jpg" /></a>';
  4. }
  5. ?>

右側にゲーム用PCのバナーが出ます。他のページではでません。

日本語マニュアルに載ってないこと色々ありそうですね。 やはり本家サイトとソース頑張って読むべきなんだろうなぁ・・・

うーん・・・5年くらいかかりそうだ・・・

投稿日 2009年11月 7日 05:01
カテゴリ PHP
タグ WordPress | サンプルコード | 関数
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1174

コメント

コメントする
Name
Email Address
URL