2009年11月07日 05:01

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

| http://www.kantenna.com/cgi-bin/mt/mt-tb.cgi/492

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にありました。


/**
 * Retrieve variable in the WP_Query class.
 *
 * @see WP_Query::get()
 * @since 1.5.0
 * @uses $wp_query
 *
 * @param string $var The variable key to retrieve.
 * @return mixed
 */
function get_query_var($var) {
    global $wp_query;

    return $wp_query->get($var);
}

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


/**
 * Query search variables set by the user.
 *
 * @since 1.5.0
 * @access public
 * @var array
 */
var $query_vars = array();

どれもpublicなので


get_query_var("cat");
$wp_query->get($var);
$wp_query->query_vars["cat"];

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

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

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

array(49) {
  ["error"]=>string(0) ""
  ["m"]=>int(0)
  ["p"]=>int(0)
  ["post_parent"]=>string(0) ""
  ["subpost"]=>string(0) ""
  ["subpost_id"]=>string(0) ""
  ["attachment"]=>string(0) ""
  ["attachment_id"]=>int(0)
  ["name"]=>string(0) ""
  ["hour"]=>string(0) ""
  ["static"]=>string(0) ""
  ["pagename"]=>string(0) ""
  ["page_id"]=>int(0)
  ["second"]=>string(0) ""
  ["minute"]=>string(0) ""
  ["day"]=>int(0)
  ["monthnum"]=>int(0)
  ["year"]=>int(0)
  ["w"]=>int(0)
  ["category_name"]=>string(0) ""
  ["tag"]=>string(0) ""
  ["cat"]=>string(0) ""
  ["tag_id"]=>int(0)
  ["author_name"]=>string(0) ""
  ["feed"]=>string(0) ""
  ["tb"]=>string(0) ""
  ["paged"]=>string(0) ""
  ["comments_popup"]=>string(0) ""
  ["meta_key"]=>string(0) ""
  ["meta_value"]=>string(0) ""
  ["preview"]=>string(0) ""
  ["category__in"]=>array(0) {}
  ["category__not_in"]=>array(0) {}
  ["category__and"]=>array(0) {}
  ["post__in"]=>array(0) {}
  ["post__not_in"]=>array(0) {}
  ["tag__in"]=>array(0) {}
  ["tag__not_in"]=>array(0) {}
  ["tag__and"]=>array(0) {}
  ["tag_slug__in"]=>array(0) {}
  ["tag_slug__and"]=>array(0) {}
  ["caller_get_posts"]=>bool(false)
  ["suppress_filters"]=>bool(false)
  ["post_type"]=>string(4) "post"
  ["posts_per_page"]=>int(15)
  ["nopaging"]=>bool(false)
  ["comments_per_page"]=>string(2) "50"
  ["order"]=>string(4) "DESC"
  ["orderby"]=>string(23) "wp_posts.post_date DESC"
}

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


array(49) {
  ["year"]=>int(2009)
  ["monthnum"]=>int(10)
  ["day"]=>int(31)
  ["name"]=>string(4) "hook"
  ["error"]=>string(0) ""
  ["m"]=>int(0)
  ["p"]=>int(0)
  ["post_parent"]=>string(0) ""
  ["subpost"]=>string(0) ""
  ["subpost_id"]=>string(0) ""
  ["attachment"]=>string(0) ""
  ["attachment_id"]=>int(0)
  ["hour"]=>string(0) ""
  ["static"]=>string(0) ""
  ["pagename"]=>string(0) ""
  ["page_id"]=>int(0)
  ["second"]=>string(0) ""
  ["minute"]=>string(0) ""
  ["w"]=>int(0)
  ["category_name"]=>string(0) ""
  ["tag"]=>string(0) ""
  ["cat"]=>string(0) ""
  ["tag_id"]=>string(0) ""
  ["author_name"]=>string(0) ""
  ["feed"]=>string(0) ""
  ["tb"]=>string(0) ""
  ["paged"]=>string(0) ""
  ["comments_popup"]=>string(0) ""
  ["meta_key"]=>string(0) ""
  ["meta_value"]=>string(0) ""
  ["preview"]=>string(0) ""
  ["category__in"]=>array(0) {}
  ["category__not_in"]=>array(0) {}
  ["category__and"]=>array(0) {}
  ["post__in"]=>array(0) {}
  ["post__not_in"]=>array(0) {}
  ["tag__in"]=>array(0) {}
  ["tag__not_in"]=>array(0) {}
  ["tag__and"]=>array(0) {}
  ["tag_slug__in"]=>array(0) {}
  ["tag_slug__and"]=>array(0) {}
  ["caller_get_posts"]=>bool(false)
  ["suppress_filters"]=>bool(false)
  ["post_type"]=>string(4) "post"
  ["posts_per_page"]=>int(15)
  ["nopaging"]=>bool(false)
  ["comments_per_page"]=>string(2) "50"
  ["order"]=>string(4) "DESC"
  ["orderby"]=>string(23) "wp_posts.post_date DESC"
}

いろいろ入ってますね。

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

カテゴリ判定用の関数

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

ざっくり書いてみる。

functions.php

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



/**
 * カテゴリID/スラッグの場所にいるか判定
 * スラッグの場合は第2引数にfalseを渡す。
 * 
 * @params Int/String $value
 * @params Boolean $bool
 * @return Boolean
 */
function isThisCategory($value, $bool = true)
{
    global $wp_query;
    $here_category = array();
    
    if (is_category()) {
    
        // 親カテゴリは考慮しない。直下のみ
        $here_category[$wp_query->get('cat')] = $wp_query->get('category_name');
    
    } elseif (is_single()) {
        /**
         * $category = get_the_category();
         *
         * @todo 調査
         * 2.7.1で微妙に関係のないカテゴリがでてくるっぽい?
         * ループ外でもOKっぽいけどver低いとダメ?
         * http://codex.wordpress.org/Function_Reference/get_the_category
         */

        foreach (get_the_category($wp_query->posts[0]->ID) as $obj) {
            $here_category[$obj->term_id] = $obj->slug;
        }
    }
    
    if ($bool) {
        return array_key_exists($value, $here_category) ? true : false;
    } else {
        return in_array($value, $here_category) ? true : false;
    }
}

sidebar.phpとか


if (isThisCategory(10)) {
    // カテゴリIDが10の時の処理
}
/* ------------------------ */
if (isThisCategory('slug', false)) {
    // カテゴリスラッグがslugの時の処理
}

テストコード

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


if (isThisCategory('game', false)) {
    echo '<a href="affiliate"><img src="bana.jpg" /></a>';
}

実行結果

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

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

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

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

トラックバック

  • http://www.kantenna.com/cgi-bin/mt/mt-tb.cgi/492
[WEBプログラム覚書]2010年01月21日 12:41
Wordpress ショートコード
Wordpressの便利な機能ショートコードについて
[WEBプログラム覚書]2010年01月21日 12:43
WordPressのカテゴリ判定について
WordPressってループ外で何かしようと思うと面倒だなと思ってましたが $wp_queryとか使うとそれほど面倒じゃなくできそうな感じです。
[WEBプログラム覚書]2010年03月30日 11:23
Wordpress プラグイン作成前の基礎知識
Wordpress プラグイン作成前の基礎知識
[WEBプログラム覚書]2010年04月27日 23:21
Wordpressのエクスポートとインポート使ってデータ移転するとguidが変わらない
Wordpressのエクスポートとインポート使ってデータ移転するとguidが変わらない
コメント (0)
コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)





この情報を登録しますか?


先月アクセスが多かったページ