webentwicklung-frage-antwort-db.com.de

Benutzerdefinierte query_var bewirkt das Anzeigen des Beitragsarchivs auf der Startseite

Ich habe ein Problem, das durch die benutzerdefinierte Abfragevariable date verursacht wird, die ich mit dem Hook query_vars hinzugefügt habe. Wenn der Parameter date in der URL der Startseite ( https://example.com/?date=23.08.2016 ) vorhanden ist, lädt WordPress das Archiv der Beiträge und nicht nur die Startseite. Wenn andere zufällige Parameter zum Link hinzugefügt werden ( https://example.com/?foo=bar ) oder keine Parameter vorhanden sind, wird die Startseite korrekt geladen, die statische Seite, die ich definiert habe.

Die Posts-Seite im Backend unterscheidet sich von der Startseite.

Ich habe eine benutzerdefinierte Abfragevariable mit folgendem Code hinzugefügt:

my_query_vars( $vars ) {
    $vars[] = 'date';
    return $vars;
}

add_filter( "query_vars", "my_query_vars" );

Irgendeine Idee, warum so etwas passiert?

3
pawelkmpt

Nach dem detaillierten Debuggen von WP::parse_request() und WP_Query::parse_query() habe ich herausgefunden, dass unset( $query_vars['date'] ); im 'request'-Filter hilft.

Grundsätzlich wird die Datumsabfrage var deaktiviert, bevor WP_Query::parse_query() aufgerufen wird, sodass is_home() false zurückgibt.

add_filter( 'request', function( $query_vars ) {
        global $wp_query, $wp;

        if ( ! $wp_query->is_main_query() ) {
            return $query_vars;
        }

        $qv_keys = array_keys( $wp->query_vars );

        if ( ! ( in_array( 'product_cat', $qv_keys, true )
           || in_array( 'product_tag', $qv_keys, true )
           || in_array( 'post_type', $qv_keys, true ) && 'product' === $wp->query_vars['post_type']
           || in_array( 's', $qv_keys, true )
        ) ) {
            unset( $query_vars['date'] );
        }

        return $query_vars;
} );

Erklärung:

Das Archiv der Beiträge wird geladen, wenn WP_Query::$is_home = true. Ich habe also die Stellen zurückverfolgt, an denen dieser Wert festgelegt ist.

  1. $this->query_vars['post_type'] und $this->query_vars['name'] sind nicht gesetzt in diesem Zustand da die Datumsabfrage var keinem Beitragstyp zugeordnet ist.
  2. Im Ergebnis wird nach vielen Operationen WP_Query::$is_singular auf false gesetzt hier
  3. Und es führt zu WP_Query::$is_home = true.
2
pawelkmpt