WordPressってループ外で何かしようと思うと面倒だなと思ってましたが $wp_queryとか使うとそれほど面倒じゃなくできそうな感じです。
@params $category
Category ID, Category Title or Category Slug
Default: None
@return Boolean
引数なしの場合、カテゴリであればtrueが返ります。
カテゴリにアクセスしてるとき、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()してみました。
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()っていう関数が存在してます。まったく気がつかなかったわ。
ざっくり書いてみる。
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;
}
}
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年くらいかかりそうだ・・・
/ 金額 : ¥ 2,940
1-5
6-10
/ 金額 : ¥ 3,465
/ 金額 : ¥ 3,150
/ 金額 : ¥ 2,699
/ 金額 : ¥ 3,497
/ 金額 : ¥ 3,675