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