Como modificar o filtro posts_where apenas para a consulta de pesquisa


8

Estou usando o filtro posts_where para modificar as pesquisas do usuário em uma web, mas descubro que alguns widgets padrão como as "postagens mais recentes" também usam esse filtro e seu comportamento também é modificado. Estou tentando encontrar uma maneira de evitar que qualquer outra coisa que não seja a pesquisa de usuários use o filtro posts_where.

Este é o meu código:

add_filter( 'posts_where' , 'posts_where_statement' );

function posts_where_statement( $where ) {
   global $wp_query;
   global $expp;
   global $wpdb;
   $local_db = $wpdb->prefix."posts";
   $front_page_id = get_option('page_on_front');

   if ( ('page' != get_option('show_on_front') || $front_page_id != $wp_query->query_vars['page_id']) && (!($wp_query->is_search)) )
       return $where;

   //some $where modifications

   remove_all_actions ( '__after_loop');
   return $where;
}

Existe alguma outra função ou uma maneira de fazer esse gancho / filtro funcionar apenas com a consulta de pesquisa? (aquele que busca os resultados da entrada do usuário)

Respostas:


17

Problema:

O problema com seu snippet atual é que você está apenas verificando o objeto de consulta principal global, independentemente do objeto de consulta atual.

Gambiarra:

Observe que o segundo argumento de entrada para o posts_whereretorno de chamada do filtro é o objeto de consulta atual.

Use isso para determinar se é a principal consulta de pesquisa no front-end com:

add_filter( 'posts_where', function ( $where, \WP_Query $q ) 
{
    if( ! is_admin() && $q->is_main_query() && $q->is_search()) // No global $wp_query here
    {
        // ... your modifications
    }

    return $where;      

}, 10, 2 ); // Note the priority 10 and number of input arguments is 2

Há também o posts_searchfiltro para a parte de pesquisa WHERE, se é isso que você precisa modificar.

Mas, em geral, eu diria que apenas modifique o SQL gerado manualmente, se você realmente precisar e não tiver outras alternativas.


+1 para sugestão de tipo. Não é um fã de $qembora.
Michael Ecklund

1
obrigado, seria bom ter uma interface. sim, é um ponto válido em relação ao nome da variável. Devo admitir que as barras de rolagem de código deste site afetam a forma como escrevo as respostas - tento evitá-las ;-) Alguns usam, $wp_querymas que podem ser confundidos com o global $wp_query, outro uso $qryou $query, mas que também pode ser confuso quando estamos lidar com a consulta SQL ;-) Eu resolvi $qneste pequeno trecho e também parece mais simples do que, por exemplo. $wp_query_objGeralmente eu levo as múltiplas contestações se em uma linha separada
@MichaelEcklund

o que significa \ WP_Query $ q? Quero dizer, por que a barra?
Brett

@brett Se usarmos um espaço para nome em nosso plug-in, precisaremos disso para as aulas do WordPress, pois o WordPress usa o espaço global.
birgire
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.