web-dev-qa-db-fra.com

Quand devriez-vous utiliser wp_reset_postdata vs wp_reset_query?

On dirait que la moitié des didacticiels du Codex utilisent wp_reset_postdata() et que l'autre moitié utilise wp_reset_query(). Quel est le problème? Peut-être utiliser les deux? Qu'en est-il de rewind_posts()? Je demande une réponse basée sur des faits , pas sur des opinions.

1
Narek Zakarian

wp_reset_postdata() réinitialise la valeur de la variable global $post à la propriété post de la requête principale, quelle que soit la dernière publication de la requête principale. Vous feriez cela si vous aviez utilisé setup_postdata() ou $query->the_post() sur une requête personnalisée. Ces deux éléments remplacent la variable globale $post de sorte que les fonctions telles que the_title() obtiennent le titre correct pour la publication en cours dans une boucle.

wp_reset_query() réinitialise la requête principale à ce qu'elle était lors de son chargement initial. Je ne suis au courant que si cela se produit si vous avez utilisé query_posts() pour le modifier. Vous ne devriez pas faire cela en tout cas. Cette fonction appelle également wp_reset_postdata() en interne, ce qui aura le même effet.

rewind_posts() définit la publication actuelle de la requête principale sur la première publication. Étant donné que have_posts() appelle rewind_posts() en interne une fois que vous avez dépassé le dernier message, je ne sais pas quand vous aurez besoin de l'utiliser. Probablement seulement si vous avez déjà eu besoin de revenir au début de la boucle avant la fin.

En gros, vous devriez donc utiliser wp_reset_postdata() chaque fois que vous effectuez l’une des opérations suivantes:

Une requête secondaire:

$my_query = new WP_Query( $args );

while ( $my_query->have_posts() ) : $my_query->the_post();
    the_title();
endwhile;

wp_reset_postdata();

En boucle sur get_posts() résultats:

global $post;

$my_posts = get_posts( $args );

foreach ( $my_posts as $post ) : setup_postdata( $post );
    the_title();
endforeach;

wp_reset_postdata();

Ou obtenir un seul message et utiliser des balises de modèle:

global $post;

$post = get_post( $id );

setup_postdata( $post );

the_title();

wp_reset_postdata();

Et vous utiliseriez rewind_posts() si vous aviez besoin d'aller au début de la boucle. Cet exemple est étrange, mais je ne pouvais pas penser à un meilleur. C'est fondamentalement si vous voulez montrer les 3 premiers messages de la boucle, puis allez au début et montrez-les tous:

global $wp_query;

$started_over = false;

while ( have_posts() ) : the_post();
    the_title();

    if ( ! $started_over && $wp_query->current_post == 2 ) {
        $started_over = true;
        rewind_posts();
    }
endwhile;

Et vous devriez en principe ne jamais avoir besoin de wp_reset_query();

4
Jacob Peattie