以前「pre_get_postsを使ったカスタムタクソノミーの複雑な条件検索」という記事を書きましたが、この記事のコードでは正常に動作していませんでした。。。
ADs
register_taxonomyのオプションで「query_var」というオプションをtrueに設定するように書いていましたが、falseの間違いでした。
trueとすることで「タクソノミー名=タクソノミーの値」という1対1の場合では問題ないですが、値が配列になると取れなくなります。
1 2 3 4 5 6 7 |
register_taxonomy( 'label' => '名前', 'labels' => array( ...ダッシュボードで表示される名前など ), 'query_var' => false //falseでないと配列を受けられない ) |
こちらは変更なしです。
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 36 37 |
<form action="./" method="get"> <dl> <dt>材質</dt> <dd> <input type="checkbox" name="material[]" value="金属" />金属 <input type="checkbox" name="material[]" value="木" />木 <input type="checkbox" name="material[]" value="布" />布 </dd> </dl> <dl> <dt>産地</dt> <dd> <input type="checkbox" name="born[]" value="海外" />海外 <input type="checkbox" name="born[]" value="国内" />国内 </dd> </dl> <dl> <dt>フリーワード</dt> <dd><input type="text" name="s" /></dd> </dl> <input type="submit" value="検索する" /> </form> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <div class="article"> <h2><?php the_title(); ?></h2> <div> <?php the_content(); ?> </div> <div class="tax"> 産地:<?php the_terms( $post->ID, 'born'); ?><br /> 素材:<?php the_terms( $post->ID, 'material'); ?> </div> </div> <?php endwhile; else: ?> <p>投稿はありません。</p> <?php endif; ?> |
まず「query_vars」というフィルターフックで自力でクエリを定義します。register_taxonomyの「name」で定義した名称を配列のかたちでいれます。
定義したタクソノミー全部を検索で使う場合はget_taxonomiesで入れたほうが手っ取り早いかもしれません。
あとのpre_get_postsへの処理の中では、配列の生成を+演算子ではだめだったりarray_mergeを使ったりという点が変わっています。
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
//以下のquery_varへのフィルタ追加 add_filter( 'query_vars', 'my_query_vars' ); function my_query_vars( $public_query_vars ) { return array_merge( $public_query_vars, array( 'タクソノミー名1', 'タクソノミー名2' ) ); } function taxonomy_search($query) { if ( is_admin() || ! $query->is_main_query() ){ return; } //$queryの中身を見てみると分かりやすいかもしれません。 //var_dump($query); //クエリがある場合のみの条件分岐。is_search()とかis_archive()のほうが望ましい場合もあると思う if ( count($query->query) ) { //設定済みタクソノミーの取得 $alltax = get_taxonomies(array( '_builtin' => false //WPがデフォルトで持っているタクソノミー(categoryとかpost_tagとか)を除く )); //tax_queryで使う配列を生成 $arr = array(); //最終的にtax_queryに突っ込む配列 foreach($query->query as $key=>$val){ if(in_array($key,$alltax)){ $arr[] = array( //Arrayの演算を+ではなく[]で 'taxonomy' => $key, 'field' => 'slug', 'terms' => array_merge($val),//$valが配列なので。。。 'operator' => 'AND' ); } } //最低限の条件 $query->set( 'post_status','publish' ); $query->set( 'posts_per_page', 10 ); //tax_queryをセット //配列の追加処理をカンマでつなぐのではなく、array_mergeで $query->set('tax_query', array_merge(array( 'relation' => 'AND' ),$arr) ); return $query; } } add_action( 'pre_get_posts', 'taxonomy_search' ); |
ADs
こんにちは。
こちらはマルチサイトで使用することができますか?
検索を行っても表記はされるのですが、メインサイトのみしか表示されず色々と試行錯誤してみましたが、悩んでおります。