Haga que una búsqueda WP Query coincida exactamente con el término de búsqueda

2

Estoy usando WP Query y los resultados que se obtienen al usar el término de búsqueda no funcionan como deseo. Por ejemplo, la búsqueda de 'arte' también da como resultado palabras que contienen 'arte', como 'parte'. ¿Cómo puedo evitar esto? y simplemente devuelva los resultados para 'arte' que contiene la palabra exacta 'arte'.

    
pregunta Andrew Welch 05.02.2015 - 14:23

2 respuestas

4

Esta es en realidad una pregunta difícil, ya que al decir exacto hay dos maneras en que uno puede interpretar su pregunta:

  1. Solo encuentra publicaciones donde coincidan exactamente el título completo o todo el contenido. Por ejemplo, si buscas Mi publicación es super , no habrías devuelto una publicación con el título Mi publicación es super impresionante .
  2. Finos publicaciones donde existe la frase exacta, no solo parte de una frase. Por ejemplo, si busca su casa , no habría devuelto una publicación con el título Amo esta casa , pero haría una publicación con el título Yo ' Voy a su casa (ejemplos de rubish, pero espero que te entiendas).

Por suerte, puedes hacerlo, pero el método 1 es, con mucho, el más simple. Añade 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 alterar la consulta cuando no es necesario, dentro de la función verificamos que NO estamos 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 - enlace

    
respondido por el David Gard 05.02.2015 - 16:12
4

Creo que alguien más ha respondido esto antes: Marque esta respuesta , en @ Sunyatasattva

Pero al parecer WP_Query admite algunos parámetros de búsqueda adicionales:

  

's' = > $ s, // (cadena) - Pasa a lo largo del   variable de cadena de consulta de una búsqueda.

     

'exacto' = > true, // (bool) - flag para hacerlo   solo coincide con títulos completos / publicaciones: el valor predeterminado es falso.

     

'frase' = > true, // (bool) - flag para hacerlo funcionar   una búsqueda de frase: el valor predeterminado es falso.

Más información en: enlace

Espero que ayude,

    
respondido por el Renato Gomes 05.02.2015 - 14:43

Lea otras preguntas en las etiquetas