Hacer que la búsqueda de WP Query coincida exactamente con el término de búsqueda
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'.
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,

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.

Esta es en realidad una pregunta complicada, ya que al decir exacto hay dos formas en las que se puede interpretar tu pregunta:
- 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.
- 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/
