web-dev-qa-db-ja.com

検索クエリ専用のposts_whereフィルタを変更する方法

Web上のユーザー検索を変更するためにposts_whereフィルタを使用していますが、 "もっと最近の投稿"のようなデフォルトのウィジェットでもこのフィルタを使用しており、その動作も変更されています。ユーザー検索以外のものがposts_whereフィルターを使用しないようにする方法を見つけようとしています。

これは私のコードです:

add_filter( 'posts_where' , 'posts_where_statement' );

function posts_where_statement( $where ) {
   global $wp_query;
   global $expp;
   global $wpdb;
   $local_db = $wpdb->prefix."posts";
   $front_page_id = get_option('page_on_front');

   if ( ('page' != get_option('show_on_front') || $front_page_id != $wp_query->query_vars['page_id']) && (!($wp_query->is_search)) )
       return $where;

   //some $where modifications

   remove_all_actions ( '__after_loop');
   return $where;
}

このフック/フィルタを検索クエリでのみ機能させるための他の機能や方法はありますか? (ユーザー入力から結果を取得するもの)

7
dtd93

問題:

現在のスニペットの問題は、現在のクエリーオブジェクトが何であっても、グローバルメインクエリーオブジェクトをチェックしているだけであるということです。

回避策:

posts_whereフィルタコールバックの2番目の入力引数は、現在のクエリオブジェクトです。

フロントエンドのメインの検索クエリであるかどうかを判断するためにこれを使用します。

add_filter( 'posts_where', function ( $where, \WP_Query $q ) 
{
    if( ! is_admin() && $q->is_main_query() && $q->is_search()) // No global $wp_query here
    {
        // ... your modifications
    }

    return $where;      

}, 10, 2 ); // Note the priority 10 and number of input arguments is 2

WHERE検索部分用に posts_search フィルターもあります。

しかし、一般的には、生成されたSQLを手動で変更することだけをお勧めします。それ以外の選択肢が本当に必要であり、他に選択肢がない場合のみです。

15
birgire