先日、「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件のフィードバック