Impedire il filtro pre_get_posts su uno specifico tipo di post

15 feb 2014, 18:00:18
Visualizzazioni: 48.1K
Voti: 8

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

0
Tutte le risposte alla domanda 2
3
21

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;
}
15 feb 2014 21:25:39
Commenti

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().

Shaikh Aezaz Shaikh Aezaz
16 feb 2014 09:42:33

@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.

gmazzap gmazzap
16 feb 2014 19:38:58

G.M. Sì, ho anche altri tipi di post personalizzati. E ho appena aggiunto il campo meta della città agli eventi e ai luoghi ma non agli altri post. Quindi voglio solo il filtro che restituisca il tipo di post corrente.

Shaikh Aezaz Shaikh Aezaz
17 feb 2014 19:48:09
2

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'));
15 feb 2014 18:18:23
Commenti

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?

Shaikh Aezaz Shaikh Aezaz
16 feb 2014 11:47:26

Forse devi impostare il post type, ad esempio if(is_category()) {$query->set('post_type',array('event','venue')); }. È difficile sapere come risolvere il tuo problema perché non sappiamo quali template stai usando.

offroff offroff
16 feb 2014 12:44:19