query_posts(WP_Queryクラス)で’tax_query’を使いこなす

query_posts(WP_Queryクラス)で’tax_query’を使いこなす - tax_queryを理解する(3)

説明

2日にわたって投稿した「query_posts(WP_Queryクラス)でカテゴリーを絞り込む」「query_posts(WP_Queryクラス)で投稿タグを絞り込む」の続き。今日はカテゴリーや投稿タグ以外ののタクソノミーによる絞り込み、複数のタクソノミーの絞り込みの組み合わせについてまとめてみる。
そもそも一連の投稿のきっかけになったのは、新テーマ「Twenty Eleven」の短冊ウィジェットがきっかけだった。その部分はこちら。
'tax_query' => array(
	array(
		'taxonomy' => 'post_format',
		'terms' => array( 'post-format-aside', 'post-format-link', 'post-format-status', 'post-format-quote' ),
		'field' => 'slug',
		'operator' => 'IN',
	),
),
これは投稿フォーマット('post_format')がアサイド('post-format-aside')、リンク('post-format-link')、ステータス('post-format-status')、引用('post-format-quote')の何れかにマッチする投稿情報を絞り込む指定になる。'tax_query'の指定は、カテゴリーや投稿タグで絞り込む場合と同様で、スラッグを直接使用できるのがいい。
投稿フォーマットが「標準」の投稿記事
投稿フォーマットで絞り込む際に注意する点は、投稿フォーマットとして「標準」が指定された投稿記事の場合。これは内部的に「標準」という投稿フォーマットは存在していないためで、投稿フォーマットが「標準」の投稿記事を取得する場合は次のように指定する必要がある。
query_posts( array(
	'tax_query' => array( 
		array(
			'taxonomy'=>'post_format',
			'terms'=>array( 'post-format-aside', 'post-format-link', 'post-format-gallery', 'post-format-image', 'post-format-status', 'post-format-quote' ),
			'field'=>'slug',
			'operator'=>'NOT IN'
			),
		'relation' => 'AND'
		)
	)
);
これは標準の投稿フォーマット6種類が登録されている場合で、独自に投稿フォーマットが追加されている場合は、それらも含めて指定しなければならない。
組み合わせは自由自在
ここまで'tax_query'を使用してカテゴリー、投稿タグ、投稿フォーマットそれぞれの絞り込み方法を紹介してきた。'tax_query'を使うメリットは、どのタクソノミーであってもIDだけでなくスラッグを指定でき、さらに複数の条件を組み合わせるが可能なことだ。
例えば、'news'または'topics'カテゴリーに属し、'product'または'service'という投稿タグが付いた投稿記事を絞り込む場合は
query_posts( array(
	'tax_query' => array( 
		array(
			'taxonomy'=>'category',
			'terms'=>array( 'news', 'topics' ),
			'field'=>'slug',
			'include_children'=>true,
			'operator'=>'IN'
			),
		array(
			'taxonomy'=>'post_tag',
			'terms'=>array( 'product', 'service' ),
			'field'=>'slug',
			'operator'=>'IN'
			),
		'relation' => 'AND'
		)
	)
);
といった感じになる。
また、'news'または'topics'カテゴリーに属し、'service'および'price-down'という投稿タグが付いた投稿記事を絞り込む場合は
query_posts( array(
	'tax_query' => array( 
		array(
			'taxonomy'=>'category',
			'terms'=>array( 'news', 'topics' ),
			'field'=>'slug',
			'include_children'=>true,
			'operator'=>'IN'
			),
		array(
			'taxonomy'=>'post_tag',
			'terms'=>array( 'service', 'price-down' ),
			'field'=>'slug',
			'operator'=>'AND'
			),
		'relation' => 'AND'
		)
	)
);
と、赤字の部分の指定を「OR」から「AND」に変更すればいい。
さらに、上記と同じ条件で投稿フォーマットのアサイドまたは引用の投稿情報を絞り込む場合は
query_posts( array(
	'tax_query' => array( 
		array(
			'taxonomy'=>'category',
			'terms'=>array( 'news', 'topics' ),
			'field'=>'slug',
			'include_children'=>true,
			'operator'=>'IN'
			),
		array(
			'taxonomy'=>'post_tag',
			'terms'=>array( 'service', 'price-down' ),
			'field'=>'slug',
			'operator'=>'AND'
			),
		array(
			'taxonomy' => 'post_format',
			'terms' => array( 'post-format-aside', 'post-format-quote' ),
			'field' => 'slug',
			'operator' => 'IN',
			),
		'relation' => 'AND'
		)
	)
);
のように、赤字の部分を追加するだけだ。
'taxonomy'と'term'の場合
おまけとして、最後にquery_posts関数(WP_Queryクラス)の'taxonomy'と'term'によるタクソノミーの絞り込みパラメータについて触れておく。例えば'news'カテゴリーで絞り込む場合は次のように指定できる。
query_posts( 'taxonomy=category&term=news' );
'taxonomy'にはタクソノミーの種類を1つだけ、'term'にはカテゴリーのスラッグを1つだけ指定する。
この指定は、内部では次に示す'tax_query'パラメータとして展開されている。
'tax_query' => array(
	array(
		'taxonomy'=>'category',
		'terms'=>array( 'news' ),
		'field'=>'slug',
		'operator'=>'IN'
		),
	'relation' => 'AND'
	)
query_posts関数(WP_Queryクラス)のパラメータとして、カテゴリー('cat'や'category_name'、'category__○○')や投稿タグ('tag'や'tag_id'、'tag__○○'、'tag_slug__○○')の絞り込みパラメータと、'tax_query'パラメータは同時に利用できるが、指定内容によっては矛盾する(マッチする投稿情報が1件もない)条件になる可能性高くなる。'tax_query'パラメータを使用する場合は、カテゴリーや投稿タグの絞り込みパラメータは使用しないほうがいいだろう。

関連

  • get_query_var - 投稿検索に関連する変数の値を取得する
  • query_posts - 条件を指定して投稿情報をロードする

お勧めコンテンツ

get_post_field(2016年5月23日 登録)

string get_post_field( string $field [ , mixed $post = null [ , string $context = 'display' ] ] )
投稿情報の要素を取得する。

register_nav_menus(2010年11月2日 登録)

void register_nav_menus( [ array $locautions = array() ] )
自テーマにナビゲーションメニューを追加する。

previous_post_link(2009年11月30日 登録)

void previous_post_link( [ string $format = '« %link' [ , string $link = '%title' [ , bool $in_same_cat$in_same_term = false [ , mixed $excluded_categories$excluded_terms = '' [ , string $taxonomy = 'category' ] ] ] ] ] )
1つ前の投稿ページのリンクを表示する。

attachment_url_to_postid(2014年9月7日 登録)

int attachment_url_to_postid( string $url )
添付ファイルのURLから投稿IDを取得する。

the_archive_description(2014年12月23日 登録)

void the_archive_description( [ string $before = '' [ , string $after = '' ] ] )
アーカイブページの説明を表示する。

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