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.