Come modificare il filtro posts_where solo per la query di ricerca


8

Sto usando il filtro posts_where per modificare le ricerche degli utenti su un Web, ma scopro che alcuni widget predefiniti come i "post più recenti" usano anche questo filtro e anche il loro comportamento viene modificato. Sto cercando di trovare un modo per evitare che qualsiasi cosa diversa dalle ricerche degli utenti utilizzi il filtro posts_where.

Questo è il mio codice:

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;
}

Esiste un'altra funzione o un modo per far funzionare questo hook / filtro solo con la query di ricerca? (quello che recupera i risultati dall'input dell'utente)

Risposte:


17

Problema:

Il problema con lo snippet corrente è che stai solo verificando l'oggetto di query principale globale, indipendentemente dall'oggetto di query corrente.

Soluzione:

Si noti che il secondo argomento di input per il posts_wherecallback del filtro è l'oggetto query corrente.

Utilizzalo per determinare se è la query di ricerca principale sul 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

C'è anche il posts_searchfiltro per la parte di ricerca WHERE, se è quello che devi modificare.

Ma in generale direi di modificare manualmente l'SQL generato solo se, davvero, non hai altre alternative.


+1 per i suggerimenti sul tipo. Non è un fan $qperò.
Michael Ecklund,

1
grazie, sarebbe bello avere un'interfaccia. sì è un punto valido per quanto riguarda il nome della variabile. Devo ammettere che le barre di scorrimento del codice su questo sito, influenzano il modo in cui scrivo le risposte - cerco di evitarle ;-) Alcuni usi $wp_queryma potrebbero essere confusi con il globale $wp_query, altri usi $qryo $query, ma potrebbero anche essere fonte di confusione quando siamo occuparsi di query SQL ;-) Mi sono accontentato di $qquesto breve frammento e sembra anche più semplice di ad es. $wp_query_objDi solito prendo le molteplici contese in una linea separata
@MichaelEcklund

cosa significa \ WP_Query $ q? Intendo perché la barra?
Brett,

@brett Se utilizziamo uno spazio dei nomi nel nostro plugin, allora abbiamo bisogno di questo per le classi di WordPress, poiché WordPress utilizza lo spazio globale.
birgire,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.