Warum startet wp_reset_postdata () die Schleife vom ersten Post neu?

Ich habe das zweitletzte Beispiel verwendet, das hier gezeigt wird: https://github.com/scribu/wp-posts-to-posts/wiki/each_connected

Der einzige Unterschied ist, dass ich the_title nach dem Echo der verbundenen Beiträge gesetzt habe. Also mein Code ist:

 '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 '

Actors:

'; foreach ( $post->actors as $post ) : setup_postdata( $post ); the_title(); ... endforeach; wp_reset_postdata(); // Display connected locations echo '

Filming locations:

'; foreach ( $post->locations as $post ) : setup_postdata( $post ); the_title(); ... endforeach; wp_reset_postdata(); ?>

Das Problem ist, dass alle Beiträge mir den Titel des ersten Beitrags zeigen:


Schauspieler: Schauspieler des Posttitels n.1

Standorte: Standorte des Posttitels n.1

TITEL n.1


Schauspieler: Schauspieler des Posttitels n.2

Orte: Orte des Posttitels n.2

TITEL n.1 <<< — FALSCH !!!

Solutions Collecting From Web of "Warum startet wp_reset_postdata () die Schleife vom ersten Post neu?"

wp_reset_postdata() stellt den Post aus der Hauptabfrage wieder her , die Sie hier anscheinend gar nicht benutzen. Bevor the_title() Aufruf von the_title() , springen Sie den ganzen Weg zu diesem Post.

Ihr Code scheint mir etwas problematisch zu sein, weil sowohl Ihre äußere als auch Ihre innere Schleife $post global ständig neu schreiben. Wenn Sie sich in inneren Schleifen davon entfernen (indem Sie Versionen von functionen verwenden, für die post / id verwendet werden), werden Sie wahrscheinlich mehrere Überschreibungen / Zurücksetzungen und ähnliche Probleme vermeiden.

Etwas wie das:

 while ( $my_query->have_posts() ) : $my_query->the_post(); foreach ( $post->actors as $actor ) : echo get_the_title( $actor ); endforeach; endwhile; 

Sie müssen tatsächlich $post in Ihrem Code für setup_postdata() globalisieren, um das Richtige zu tun. Es ist ein bisschen eine Frage, da setup_postdata() lediglich die zugehörigen Globals ( $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages ) erstellt, aber nicht $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages das globale $post Objekt, von dem the_title() den Titel the_title() .

Lösung: global $post; vor deiner Schleife.

In Ihrem Fall ist wp_reset_postdata() nicht wirklich notwendig, da Sie niemals die Daten der Hauptabfrage, sondern nur die Unterabfragen verwenden.