この記事は最後に更新してから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


お勧め

get_comment_id_fields(2014年10月6日 更新)

string get_comment_id_fields( [ int $id = 0 ] )
コメント投稿フォームの隠しフィールドを取得する。

has_header_image(2018年5月27日 更新)

bool has_header_image( )
現在のテーマがヘッダー画像を持っているか調べる。

wp_generator(2018年5月27日 更新)

void wp_generator( )
XHTMLのgeneratorタグを表示する。

get_userdata(2018年5月27日 更新)

mixed get_userdata( int $user_id )
ユーザIDを指定し、マッチするユーザ情報を取得する。

get_the_content(2014年3月3日 更新)

string get_the_content( [ string $more_link_text = null [ , bool $strip_teaser = false ] ] )
現在の投稿情報のコンテンツを取得する。