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


8

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

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

回答:


17

問題:

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

回避策:

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

posts_search変更が必要な場合は、WHERE検索部分のフィルターもあります。

ただし、一般に、生成されたSQLを手動で変更するのは、他の方法がなくてはならない場合に限ります。


タイプヒンティングの場合は+1。でもファンでは$qありません。
Michael Ecklund 2017年

1
おかげで、インターフェースがあるといいですね。はい、それは変数名に関して有効なポイントです。私はこのサイト上のコードのスクロールバーが、私は答えを書く方法に影響を与えていることを認めなければならない-私はそれらを避けるために;-)一部の使用を試みる$wp_queryが、それはグローバルと混同される可能性があり$wp_query、他の使用$qryまたは$query、それはまた、我々がいるときに混乱するかもしれませんSQLクエリを扱う;-)私はのために定住$qこの短いスニペットでは、それはまた、例えばよりも簡単に見える$wp_query_obj別々のラインにcontidtionsがあれば-@MichaelEcklund .Usually私は複数を取る
birgire

\ WP_Query $ qはどういう意味ですか?なぜスラッシュなのか?
ブレット2018年

@brett プラグインで名前空間を使用する場合、WordPressがグローバルスペースを使用するため、WordPressクラスにこれが必要です。
バージィ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.