この記事は最後に更新してから1年以上経過しています。

query_posts(WP_Queryクラス)でカテゴリーを絞り込む

説明

久しぶりに query_posts関数を見直してみると、見知らぬパラメータがいくつか追加されていた。気になったのでカテゴリー関係の指定を'tax_query'パラメータを交えて整理してみた。
query_posts(WP_Queryクラス)でカテゴリーを絞り込むパラメータは次の通り。
パラメータデータ
category_nameカテゴリーのスラッグを指定(複数指定する場合は「,」で区切る)'category_name=abc,def'
catカテゴリーのIDを指定(複数指定する場合は「,」で区切る。除外する場合はIDに「-」を付ける)'cat=1,12,-5'
category__inカテゴリーのIDを配列で指定array( 'category__in'=>array( 1, 12 ) )
category__not_inカテゴリーのIDを配列で指定array( 'category__not_in'=>array( 5 ) )
category__andカテゴリーのIDを配列で指定array( 'category__and'=>array( 1, 12 ) )

category_name

絞り込みを行う上で比較的に扱いやすいのが、スラッグで指定できる'category_name'だろう。例えば'news'と'topics'カテゴリーのどちらかのカテゴリーに属する投稿記事を取得する場合は、次のように記述する。
query_posts( 'category_name=news,topics' );
これと同じ意味の指定を、WordPress 3.1から追加された'tax_query'を使って指定すると次のようになる。
query_posts( array(
	'tax_query' => array( 
		array(
			'taxonomy'=>'category',
			'terms'=>array( 'news', 'topics' ),
			'include_children'=>true,
			'field'=>'slug',
			'operator'=>'IN'
			),
		'relation' => 'AND'
		)
	)
);
青字の部分は省略可能な部分。tax_queryの指定方法は初見だと長く感じるかもしれないが、'operator'の値を'NOT IN'にすることでカテゴリーに属さない投稿情報を、また'AND'に指定することで複数のカテゴリーに属する投稿情報を絞り込むことができるなど、スラッグを指定しながらさまざまな条件で絞り込みできるのがメリットの1つである。

category__in

次は'cat'を紹介したいところだが、指定できる値によって若干複雑になってしまうので、先に'category__in'などを紹介する。'category__in'で先と同じように複数のカテゴリーの何れかに属する投稿記事を絞り込む場合は次のように記述する。
query_posts( array( 'category__in' => array( 11, 15 ) ) );
'category__in'と同じ条件指定を'tax_query'を使った場合は次のようになる。
query_posts( array(
	'tax_query' => array( 
		array(
			'taxonomy'=>'category',
			'terms'=>array( 11, 15 ),
			'include_children'=>false,
			'field'=>'term_id',
			'operator'=>'IN'
			),
		'relation' => 'AND'
		)
	)
);
赤字の部分が、'category_name'との違い。'category__in'ではカテゴリーのスラッグではなくIDを指定するので、'terms'と'field'の値がそれぞれ異なる。
また、'include_children'がfalseになるので注意が必要だ。子カテゴリーを含む場合はtrueを指定すること。

category__not_in

この'category__not_in'は'category__in'と反対にカテゴリーに属さない投稿記事を絞り込む。その記述は次の通りだ。
query_posts( array( 'category__not_in' => array( 11, 15 ) ) );
この'category__not_in'と同じ条件指定を'tax_query'を使った場合は次のようになる。
query_posts( array(
	'tax_query' => array( 
		array(
			'taxonomy'=>'category',
			'terms'=>array( 11, 15 ),
			'include_children'=>false,
			'field'=>'term_id',
			'operator'=>'NOT IN'
			),
		'relation' => 'AND'
		)
	)
);
'category__in'の場合との違いが赤字の部分。'IN'ではなく'NOT IN'になる。

category__and

さて個人的にはあまり使ったことはないのだが、複数のカテゴリーに属する投稿記事を絞り込むのが'category__and'になる。
query_posts( array( 'category__and' => array( 11, 15 ) ) );
この'category__and'と同じ条件指定を'tax_query'を使った場合は次のようになる。
query_posts( array(
	'tax_query' => array( 
		array(
			'taxonomy'=>'category',
			'terms'=>array( 11, 15 ),
			'include_children'=>false,
			'field'=>'term_id',
			'operator'=>'AND'
			),
		'relation' => 'AND'
		)
	)
);
'category__in'や'category__not_in'の場合との違いは赤字の部分で、この場合は'AND'になる。

cat

最後に'cat'を紹介する。catの値には、カテゴリーのIDを指定するが、正数の場合ならその数値のIDのカテゴリーを含むものを('category__in'と同じ)、負数の場合はその数値のIDのカテゴリーを含まないものを絞り込む。例えば、カテゴリーIDが11と15のカテゴリーに属し、18のカテゴリーに属さない投稿記事を絞り込む場合は次のように記述する。
query_posts( 'cat=11,15,-18' );
これとと同じ条件指定を'tax_query'を使った場合は次のようになる。
query_posts( array(
	'tax_query' => array( 
		array(
			'taxonomy'=>'category',
			'terms'=>array( 11, 15 ),
			'include_children'=>false,
			'field'=>'term_id',
			'operator'=>'IN'
			),
		array(
			'taxonomy'=>'category',
			'terms'=>array( 18 ),
			'include_children'=>false,
			'field'=>'term_id',
			'operator'=>'NOT IN'
			),
		'relation' => 'AND'
		)
	)
);
ここで'relation'の指定が初めて意味を持つ。先に指定している2つの連想配列にはカテゴリーに属する条件とカテゴリーに属さない条件が指定され、'relation'の'AND'指定によりそのすべての条件にもマッチする投稿情報を取得できる。'relation'には'AND'のほか'OR'が指定できる。この場合、2つの連想配列で指定された条件の何れかにマッチする投稿情報を取得することができる。
'tax_query'には、カテゴリー以外にも投稿タグや投稿フォーマットをはじめとして、その他のタクソノミーを指定でき、異なるタクソノミーの条件と組み合わせるができる。カテゴリー関連で長くなってしまったので投稿タグやその他のタクソノミーについては次回以上で紹介する。

最終更新 : 2011年09月14日 18:07


お勧め

is_home(2018年5月27日 更新)

bool is_home( )
要求されているページが、ホーム(トップ)ページか調べる。

update_comment_meta(2014年3月9日 更新)

bool update_comment_meta( int $comment_id, string $meta_key, mixed $meta_value [ , mixed $prev_value = '' ] )
コメントメタ情報の値を更新する。

wp_robots_noindex(2021年3月13日 更新)

array wp_robots_noindex( array $robots )
robotsメタ要素のcontent属性にnoindexを適用する。

is_taxonomy_hierarchical(2018年5月27日 更新)

bool is_taxonomy_hierarchical( string $taxonomy )
タクソノミーに階層(親子)関係があるか調べる。

get_comment_pages_count(2015年12月16日 更新)

int get_comment_pages_count( [ array $comments = null [ , int $per_page = null [ , bool $threaded = null ] ] ] )
コメントページ数を取得する。