WordPress对主循环管理的很不错,但当你开始大刀阔斧的写自定义程序时,可能会在一个模板中使用多次循环,为了不造成潜在问题,每次循环结束后都应该重置WordPress循环。

为什么要重置WordPress循环?当我们在模板中使用诸如the_title()等模板标签时,实际上有很多全局变量在使用中,自定义循环会修改全局变量,假设在某个widget中使用query_posts()循环查询了评论数最多的10篇文章,查询后没有重置循环数据,首页显示的内容就会出错,本来应该显示所有文章,现在可能就显示评论数最多的文章了。如果文章中有多个自定义循环,不重置数据将会产生无法预料的错误。

重置WordPress循环的方法

总结一下,有三种方法,分别用于不同的情况,列表如下。

wp_reset_postdata()wp_reset_query()rewind_posts()
使用WP_Query创建多个循环是使用,不接受任何参数,恢复$post全局变量的数据使用query_posts()自定义循环时使用,不接受任何参数,不仅恢复$post全局变量,还会销毁之前的查询需要重用同一个页面的查询结果时使用

实例

wp_reset_postdata()

$random_post = new WP_query();
$random_post->query('cat=3&showposts=1&orderby=rand');
while ($random_post->have_posts()) : $random_post->the_post();
<a href="<?php the_permalink() ?>" title="<?php the_title(); ?>">
	<img src="<?php echo get_post_meta($random_post->ID, 'featured', true); ?>">
</a>
endwhile;
wp_reset_postdata();

wp_reset_query()

<?php query_posts('posts_per_page=3');
if (have_posts()) : while (have_posts()) : the_post(); ?>

<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>

<?php endwhile; endif; ?>
<?php wp_reset_query(); ?>

rewind_posts()

if (have_posts()) : while (have_posts()) : the_post(); ?>
<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
<?php endwhile; endif; ?>

<?php rewind_posts(); ?>

<?php while (have_posts()) : the_post(); ?>
<?php the_content(); ?>
<?php endwhile; ?>

3条留言

  1. 请博主帮我看看,这个帖子提到的问题,是不是跟重置循环有关,应该怎么搞呢?

  2. 博主首页我一直点击查看最多的时候文章最多就显示到2012年12月的,那些之前的日志如何查看呢?

    1. 要看全部就只能在文章列表看,或者直接搜索需要的内容了,听你这一说我发现我还真没想过这事…

评论功能已关闭