Cómo modificar el filtro posts_where solo para la consulta de búsqueda

8

Estoy usando el filtro posts_where para modificar las búsquedas de los usuarios en una web, pero descubrí que algunos widgets predeterminados como las "publicaciones más recientes" también usan este filtro y su comportamiento también se modifica. Estoy tratando de encontrar una manera de evitar que cualquier cosa que no sean las búsquedas de los usuarios utilicen el filtro posts_where.

Este es mi 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;
}

¿Hay alguna otra función o una forma de hacer que este enlace / filtro solo funcione con la consulta de búsqueda? (el que obtiene los resultados de la entrada del usuario)

dtd93
fuente

Respuestas:

17

Problema:

El problema con su fragmento actual es que solo está verificando el objeto de consulta principal global, sin importar cuál sea el objeto de consulta actual.

Solución alterna:

Tenga en cuenta que el segundo argumento de entrada para la posts_wheredevolución de llamada del filtro es el objeto de consulta actual.

Use eso para determinar si es la consulta de búsqueda principal en el front-end con:

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

También está el posts_searchfiltro para la parte de búsqueda WHERE, si eso es lo que necesita modificar.

Pero, en general, diría que solo debe modificar el SQL generado a mano si realmente debe y no tiene otras alternativas.

Birgire
fuente
+1 para sugerencias de tipo. $qAunque no soy fanático .
Michael Ecklund
1
gracias, sería bueno tener una interfaz. sí, es un punto válido con respecto al nombre de la variable. Debo admitir que las barras de desplazamiento de código en este sitio afectan la forma en que escribo las respuestas; trato de evitarlas ;-) Algunos usos, $wp_querypero eso podría confundirse con el uso global $wp_query, otro uso $qryo $query, pero eso también puede ser confuso cuando estamos lidiando con la consulta SQL ;-) Me conformé con $qeste breve fragmento y también parece más simple que, por ejemplo, por lo $wp_query_objgeneral, tomo las múltiples if-contidtions en una línea separada @MichaelEcklund
birgire el
¿Qué significa \ WP_Query $ q? Quiero decir, ¿por qué la barra?
brett
@brett Si usamos un espacio de nombres en nuestro complemento, entonces lo necesitamos para las clases de WordPress, ya que WordPress usa el espacio global.
Birgire