Hacer que la búsqueda de WP Query coincida exactamente con el término de búsqueda

5 feb 2015, 15:23:44
Vistas: 31.6K
Votos: 5

Estoy usando WP Query y los resultados que se devuelven al usar el término de búsqueda no funcionan como deseo. Por ejemplo, al buscar 'art' también devuelve resultados para palabras que contienen 'art' como 'part'. ¿Cómo puedo evitar esto? y solo devolver resultados para 'art' que contengan exactamente la palabra 'art'.

1
Comentarios

posible duplicado de Búsqueda de coincidencia exacta en Wordpress

RRikesh RRikesh
5 feb 2015 16:30:27
Todas las respuestas a la pregunta 2
1
12

Creo que alguien más ya respondió esto antes: Revisa esta respuesta, de @Sunyatasattva

Pero aparentemente WP_Query soporta algunos parámetros de búsqueda adicionales:

's' => $s, //(string) - Pasa la variable de cadena de consulta desde una búsqueda.

'exact' => true, //(bool) - Bandera para hacer que coincida solo con títulos/publicaciones completos - El valor por defecto es false.

'sentence' => true, //(bool) - Bandera para realizar una búsqueda por frase - El valor por defecto es false.

Más información en: https://gist.github.com/luetkemj/2023628

Espero que te ayude,

5 feb 2015 15:43:07
Comentarios

Lamentablemente el parámetro sentence => true no hace lo que el usuario quiere. Más bien significa que WP solo devolverá posts donde exista parte de una oración, cuando normalmente devolvería coincidencias para parte OR de OR una OR oración. En ambos casos los resultados no serían los requeridos si se hiciera una búsqueda de arte.

David Gard David Gard
5 feb 2015 17:20:29
2
11

Esta es en realidad una pregunta complicada, ya que al decir exacto hay dos formas en las que se puede interpretar tu pregunta:

  1. Solo encontrar publicaciones donde el título completo o el contenido completo coincidan exactamente. Por ejemplo, si buscas Mi publicación es genial no obtendrías una publicación con el título Mi publicación es genialmente increíble.
  2. Encontrar publicaciones donde existe la frase exacta, no solo parte de una frase. Por ejemplo, si buscas su casa no obtendrías una publicación con el título Me encanta esta casa, pero sí una publicación con el título Voy a su casa (ejemplos simples, pero espero que entiendas el punto).

Afortunadamente, puedes hacer cualquiera de los dos, pero el método 1 es con mucho el más simple. Agrega cualquiera de estos ejemplos a tu archivo functions.php:


Método 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 función my_make_search_exact() se llamará cada vez que se realice una consulta, utilizando el gancho de acción pre_get_posts.

Para asegurarnos de no interferir con la consulta cuando no es necesario, dentro de la función verificamos que NO estemos viendo el área de administración, que ESTAMOS construyendo la consulta principal y que ESTAMOS realizando una búsqueda.


Método 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;

}

Crédito a tinyGod por esta respuesta - http://tinygod.pt/make-wordpress-search-exact/

5 feb 2015 17:12:05
Comentarios

gracias, al final lo resolvimos nosotros mismos pero has hecho una buena descripción.

Andrew Welch Andrew Welch
6 feb 2015 01:36:09

@David Gard Muchas gracias. Estoy obteniendo el resultado exacto que quería. :)

Ravi Ravi
9 may 2019 18:24:23