ハマったのでメモ。
WordPressで get_post の絞り込み条件 $args を作る時に、複数のカスタムタクソノミーのタームを条件として入れたい場合の理想形はコレ。
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 |
$args = array ( 'post_status' => 'publish', 'post_type' => 'post', 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'gender', 'field' => 'slug', 'terms' => array( 'mens', 'ladies' ), 'operator' => 'IN' ), array( 'taxonomy' => 'item', 'field' => 'slug', 'terms' => array( 'bag', 'wallet' ), 'operator' => 'IN' ), array( 'taxonomy' => 'color', 'field' => 'slug', 'terms' => array( 'brown', 'black' ), 'operator' => 'IN' ), ) ); $searched_posts = get_posts( $args ); |
『(メンズ or レディース) の (バッグ or 財布) で色は (ブラウン or 黒)』の商品を探す、というイメージですね。
tax_query の部分を個別ページ毎に変更したいと思ったので、$terms という変数に取得した以下のようなカスタムタクソノミーの情報を $argsの tax_query に追加していきたい。
1 2 3 4 5 |
$terms = array( 'gender' => array( 'mens', 'ladies' ), 'item' => array( 'bag', 'wallet' ), 'color' => array( 'brown', 'black' ), ); |
そこでやってみたのがこちら。
1 2 3 4 5 6 7 8 9 10 11 12 |
foreach( $terms as $taxonomy => $term ) : $termitem = array( 'taxonomy' => $taxonomy, 'field' => 'slug', 'terms' => $term, 'operator' => 'IN' ); //この処理がうまくいかない $args['tax_query'] = array_merge( $args['tax_query'], $termitem ); endforeach; |
array_merge( $args[‘tax_query’],… なんて使い方があっているのかどうかも怪しいですがどうもうまくいきません。。
「連想配列に追加」というキーワードで調べ、array_pushとかarray_mergeとかarray_merge_recursiveとか+演算子を使う方法を試してみたけどどうも望んだ形にならない…。意図したところに追加されなかったりNULLになったり。
というわけでループをカウントしながらまわしてみて、うまくいった結果がこちら。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$args = array( 'post_status' => 'publish', 'post_type' => 'post', ); if( $terms ){ $count = 0; foreach( $terms as $taxonomy => $term ) : $termitem = array( 'taxonomy' => $taxonomy, 'field' => 'slug', 'terms' => $term, 'operator' => 'IN' ); $args['tax_query'][$count] = $termitem; $count += 1; endforeach; if( count( $terms ) > 1 ){ $args['tax_query']['relation'] = 'AND'; } } $postslist = get_posts( $args ); |
なんだか無理矢理感がなるような気はしますが…なんとか希望の形になりました。
もっとスマートな方法があるならばぜひ知りたい。