web-dev-qa-db-de.com

Benutzerdefinierter Suchfilter führt zu Problemen mit menu und query_posts

Ich verwende einen benutzerdefinierten Suchfilter (mit meiner benutzerdefinierten Abfrage var type), wie folgt:

function fteh_pre_get_posts( $query ){
    if( isset( $query->query_vars['type'] ) )
        $types = explode( ',', $query->query_vars['type'] );
        $query->set( 'post_type', $types );

    return $query;
}

if ( ! is_admin() ) {
     add_action( 'pre_get_posts', 'fteh_pre_get_posts' );
}

Ich habe festgestellt, dass dadurch ein registriertes benutzerdefiniertes Menü ausgeblendet wird.

Ohne die !is_admin() hat es auch den Menü-Builder verwirrt (es wurden einige Posts anstatt aller meiner Seiten im Abschnitt Pages angezeigt). Das Hinzufügen der Bedingung half dabei, aber ich kann nicht herausfinden, wie ich mein Menü zurückholen kann.

Es wurde ordnungsgemäß registriert und aufgerufen, erstellt und an der richtigen Themenposition gespeichert und vor dem Hinzufügen dieses Filters funktioniert. Jetzt wird nur noch der fallback_cb (in meinem Fall der Standard-wp_page_menu) anstelle meines benutzerdefinierten Menüs verwendet.

Sobald ich diese Aktion von pre_get_posts entferne, ist alles wieder normal.

Ich verstehe nicht, in welcher Beziehung pre_get_posts hook zu den benutzerdefinierten Menüs steht. Weiß jemand, warum dies zu einem so seltsamen Verhalten führen würde?

UPDATE:

Ich habe jetzt ein anderes Problem entdeckt, das speziell durch das oben genannte Snippet verursacht wurde - alle meine benutzerdefinierten Abfragen auf Seiten (einfache Dinge wie query_posts('post_type=organization')) funktionierten nicht mehr und zeigten normale Beiträge anstelle der in query_posts eingerichteten benutzerdefinierten Beitragstypen an.

5
Justine

Verwenden Sie is_main_query() , um nur die Hauptabfrage zu ändern, damit das Menü nicht beeinträchtigt wird.

Versuchen Sie dies:

add_action( 'pre_get_posts', 'fteh_pre_get_posts' );

    function fteh_pre_get_posts( $query ){
        if( !is_admin() && $query->is_main_query() && isset( $query->query_vars['type'] ) )
            $types = explode( ',', $query->query_vars['type'] );
            $query->set( 'post_type', $types );

        return $query;
    }
12
Sisir

Es könnte sein, dass ich ein wenig zu spät zur Party komme, aber das ist es, was ich getan habe, um mein Problem zu beheben, dass das Menü verschwindet, wenn ich benutzerdefinierte Beiträge nach Kategorie ansehe. Ich verwende Standardpostkategorien und keine benutzerdefinierten Taxonomien.

public function include_custom_post_search( $query ) {
        if( ! is_admin() ) {

            if( is_category() && 'nav_menu_item' !== $query->get('post_type') )
                $query->set( 'post_type', 'custom_post_place_slug' );
        }
    }

    add_action( 'pre_get_posts', 'include_custom_post_search' );
0
Andrew Schultz