web-dev-qa-db-fra.com

Pourquoi wp_reset_postdata () redémarre-t-il la boucle depuis le premier message?

J'ai utilisé l'avant-dernier exemple présenté ici: https://github.com/scribu/wp-posts-to-posts/wiki/each_connected

La seule différence est que j'ai mis the_title après l'écho des publications connectées. Donc, mon code est:

<?php
$my_query = new WP_Query( array(
    'post_type' => 'movie'
) );

p2p_type( 'movies_to_actors' )->each_connected( $my_query, array(), 'actors' );

p2p_type( 'movies_to_locations' )->each_connected( $my_query, array(), 'locations' );

while ( $my_query->have_posts() ) : $my_query->the_post(); ?>

    <?php
    // Display connected actors
    echo '<p>Actors:</p>';

    foreach ( $post->actors as $post ) : setup_postdata( $post );
        the_title();

        ...
    endforeach;

    wp_reset_postdata();

    // Display connected locations
    echo '<p>Filming locations:</p>';

    foreach ( $post->locations as $post ) : setup_postdata( $post );
        the_title();

        ...
    endforeach;

    wp_reset_postdata();
    ?>

    <?php the_title(); ?>

<?php endwhile; ?>

Le problème est que tous les posts me montrent le titre du premier post:


Acteurs: acteurs du post post n.1

Emplacements: emplacements du titre de l'article n.1

TITRE n.1


Acteurs: acteurs du post post n.2

Lieux: lieux de poste n ° 2

TITRE n.1 <<< --- FAUX !!!

1
Marco Panichi

wp_reset_postdata() restaure la publication de la requête principale , que vous ne semblez pas utiliser ici du tout. Donc, avant la dernière appel the_title(), vous sautez jusqu'au poste.

Votre code semble être un peu problématique pour moi parce que vos boucles internes et externes réécrivent continuellement $post global. Si vous vous en éloignez dans les boucles internes (en utilisant des versions de fonctions qui prennent post/id pour agir), vous échapperez probablement à plusieurs remplacements/réinitialisations et autres problèmes de ce type.

Quelque chose comme ça:

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

    foreach ( $post->actors as $actor ) :

        echo get_the_title( $actor );

    endforeach;

endwhile;
1
Rarst

En fait, vous devez globaliser $post dans votre code pour que setup_postdata() puisse agir correctement. C'est un peu un piège, car setup_postdata() configure simplement les globals associés ($id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages) mais ne remplit pas l'objet global $post, à partir duquel the_title() extrait le titre.

Solution: global $post; avant votre boucle.

Dans votre cas, wp_reset_postdata() n'est pas vraiment nécessaire, car vous n'utilisez jamais les données de la requête principale, mais uniquement les sous-requêtes.

0
Bendoh