【タクソノミー&ターム編】WP_QueryのANDとORを併用した複雑な条件指定の書き方
今回は、ワードプレスで複雑な条件を指定して投稿一覧を表示したい場合に便利なWP_Queryについてです。
タクソノミー&タームに複数の条件を指定して、しかもANDとORを併用する場合の良いサンプルコードがなかなか見つからないので、メモ代わりに残しておこうと思います。
~ 目次 ~
サンプルコード
カスタム投稿タイプ「product」の中から、タクソノミーのタームに対して、ANDやORで複数の条件指定をする例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$args=array( 'post_type' => 'product', 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'size', 'field' => 'term_id', 'terms' => array(1,2,3), 'operator' => 'IN', ), array( 'taxonomy' => 'color', 'field' => 'slug', 'terms' => array('red','blue','green'), 'operator' => 'AND', ), ), ); $query = new WP_Query($args); |
ポイントは、relationのANDとORだけでなくoperatorを理解して使用する点です。
上の例では以下のような投稿が取得されます。順を追って見てみましょう。
1つ目の配列
「size」タクソノミーのタームを、タームIDで絞り込みます。operatorがINである事に注目して下さい。
タームIDが1か2か3の、いずれかのタームに属していればマッチします。
2つ目の配列
「color」タクソノミーのタームを、ターム名で絞り込みます。今度はoperatorがANDです。
ターム名がred・blue・greenの、3つのタームすべてに属していればマッチします。
relation
relationがANDですので、最終的に上の2つの条件どちらも満たしていればマッチとなります。
当たり前ですが、ここをORにしておけば、上の2つの条件のどちらかを満たせばマッチとなります。
operatorのINがOR検索・ANDはAND検索と覚える
タームに対して、いわゆるOR検索したい場合はoperatorをINに、AND検索したい場合はoperatorをANDにする。
あくまで直感的な話なのですが、こう覚えるとわかりやすいと思います。ちなみにoperatorのデフォルトはINなので、実際は書かなくても大丈夫です。
入れ子にして複雑な条件を指定するサンプルコード
タクソノミーに対する、もっと複雑な条件指定の書き方のサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
$args=array( 'post_type' => 'product', 'tax_query' => array( 'relation' => 'OR', array( 'relation' => 'AND', array( 'taxonomy' => 'type', 'field' => 'slug', 'terms' => array('t1','t2'), 'operator' => 'AND', ), array( 'taxonomy' => 'price', 'field' => 'term_id', 'terms' => 55, 'operator' => 'IN', ), ), array( 'taxonomy' => 'size', 'field' => 'term_id', 'terms' => array(1,2,3), 'operator' => 'IN', ), array( 'taxonomy' => 'color', 'field' => 'slug', 'terms' => array('red','blue','green'), 'operator' => 'AND', ), ), ); $query = new WP_Query($args); |
1階層目の配列はrelationがORですが、5行目からの2階層目の配列の中はrelationがANDですので、この中の条件は、すべてに合致しないとマッチしません。
最終的には、2階層目に記述した条件にすべて合致するか、1階層目に書いてあるsize・colorタクソノミーに対する条件指定のいずれかに合致している投稿がマッチとなります。
そして、先述しましたが各条件指定の配列では、INとANDでタームをOR / AND的条件でマッチングしています。
最後に
私の場合、複雑なクエリ条件を指定していると、条件指定の配列を入れ子にしてrelationを書きまくって…みたいな発想をしてしまって、知恵熱が出てしまいます。
ですが、タクソノミー・タームに対するAND / OR検索は、割とシンプルに書けますね。
個人的に、毎回調べているような気がするのでまとめてみました。お役に立てば幸いです。