WordPressの新機能 複数タクソノミークエリーまとめ

先日、「WordPress 3.1 RC3 をみんなでテスト! 」に参加し、その際、複数カスタムタクソノミークエリー(en. Multiple Taxonomy Handling)のテストを担当させてもらいました。
ついでに、仕様などについても探ってましたので、まとめてみることにします。

複数タクソノミークエリーとは

なるべく正確に言うと、query_posts または get_posts の引数に新たに設けられた tax_query により、カテゴリー、タグ、カスタムタクソノミー等による記事抽出条件を、複数かつ様々なパラメータで細かく設定できる機能。

tax_query の値は、抽出条件毎の配列と各条件の結合方法(パラメータ名:relation)で構成される。

こう書いても、分かりにくいと思いますので、もっとかみ砕いて、粉状にして言うと「これさえ憶えておけば、WordPressでの絞り込み検索とかも思いのまま。」という感じです。

いままででも、カテゴリーやタグなどについては、category__and や category__not_in、tag__and 等を用いて絞り込み抽出が可能だったのですが、パラメータ名が多く憶えにくかったこと、指定できる値が id でることが多く、人間との親和性が低かったこと、カスタムタクソノミーでは、指定方法が異なること、3.1では、これらのパラメータも内部的には、tax_queryとして扱われることから、今後はtax_queryの指定をしっかり憶えておく方が得策でしょう。

指定方法

言葉で書いてもわかりにくいと思うので、いきなり例示から。

CODE 1
「日本車でオープンカーのFRまたはMRの車を探したい」場合の指定方法

$arg = array (
	'post_status' => 'publish',
	'post_type' => 'post',
	'tax_query' => array(
		'relation' => 'AND',
		array(
			'taxonomy' => 'drive',
			'field' => 'name',
			'terms' => array('MR','FR'),
			'operator' => 'IN'
 		),
		array(
			'taxonomy' => 'maker',
			'field' => 'slug',
			'terms' => 'japan',
			'include_children' => true,
		),
		array(
			'taxonomy' => 'type',
			'field' => 'slug',
			'terms' => 'open',
		)
	)
);
$searched_posts = get_posts( $arg );

上記のうち、post_statusとpost_typeのパラメータは、従来からあるパラメータですが、一般的なquery_posts, get_postsの利用方法では、& 区切りでの指定が一般的なため、あまり馴染みがないかもしれません。ただし、このように配列形式でもtax_queryと同時に利用することができます。

tax_query以下の部分が、複合カスタムタクソノミークエリーで、relationパラメータで各条件の結合方法を指定しています。この場合は、ANDとなっているので、絞り込み検索となります。

relation以下の3つの配列が、抽出条件の指定で、taxonomy(必須), field, terms(必須), include_children, operator という5つのパラメータが指定可能になっています。

例示の各抽出条件は、上から順に、
1.driveタクソノミーで名前がFRかMR
2.makerタクソノミーで子タクソノミーを含むスラッグがjapan
3.typeタクソノミーでスラッグがopen
という条件となっています。

※ post_statusなど従来からあるパラメータと合わせて利用できます。上記の場合、post_status, post_typeは、なくてもほぼ同じ結果となりますが、参考として入れてあります。
※ 前提として、下記のカスタムタクソノミーが登録されているものとします。
メーカータクソノミー:国を親タクソノミー、メーカー名を子タクソノミーとして登録
ボディタイプタクソノミー:ボディ形状(セダン、クーペ等)をタクソノミーとして登録
駆動方式タクソノミー:駆動方式(例外的にハイブリッドも)をタクソノミーとして登録

指定出来るパラメータについて

パラメータ名 パラメータ説明 設定可能値 デフォルト
relation 複数の抽出条件の結合方法指定 OR, AND AND
taxonomy 対象となるタクソノミー 登録されているタクソノミー なし
field 対象とするフィールド term_id, slug, name, term_taxonomy_id term_id
terms 抽出するタクソノミーの値 タクソノミーの名前、スラッグ、idなど なし
include_children タクソノミーが階層化している場合、子のタクソノミーを含めるか false, 0の指定で含めない true
(含める)
operator termsで指定された値の扱い IN(いずれかに合致)
NOT IN(いずれにも合致しない)
AND(全てに合致)
※ operatorは大文字での指定が必須
IN

ちょっと変わった使い方

WordPress3.1の新機能投稿フォーマットを試してみた。のデータ構造で書いたように、投稿フォーマットもタクソノミー系での管理となるため、複合タクソノミークエリーの条件として使うことができます。

CODE 2
newsカテゴリーで投稿フォーマットがアサイドの投稿を取得

$arg = array(
	'tax_query' => array(
		array(
			'taxonomy' => 'category',
			'field' => 'slug',
			'terms' => 'news'
		),
		array(
			'taxonomy' => 'post_format',
			'field' => 'slug',
			'terms' => 'post-format-aside'
		)
	)
);
$searched_posts = get_posts( $arg );

注意点とか

  • query_postsで実行させた場合、wp_titleがtax_queryの最初の条件で表示されてしまうことがあります。パンくずナビ表示への影響もありそうなので、個人的には、get_postsで利用する方をおすすめします。
  • 可能であるなら、field に term_taxonomy_id を指定すると、データベースへのクエリーが条件毎に1つ軽減でき、負荷を軽減できます。

参考記事

「WordPressの新機能 複数タクソノミークエリーまとめ」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です