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 !!!
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;
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.