web-dev-qa-db-fra.com

Comment reset_postdata restaure-t-il la publication de la boucle de requête principale?

Comment fonctionne reset_postdata? Les docs disent:

restaurer la variable globale $ post de la boucle de requête principale après une boucle de requête secondaire à l'aide du nouveau WP_Query

Mais dans la classe, il prend la publication "actuelle" de l'instance actuelle WP_Query et la définit comme étant le $post global. Alors, comment restaure-t-il la publication de la boucle de requête principale?

Le WP_Query classe .

7
Paul

WP_Query::reset_postdata() définit la variable de publication globale ($GLOBALS['post'] === $post) sur la publication actuelle dans la boucle de l'instance actuelle de WP_Query.

public function reset_postdata() {
    if ( ! empty( $this->post ) ) {
        $GLOBALS['post'] = $this->post;
        $this->setup_postdata( $this->post );
    }
}

Cela signifie que si vous exécutez une requête personnalisée sur une page, $post conservera le dernier message de la boucle de cette requête personnalisée. Que vous pouvez vous tester en ajoutant

?><pre><?php var_dump($post); ?></pre><?php 

directement après la boucle de votre requête personnalisée.

Il en va de même pour la requête principale après la boucle, $post conservera la dernière publication de la requête principale et la première publication de la boucle avant la boucle.

Voici un test simple pour tester le $post global. Vous pouvez l'ajouter dans votre fichier de fonctions et charger n'importe quelle page de votre site.

add_action( 'wp_head', function()
{
    global $post;
    ?><pre><?php var_dump($post->ID); ?></pre><?php
}):
add_action( 'wp_footer', function()
{
    global $post;

    ?><pre><?php var_dump($post->ID); ?></pre><?php 

    $q = new WP_Query( 'posts_per_page=3' );
    while ( $q->have_posts() ) {
        $q->the_post();

        ?><pre><?php var_dump($post->ID); ?></pre><?php 
        the_title();

    }   

    ?><pre><?php var_dump($post->ID); ?></pre><?php 
    wp_reset_postdata();
    ?><pre><?php var_dump($post->ID); ?></pre><?php 
});

Alors, comment restaure-t-il la publication de la boucle de requête principale?

Ceci est fait en appelant wp_reset_postdata() qui réinitialise le $post global à la publication actuelle dans la boucle de la requête principale. Ceci est généralement le premier du dernier message en fonction de l'ajout de votre requête personnalisée avant ou après la boucle de requête principale.

Regardons comment wp_reset_postdata() le fait

function wp_reset_postdata() {
    global $wp_query;

    if ( isset( $wp_query ) ) {
        $wp_query->reset_postdata();
    }
}

Comme vous pouvez le constater, wp_reset_postdata() n’est qu’un wrapper pour WP_Query::reset_postdata(). La partie importante ici est qu'il s'agit d'un wrapper pour la méthode objet de la requête principale, $wp_query->reset_postdata();.

N'oubliez pas que la requête principale utilise également WP_Query. Voici comment l'objet de requête principal est défini

/**
 * WordPress Query object
 * @global WP_Query $wp_the_query
 * @since 2.0.0
 */
$GLOBALS['wp_the_query'] = new WP_Query();

/**
 * Holds the reference to @see $wp_the_query
 * Use this global for WordPress queries
 * @global WP_Query $wp_query
 * @since 1.5.0
 */
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];

Donc, ce que wp_reset_postdata() fait, il prend la publication en cours dans l'objet de requête principal et le définit comme étant le $post global; c'est ainsi que WP_Query::reset_postdata() définit $post sur la publication en cours de la requête principale.

7
Pieter Goosen