web-dev-qa-db-ja.com

検索クエリからキーワードをフィルタリングする

私はグーグルで、どこかあちこちで検索しています( http://wordpress.stackexchange.com )。しかし、私が探していた解決策を得ることができないようです。

私がそれを尋ねたいのですが、私が検索クエリからフィルタしたい単語を除外することを可能にする何か解決策はありますか?例:私の検索ボックスを使用している訪問者が「email」と入力して検索すると、このキーワードでは投稿が見つかりません。すべての投稿には「Eメール」という言葉が含まれています。しかし、私は訪問者が電子メールを検索することによって検索結果を取得したくないです。私は彼らに最高の関連した結果を得てほしいです。

この質問( 検索から特定の語句を除外する )を見つけました。この質問は私がここで尋ねているものと似ていると思います。しかし、私はそれがどのように機能するのか理解していません。

訪問者が関連性のない投稿で結果を得られないように、検索結果から隠れているいくつかの単語を除外したいと思いました。何か解決策はありますか?ありがとうございます。

1
Jornes

あなたが正しく理解しているなら、あなたはwp_search_stopwordsフィルタタイプの解決策を探していません。

それで、これはあなたが言及した@kaiserによる素晴らしい答えの修正です:

/**
 * Exclude array of words from all search queries in the front-end
 *
 * Modification of http://wordpress.stackexchange.com/a/41100/26350 by @kaiser
 */

add_filter( 'posts_search', function( $search, $q )
{
    // Target all search queries in the front-end:
    if( is_admin() || ! $q->is_search() ) return $search;

    global $wpdb;

    $exclude_words = [ 'foo', 'bar' ]; // <-- Modify this to your needs!

    $sql = " AND {$wpdb->posts}.post_title   NOT LIKE '%%%s%%' 
             AND {$wpdb->posts}.post_content NOT LIKE '%%%s%%' ";

    foreach( (array) $exclude_words as $Word )
        $search .= $wpdb->prepare(
           $sql,
           $wpdb->esc_like( $Word ),
           $wpdb->esc_like( $Word )
        );

    return $search;
}, 10, 2 );

必要に応じて$exclude_wordsを修正する必要があります。ここでは、フロントエンド内のすべての検索クエリをターゲットにしています。

'%%%s%%'部分に注目してください。生成されたSQLクエリでは'%someword%'に変換されます。同じ文字列を繰り返し使用するために%1$sを使用することも魅力的ですが、$wpdb->prepare()ではサポートされていません。代わりにsprintfを使用する場合は、二重引用符で囲まれた文字列内の$s変数に変換されないようにする必要があります。"$s"

メインの検索クエリだけを変更したい場合は、次のようにします。

    if( is_admin() || ! $q->is_main_query() || ! $q->is_search() ) return $search;

このチェックの代わりに:

    if( is_admin() || ! $q->is_search() ) return $search;

更新:

bar検索からfooを除外するためにfoo -barで検索することができます。

それなら次のようなもので遊ぶことができます:

add_action( 'pre_get_posts', function( \WP_Query $q )
{
    if ( ! is_admin() && $q->is_main_query() && $q->is_search() )
        $q->set( 's', $q->get( 's' ) . ' -bar' );

} );

検索除外プレフィックスはwp_query_search_exclusion_prefixフィルタで変更できることに注意してください。

3
birgire