为什么wp_Reset_postdata()要从第一个POST重新启动循环?

时间:2013-06-10 作者:Marco Panichi

我使用了最后一个例子:https://github.com/scribu/wp-posts-to-posts/wiki/each_connected

唯一的区别是the_title 在回应连接的帖子之后。所以我的代码是:

<?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; ?>
问题是,所有帖子都会显示第一篇帖子的标题:

演员:职务n.1的演员

位置:职务n.1的位置

标题n.1

演员:职务第2号演员

位置:职务n.2的位置

标题n.1<<<--- WRONG!!!

2 个回复
最合适的回答,由SO网友:Rarst 整理而成

wp_reset_postdata() 从主查询还原帖子,这里您似乎根本没有使用它。所以在决赛之前the_title() 给你打电话,一路跳到那个岗位。

您的代码对我来说似乎有点问题,因为您的外部循环和内部循环都在不断重写$post 全球的如果您在内部循环中偏离了这一点(通过使用接受post/id操作的函数版本),您可能会逃避多次重写/重置和类似的问题。

类似这样:

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

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

        echo get_the_title( $actor );

    endforeach;

endwhile;

SO网友:Bendoh

你实际上需要全球化$post 在您的代码中setup_postdata() 做正确的事。这有点牵强附会setup_postdata() 仅设置相关全局($id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages) 但并没有遍布全球$post 对象,从中the_title() 拉动标题。

解决方案:global $post; 在循环之前。

就你而言,wp_reset_postdata() 实际上没有必要,因为您从未真正使用主查询中的数据,只使用子查询中的数据。

结束

相关推荐