Faça uma pesquisa WP Query corresponder exatamente ao termo de pesquisa

2

Estou usando o WP Query e os resultados que retornam ao usar o termo de pesquisa não estão funcionando como desejo. Por exemplo, pesquisar por 'arte' também retorna resultados para palavras contendo 'arte' como 'parte'. Como posso evitar isso? e apenas retorne resultados para 'arte' contendo a palavra exata 'arte'.

    
por Andrew Welch 05.02.2015 / 14:23

2 respostas

4

Esta é realmente uma pergunta complicada, pois ao declarar exato , há duas maneiras de interpretar sua pergunta -

  1. Apenas encontre postagens em que o título inteiro ou todo o conteúdo corresponda exatamente. Por exemplo, se você pesquisar Meu post é super , você não teria retornado uma postagem com o título Meu post é super incrível .
  2. Postagens finas onde a frase exata existe, não apenas parte de uma frase. Por exemplo, se você pesquisar sua casa , você não teria retornado uma postagem com o título Eu amo essa casa , mas você teria uma postagem com o título eu ' estou indo para sua casa (exemplos de rubish, mas espero que você entenda o ponto).

Felizmente você pode fazer isso, mas o método 1 é de longe o mais simples. Adicione um destes exemplos ao seu arquivo 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;

}

A função my_make_search_exact() será chamada toda vez que uma consulta for feita, usando o gancho de ação pre_get_posts .

Para garantir que não mexemos com a consulta quando não precisarmos, dentro da função, verificamos que NÃO estamos visualizando a área administrativa, que estamos construindo a consulta principal e que estamos fazendo uma pesquisa.

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 para tinyGod por esta resposta - enlace

    
por David Gard 05.02.2015 / 16:12
4

Acho que alguém já respondeu a isso antes: Verifique esta resposta , de @ Sunyatasattva

Mas, aparentemente, o WP_Query suporta alguns parâmetros extras de pesquisa:

  

's' = > $ s, // (string) - Passa ao longo do   variável de string de consulta de uma pesquisa.

     

'exato' = > true, // (bool) - flag para torná-lo   corresponde apenas a títulos / postagens inteiros - o valor padrão é falso.

     

'sentença' = > true, // (bool) - flag para fazer isso   uma pesquisa por frase - o valor padrão é falso.

Mais em: enlace

Espero que ajude,

    
por Renato Gomes 05.02.2015 / 14:43