Impedire il filtro pre_get_posts su uno specifico tipo di post
Sto riscontrando un problema con il filtro pre_get_post.
In pratica ho 4 tipi di post: Post, Pagine, Eventi e Luoghi. Ho creato un campo personalizzato chiamato città per i tipi di post eventi e luoghi.
Durante la creazione del campo personalizzato ho un'opzione per selezionare il tipo di post su cui voglio visualizzare quel campo personalizzato.
Ora, nella parte frontend ho aggiunto un filtro su pre_get_posts e ho modificato la query principale per ottenere tutti i post di una specifica città.
Tutto funziona perfettamente negli elenchi e nelle pagine singole di eventi e luoghi ma questo filtro viene applicato anche ai post e alle pagine.
Quello che voglio è **rimuovere questo filtro dai tipi di post che non includono quel campo personalizzato.
Ho provato con il codice $wp_query->query_vars['page_id'] ma non funziona più.
Qualcuno può aiutarmi a risolvere questo problema?
Nota: Il mio codice è così:
add_action( 'pre_get_posts', 'citywise_post_filter' );
function citywise_post_filter($query) {
global $wp_query;
if( isset( $_REQUEST['city_filter'] ) ){
$city = $_REQUEST['city_filter'];
}else{
$city = $_SESSION['CURR_CITY'];
}
if ( !is_admin() ){
$query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
$query->set( 'meta_value', $city );
return;
}
}
Grazie, Aezaz

Migliora il tuo condizionale per includere un controllo sul tipo di post interrogato. Può essere fatto tramite il metodo WP_Query::get
Quindi, dove hai
if ( !is_admin() ){
$query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
$query->set( 'meta_value', $city );
return;
}
sostituisci con
if ( ! is_admin() && in_array ( $query->get('post_type'), array('event','venue') ) ) {
$query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
$query->set( 'meta_value', $city );
return;
}
Nota inoltre che utilizzando questo codice, come @offroff ha sottolineato nella sua risposta, il filtro si applicherà a tutte le query, sia quelle attivate visitando una pagina (query principale) sia quelle attivate tramite codice, utilizzando new WP_Query ($args)
(query secondarie).
Per fare in modo che il codice del filtro non influisca sulle query secondarie, aggiungi un controllo per $query->is_main_query()
, quindi il codice diventa:
if ( is_admin() || ! $query->is_main_query() ) return;
if ( in_array ( $query->get('post_type'), array('event','venue') ) ) {
$query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
$query->set( 'meta_value', $city );
return;
}

Ciao G.M. Grazie mille. Funziona, ma solo nella pagina del singolo dettaglio. Non riesco a ottenere il tipo di post corrente nelle pagine di elenco delle categorie con $query->get('post_type') e get_post_type().

@ShaikhAezaz se nelle pagine di elenco delle categorie vuoi mescolare tipi di post come eventi, luoghi e post standard, probabilmente non puoi usare il trucco del filtro pre_get_post
. Se la tassonomia mostra solo eventi e/o luoghi (e nessun altro tipo di post) puoi usare is_tax('your_taxonomy')
per aggiungere un altro filtro. Il tuo obiettivo non è molto chiaro, forse puoi aggiungere maggiori dettagli nella domanda.

WordPress ha un'ottima pagina riguardo i tag condizionali
Insieme a !is_admin()
potresti voler usare && $query->is_main_query()
All'inizio della tua funzione puoi inserire if(is_single() || is_page()) {return;}
se non vuoi che il filtro venga applicato su quelle pagine.
Altri condizionali che potresti utilizzare sono is_post_type_archive('event') && is_post_type_archive('venue')
Modifica: Non sono sicuro di aver capito il tuo problema, ma ora penso che questo potrebbe aiutarti:
$query->set('post_type',array('event','venue'));

Ciao offroff, ho usato il codice suggerito da G.M. e funziona per me per le pagine di elenco delle categorie e tassonomie, ma ora non riesco a ottenere il post type nelle pagine di elenco delle categorie e tassonomie. Conosci qualche soluzione per questo?
