web-dev-qa-db-fra.com

Faire un WP La recherche de requête correspond exactement au terme recherché

J'utilise WP Query et les résultats obtenus lorsque le terme de recherche est utilisé ne fonctionnent pas comme je le souhaite. Par exemple, la recherche sur "art" renvoie également les résultats des mots contenant "art", tels que "partie". Comment puis-je éviter ça? et retourne juste les résultats pour 'art' contenant le mot exact 'art'.

3
Andrew Welch

C'est en fait une question délicate, car en énonçant exact il y a deux façons d'interpréter votre question -

  1. Ne trouvez que les messages dont tout le titre ou tout le contenu correspond exactement. Par exemple, si vous recherchez Mon message est super vous n’auriez pas renvoyé un message avec le titre Mon message est super génial .
  2. Beaux messages où la phrase exacte existe, pas seulement une partie d'une phrase. Par exemple, si vous recherchez sa maison vous n’auriez pas retourné une publication portant le titre J'aime cette maison , mais vous souhaitez une publication portant le titre je vais à sa maison (exemples typiques, mais j'espère que vous obtenez le point).

Heureusement, vous pouvez le faire, mais la méthode 1 est de loin la plus simple. Ajoutez l’un de ces exemples à votre functions.php fichier -


Méthode 1

add_action('pre_get_posts', 'my_make_search_exact', 10);
function my_make_search_exact($query){

    if(!is_admin() && $query->is_main_query() && $query->is_search) :
        $query->set('exact', true);
    endif;

}

La fonction my_make_search_exact() sera appelée à chaque fois qu'une requête est effectuée, à l'aide du hook d'action pre_get_posts.

Pour nous assurer de ne pas perturber la requête lorsque nous n'en avons pas besoin, nous vérifions dans la fonction que nous ne visualisons PAS la zone d'administration, que nous construisons la requête principale et que nous effectuons une recherche.


Méthode 2

add_filter('posts_search', 'my_search_is_exact', 20, 2);
function my_search_is_exact($search, $wp_query){

    global $wpdb;

    if(empty($search))
        return $search;

    $q = $wp_query->query_vars;
    $n = !empty($q['exact']) ? '' : '%';

    $search = $searchand = '';

    foreach((array)$q['search_terms'] as $term) :

        $term = esc_sql(like_escape($term));

        $search.= "{$searchand}($wpdb->posts.post_title REGEXP '[[:<:]]{$term}[[:>:]]') OR ($wpdb->posts.post_content REGEXP '[[:<:]]{$term}[[:>:]]')";

        $searchand = ' AND ';

    endforeach;

    if(!empty($search)) :
        $search = " AND ({$search}) ";
        if(!is_user_logged_in())
            $search .= " AND ($wpdb->posts.post_password = '') ";
    endif;

    return $search;

}

Merci à tinyGod pour cette réponse - http://tinygod.pt/make-wordpress-search-exact/

5
David Gard

Je pense que quelqu'un d'autre a déjà répondu à cette question: Cochez cette réponse , de @Sunyatasattva

Mais apparemment, WP_Query prend en charge des paramètres de recherche supplémentaires:

's' => $ s, // (chaîne) - Transmet la variable chaîne de requête à partir d'une recherche.

'exact' => true, // (bool) - indicateur pour qu'il ne corresponde qu'aux titres/messages entiers - La valeur par défaut est false.

'phrase' => true, // (bool) - indicateur permettant de faire une recherche d'expression - La valeur par défaut est false.

Plus à: https://Gist.github.com/luetkemj/2023628

J'espère que ça aide,

5
Renato Gomes