Prevenirea filtrului pre_get_posts pentru anumite tipuri de postări

15 feb. 2014, 18:00:18
Vizualizări: 48.1K
Voturi: 8

Mă confrunt cu o problemă legată de filtrul pre_get_post.

În prezent am 4 tipuri de postări: Post, Pages, Events și Venue. Am creat un câmp personalizat numit city pentru tipurile de postări event și venue.

La crearea câmpului personalizat am o opțiune pentru a selecta tipul de postare pe care vreau să afișez acel câmp personalizat.

Acum, în partea de front-end am adăugat un filtru pe pre_get_posts și am modificat query-ul principal pentru a obține toate postările dintr-un oraș specific.

Totul funcționează perfect pentru listările și paginile individuale de evenimente și locații dar acest filtru se aplică și pentru postări și pagini.

Ceea ce doresc este să elimin acest filtru pentru tipurile de postări care nu includ acel câmp personalizat.

Am încercat cu codul $wp_query->query_vars['page_id'] dar nu mai funcționează.

Mă poate ajuta cineva să rezolv această problemă?

Pentru informare: Codul meu arată astfel:

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

Mulțumesc, Aezaz

0
Toate răspunsurile la întrebare 2
3
21

Îmbunătățește condiționalul tău pentru a include o verificare a tipului de postare interogat. Acest lucru poate fi realizat prin metoda WP_Query::get.

Deci, unde ai

if ( !is_admin() ){
    $query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
    $query->set( 'meta_value', $city );
    return;
} 

înlocuiește cu

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

De asemenea, reține că folosind acest cod, așa cum a menționat @offroff în răspunsul său, filtrul se va aplica tuturor interogărilor, atât celor declanșate prin vizitarea unei pagini (interogarea principală), cât și celor declanșate prin cod, folosind new WP_Query ($args) (interogări secundare).

Pentru a face ca filtrul să nu afecteze interogările secundare, adaugă o verificare pentru $query->is_main_query(), astfel încât codul să devină:

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
Comentarii

Salut G.M. Mulțumesc mult. Funcționează, dar doar pe pagina de detaliu. Nu am reușit să obțin tipul de postare curent pe paginile de listare a categoriilor cu $query->get('post_type') și get_post_type().

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

@ShaikhAezaz dacă pe paginile de listare a categoriilor vrei să ai amestec de tipuri de postări (event, venue și postări standard), probabil nu poți folosi un filtru pre_get_post. Dacă taxonomia afișează doar event și/sau venue (și nu alte tipuri de postări), poți folosi is_tax('your_taxonomy') pentru a adăuga un alt filtru. Scopul tău nu e foarte clar, poate poți adăuga mai multe detalii în întrebare.

gmazzap gmazzap
16 feb. 2014 19:38:58

G.M. Da, am și alte tipuri custom de postări. Și tocmai am adăugat câmpul meta pentru oraș la event și place, dar nu și la alte postări. Așa că vreau doar un filtru care să returneze tipul de postare curent.

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

WordPress are o pagină excelentă despre etichetele condiționale

Împreună cu !is_admin() ai putea dori să folosești && $query->is_main_query()

La începutul funcției tale poți folosi if(is_single() || is_page()) {return;} dacă nu dorești ca filtrul să se aplice pe acele pagini.

Alte condiționale pe care le-ai putea folosi sunt is_post_type_archive('event') && is_post_type_archive('venue')

Edit: Nu sunt sigur că am înțeles problema ta, dar acum cred că acest lucru te-ar putea ajuta:

$query->set('post_type',array('event','venue'));
15 feb. 2014 18:18:23
Comentarii

Salut offroff, am folosit codul sugerat de G.M. și funcționează pentru mine pe paginile de listare a categoriilor și taxonomiilor, dar acum nu reușesc să obțin tipul de postare pe aceste pagini. Știi vreo soluție pentru asta?

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

Poate trebuie să setezi tipul de postare, de exemplu if(is_category()) {$query->set('post_type',array('event','venue')); }. Este dificil să știm cum să rezolvăm problema ta pentru că nu știm ce șabloane folosești.

offroff offroff
16 feb. 2014 12:44:19