it-swarm.com.de

Verhindern Sie den pre_get_posts-Filter für einen bestimmten Beitragstyp

Ich habe ein Problem mit pre_get_post filter.

Eigentlich habe ich 4 Beitragstypen. Post, Seiten, Events und Veranstaltungsort. Ich habe ein benutzerdefiniertes Feld namens "Stadt" für den Beitragstyp "Veranstaltung" und "Veranstaltungsort" erstellt.

Beim Erstellen eines benutzerdefinierten Felds kann ich einen Beitragstyp auswählen, auf dem das benutzerdefinierte Feld angezeigt werden soll.

Jetzt habe ich im Frontend-Teil einen Filter für pre_get_posts hinzugefügt und die Hauptabfrage so geändert, dass alle Posts aus einer bestimmten Stadt abgerufen werden.

Alle Dinge funktionieren perfekt auf Events und Veranstaltungsorten sowie auf einzelnen Seiten aber dieser Filter gilt auch für Posts und Seiten.

Was ich möchte ist, ** Ich möchte diesen Filter aus dem Beitragstyp entfernen, der nicht in diesem benutzerdefinierten Feld enthalten ist.

Ich habe versucht, mit $ wp_query-> query_vars ['page_id'] diesen Code, aber es funktioniert nicht mehr.

Kann mir jemand helfen, dies zu sortieren?

Zu Ihrer Information: Mein Code sieht aus wie:

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

Danke, Aezaz

4
Shaikh Aezaz

Verbessern Sie Ihre Bedingung, um eine Prüfung für den abgefragten Post-Typ aufzunehmen. Dies kann über die WP_Query::get Methode erfolgen

Also, wo hast du?

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

ersetzen mit

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

Beachten Sie auch, dass bei Verwendung dieses Codes als @offroff in seiner Antwort vermerkt, der Filter auf alle Abfragen angewendet wird, die Sie beim Besuch einer Seite ausgelöst haben (Hauptabfrage) und diejenigen, die über den Code ausgelöst wurden, mit new WP_Query ($args) (sekundäre Abfragen).

Fügen Sie eine Prüfung für $query->is_main_query() hinzu, damit der Codefilter keine Auswirkungen auf sekundäre Abfragen hat, sodass der Code wie folgt lautet:

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

Wordpress hat eine großartige Seite über Bedingte Tags

Zusammen mit !is_admin() möchten Sie möglicherweise && $query->is_main_query() ausführen.

Oben in Ihrer Funktion können Sie if(is_single() || is_page()) {return;} ausführen, wenn Sie nicht möchten, dass der Filter auf diese Seiten angewendet wird.

Andere Bedingungen, die Sie möglicherweise verwenden können, sind is_post_type_archive('event') && is_post_type_archive('venue')

Edit: Ich bin mir nicht sicher, ob ich dein Problem verstehe, aber jetzt dachte ich, das könnte dir helfen:

$query->set('post_type',array('event','venue'));
3
offroff