web-dev-qa-db-fra.com

La requête_var personnalisée provoque l'affichage de l'archive des articles sur la page d'accueil

Je rencontre un problème lié à une requête personnalisée var nommée date que j'ai ajoutée à l'aide de query_vars hook. Lorsque le paramètre date est présent dans l'URL de la page de couverture ( https://example.com/?date=23.08.2016 ), WordPress charge les archives de messages au lieu de la page de couverture. Lorsque d’autres paramètres aléatoires sont ajoutés au lien ( https://exemple.com/?foo=bar ) ou qu’aucun paramètre n’est présent, la page de couverture est correctement chargée de la page statique que j’ai définie.

La page de messages dans le backend est différente de la page de couverture.

J'ai ajouté la requête personnalisée var en utilisant le code suivant:

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

add_filter( "query_vars", "my_query_vars" );

Une idée pourquoi une telle chose se produit?

3
pawelkmpt

Après le débogage détaillé de WP::parse_request() et WP_Query::parse_query(), j'ai découvert que unset( $query_vars['date'] ); dans le filtre 'request' aide.

Il désactive fondamentalement la requête de date var avant que WP_Query::parse_query() soit invoqué afin que is_home() renvoie false.

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

Explication:

Les archives des charges sont chargées lorsque WP_Query::$is_home = true, j'ai donc remonté aux endroits où cette valeur est définie et, en bref, je pense que c'est comme ceci:

  1. $this->query_vars['post_type'] et $this->query_vars['name'] ne sont pas définis dans cette condition car la requête de date n'est affectée à aucun type de publication.
  2. Après plusieurs opérations, WP_Query::$is_singular est défini sur false here
  3. Et cela mène à WP_Query::$is_home = true.
2
pawelkmpt