我一直在用两种不同的方法创建自定义WordPress循环,这两种方法都涉及创建WP_Query
对象的一个新实例。我通常在一个页面上有多个循环。
我不明白这两种方法有何不同,哪种方法是正确的。
方法1:Query
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
// output
endwhile;
endif;
wp_reset_postdata();
方法2:postdata
$original_query = $wp_query;
$wp_query = null;
$wp_query = new WP_Query( $args );
if ( have_posts() ) :
while ( have_posts() ) : the_post();
// output
endwhile;
endif;
$wp_query = null;
$wp_query = $original_query;
wp_reset_postdata();
这两种方法产生的结果似乎是相同的,但是当我打开WP_DEBUG
时,我看到了第二种方法的错误,例如:
注意: is_singular被错误地调用。在运行查询之前,条件查询标记无法工作。
我的问题是:
$original_query = $wp_query;
方法?$wp_query
的相关性是什么发布于 2013-02-13 18:07:36
一些核心函数--一些分页函数,例如(here is an example where this seems to have been a factor)--假定$wp_query
值。如果没有设置这些函数,则不起作用。您可以通过保存原始$wp_query
、运行自定义循环和将$wp_query
放回来欺骗。我认为这很少是最好的方法,如果您确实认为需要这样做,那么您应该使用pre_get_posts
或其他过滤器来修改主查询本身,而不是进行新的查询。我不会发誓绝对没有合适的情况,但我确实认为通常有更好的方法。
当我尝试时,您的代码不会触发任何通知,但是如果您这样做,它会:
$original_query = $wp_query;
$wp_query = null;
if (is_single()) {
echo 'single post';
}
$wp_query = new WP_Query( array('posts_per_page' => 5) );
像is_single
、is_archive
等函数依赖于已未设置的全局$wp_query
对象。我想在这种情况下你会看到通知的。
大多数您需要参考的东西都是在http://core.trac.wordpress.org/browser/trunk/wp-includes/query.php和http://core.trac.wordpress.org/browser/trunk/wp-includes/post-template.php中
https://stackoverflow.com/questions/14866154
复制