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

query_posts(WP_Queryクラス)でカテゴリーを絞り込む - tax_queryを理解する(1)

説明

久しぶりに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'には、カテゴリー以外にも投稿タグや投稿フォーマットをはじめとして、その他のタクソノミーを指定でき、異なるタクソノミーの条件と組み合わせるができる。カテゴリー関連で長くなってしまったので投稿タグやその他のタクソノミーについては次回以上で紹介する。

関連

  • query_posts - 条件を指定して投稿情報をロードする

お勧めコンテンツ

add_pages_page(2011年5月30日 登録)

mixed add_pages_page( string $page_title, string $menu_title, mixed string $capability, string $menu_slug [ , mixed $function = '' ] )
固定ページメニューにサブメニューを登録する。

the_permalink(2009年11月12日 登録)

void the_permalink( [ mixed $post = 0 ] )
現在の投稿データのパーマリンクを表示する。

is_wp_error(2011年2月24日 登録)

bool is_wp_error( mixed $thing )
WP_Errorオブジェクトか調べる。

display_header_text(2012年9月10日 登録)

bool display_header_text()
ヘッダーのテキストを表示するか調べる。

paginate_links(2012年10月21日 登録)

mixed paginate_links( [ mixed $args = '' ] )
(アーカイブページ向けの)ページネートリンクを取得する。

最終更新日時 : 2011-09-14 18:07