質問: $_GET['catnum']; query_posts( array( 'paged' => $paged, 'post_type' => $post_type, 's' => $s, 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy'=>'タクソノミー名', 'terms'=>$catnum, 'include_children'=> true, 'field'=>'slug', 'operator'=>'AND' ) ) )); if( have_posts() ): echo ''; if( !empty($$catnum) ) { if(is_array($catnum)) { foreach($catnum as $val){ echo get_term_by('slug',$val,"タクソノミー名")->name." "; } } echo 'の検索結果'; } else { echo $s.' の検索結果'; } echo ''; while (have_posts()) : the_post(); archivePerfor(); endwhile; echo ''; ### 試したこと 'operator'=>'AND'部分を'operator'=>'IN'に変更すると、 スラッグ1、スラッグ3-1にチェックを付けた場合検索にヒットしますが、 スラッグ1、もしくはスラッグ3-1どちらか該当してる場合ヒットしてしまいます。 ### 補足情報(FW/ツールのバージョンなど) WordPress バージョン5.1.1
回答: このやり方が、妥当なのか、イマイチ自信が持てないのと、これでうまくいく理由もはっきりとわからないのですが、下記のように書き換えたら、仰ることが実現できる気がします。 ``` $s = $_GET['s']; $post_type = $_GET['post_type']; $catnum = $_GET['catnum']; $tax_query = array('relation' => 'AND'); foreach($catnum as $val){ $tax_query[] = array( 'taxonomy' => 'タクソノミー名', 'field' => 'slug', 'terms' => $val, ); } //var_dump($tax_query); query_posts( array( 'paged' => $paged, 'post_type' => $post_type, 's' => $s, 'tax_query' => $tax_query, )); //以下略 ``` あやふやでほんとすみません・・・。 あ、あと、質問の際、コードはでくくるとみやすいと思います、次回以降は是非そうしてください。 ヒントになったのは下記の回答です。 'operator'=>'AND' を書くと、親カテゴリを検索すると、検索結果が0になってしまう現象を確認しました。親カテゴリに選択があっても、0になりました。 'operator'=>'IN' //デフォルト値なので、実際は書かなくても同じ を書くと、親カテゴリに含まれる子カテゴリが検索にヒットします。 (あんまり納得いかないんですけど、きっと多分そういう仕様なんだろうなあ、と思います。SQLとかに明るいとわかるのかもしれないですけど私のレベルではさっぱりわかりません。) なので、$catnum が配列だった場合、それぞれをバラして、'tax_query'に配列として入れればうまくいくのでは、と試したらなんとなくうまくいっている気がする、という感じです。この書き方が妥当なのかは、わかりません・・・・・。 参考になりましたら幸いです。 (そしてもっと詳しい方の解説を強く希望・・・・)