web-dev-qa-db-ja.com

Pre_get_postsを使用して検索クエリを書き換えて複数の分類法からの投稿を表示する

これは簡単なはずですが、問題はありません。

ユーザーが「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 );
4
Jairus Khan

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 );
  }

});
7
gmazzap