これは簡単なはずですが、問題はありません。
ユーザーが「alice」を検索した場合、それらの投稿に文字列「alice」が含まれているかどうかに関係なく、すべての投稿にカスタム分類用語「bob」と「carol」を付けて表示します。
'bob'と 'carol'を含む投稿のみを用語として表示するようにクエリのtax_queryを設定することはできますが、 'aliceを含む投稿だけでなくすべての投稿を表示するように実際の検索クエリをリセットすることはできません。 'それらの中。
これは私がtax_queryを変更するために使用しているフィルタです:
if ( !$query->is_search )
return $query;
$taxquery = array(
'relation' => 'OR',
array(
'taxonomy' => 'people',
'field' => 'slug',
'terms' => array( 'bob' ),
),
array(
'taxonomy' => 'people',
'field' => 'slug',
'terms' => array( 'carol' ),
)
);
$query->set( 'tax_query', $taxquery );
return $query;
しかし、これを使って検索クエリを設定することはできません。
$queryvars = array(
's' => ''
);
$query->set( 'query_vars', $queryvars );
set
を使ってすべてのクエリ変数を変更することはできないので、うまくいきません。トリックをする最も簡単な方法は空の文字列に's'
を設定することです:
add_action( 'pre_get_posts', function( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$taxquery = array( ... );
$query->set( 'tax_query', $taxquery );
$query->set('s', '' );
}
});
このようにしても、WordPressは要求を検索と見なすので、search.php
テンプレートを使用して結果を表示し、is_search()
を呼び出すと結果はTRUE
になります。
WordPressが検索を要求しないようにするには、手動で$query->query_vars['s']
の設定を解除し、$query->is_search
をfalseに設定する必要があります。
add_action( 'pre_get_posts', function( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$taxquery = array( ... );
$query->set( 'tax_query', $taxquery );
$query->set('s', '' );
unset( $query->query['s'] );
$query->is_search = FALSE;
}
});
そうすることで、WordPressは要求を検索と見なさなくなり、テンプレートとしてindex.php
を使用します。
他のテンプレートを使用したい場合は、 taxonomy.php
あなたは'template_include'
filterを使う必要があります:
add_action( 'pre_get_posts', function( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$taxquery = array( ... );
$query->set( 'tax_query', $taxquery );
$query->set('s', '' );
unset( $query->query['s'] );
$query->is_search = FALSE;
add_filter( 'template_include', function() {
return locate_template( 'taxonomy.php' )
}, 0 );
}
});