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 - 条件を指定して投稿情報をロードする

お勧めコンテンツ

get_taxonomies(2014年5月30日 登録)

array get_taxonomies( [ array $args = array() [ , string $output = 'names' [ , string $operator = 'and' ] ] ] )
タクソノミー情報を取得する。

get_taxonomy(2014年7月3日 登録)

mixed get_taxonomy( string $taxonomy )
タクソノミー情報を取得する。

get_the_post_thumbnail(2010年7月13日 登録)

string get_the_post_thumbnail( [ int $post_id = null [ , mixed $size = 'post-thumbnail' [ , mixed $attr = '' ] ] ] )
アイキャッチ画像(サムネイル)のHTMLテキストを取得する。

get_cancel_comment_reply_link(2014年10月6日 登録)

string get_cancel_comment_reply_link( [ string $text = '' ] )
コメント返信のキャンセル用リンクを取得する。

get_post_thumbnail_id(2010年7月13日 登録)

int get_post_thumbnail_id( [ int $post_id = null ] )
投稿情報にアイキャッチ画像(サムネイル)として設定されているアタッチメント情報のIDを取得する。

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