web-dev-qa-db-fra.com

Filtrer les mots-clés de la requête de recherche

J'ai la recherche sur le google, quelque part là-bas et ici ( http://wordpress.stackexchange.com ). Mais je n'arrive pas à trouver la solution que je cherchais.

J'aimerais poser la question suivante: existe-t-il une solution qui me permette d’exclure les mots que je voulais filtrer des requêtes de recherche? Exemple: Lorsque les visiteurs utilisent mon champ de recherche, ils tapent "email" et recherchent, le résultat ne renvoie aucun message trouvé avec ce mot clé . Tout le message contient le mot "email". Mais je ne veux pas que les visiteurs obtiennent le résultat de la recherche en effectuant une recherche par courrier électronique. Je veux qu’ils obtiennent le meilleur résultat correspondant.

J'ai trouvé cette question ( Exclure un terme spécifique de la recherche ), je pense que cette question est similaire à ce que je demande ici. Mais je ne comprends pas comment ça marche.

Je voulais exclure quelques mots qui se cachent du résultat de la recherche afin que les visiteurs ne reçoivent pas de résultat avec un message non lié. Toute solution? Merci!

1
Jornes

Si je vous ai bien compris, vous ne recherchez pas le type de solution filtre wp_search_stopwords.

Voici donc une modification de l'excellente réponse de @kaiser à laquelle vous avez fait référence:

/**
 * 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 );

où vous devez adapter le $exclude_words à vos besoins. Ici, nous ciblons toutes les requêtes de recherche dans le front-end.

Notez la partie '%%%s%%'. Il sera transformé en '%someword%' dans la requête SQL générée. Il est également tentant d'utiliser %1$s pour répéter l'utilisation de la même chaîne, mais ce n'est pas supporté par $wpdb->prepare(). Si nous utilisions plutôt sprintf, nous devons nous assurer que ce n'est pas traduit dans la variable $s dans une chaîne avec des guillemets: "$s".

Si nous voulons seulement modifier la requête de recherche principale, nous pourrions utiliser:

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

au lieu de cette vérification:

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

Mise à jour:

Nous pouvons maintenant rechercher avec foo -bar pour exclure bar de la recherche foo.

Ensuite, on pourrait jouer avec quelque chose comme:

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

} );

Notez que le préfixe d'exclusion de recherche peut être modifié avec le filtre wp_query_search_exclusion_prefix.

3
birgire