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
<?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から
値を取得してます。
PHP
<?php
/**
* Query search variables set by the user.
*
* @since 1.5.0
* @access public
* @var array
*/
var $query_vars = array();
?>
どれもpublicなので
PHP
<?php
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)
PHP
<?php
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)
PHP
<?php
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
もっといい設置方法あるはず。
PHP
<?php
/**
* カテゴリ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とか
PHP
<?php
if (isThisCategory(10)) {
// カテゴリIDが10の時の処理
}
/* ------------------------ */
if (isThisCategory('slug', false)) {
// カテゴリスラッグがslugの時の処理
}
?>
テストコード
ゲームカテゴリの場合、バナーを出す。
PHP
<?php
if (isThisCategory('game', false)) {
echo '<a href="affiliate"><img src="bana.jpg" /></a>';
}
?>
右側にゲーム用PCのバナーが出ます。他のページではでません。
日本語マニュアルに載ってないこと色々ありそうですね。
やはり本家サイトとソース頑張って読むべきなんだろうなぁ・・・
うーん・・・5年くらいかかりそうだ・・・
投稿日 |
2009年11月 7日 05:01 |
カテゴリ |
PHP |
タグ |
WordPress | サンプルコード | 関数 |
トラックバック URL |
http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1174 |
コメント