この記事は最後に更新してから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_embed(2015年12月23日 更新)

bool is_embed( )
要求されているページが埋め込み投稿ページか調べる。

get_custom_header_markup(2017年4月7日 更新)

string get_custom_header_markup()
カスタムヘッダーのHTMLパーツを取得する。

wp_set_password(2013年5月5日 更新)

void wp_set_password( string $password, int $user_id )
ログインパスワードを設定する。

get_category(2011年5月25日 更新)

mixed get_category( mixed $category [ , string $output = OBJECT [ , string $filter = 'raw' ] ] )
IDを指定してカテゴリー情報を取得する。

get_body_class(2012年6月23日 更新)

array get_body_class( [ string $class = '' ] )
bodyタグのclass属性値を取得する。