0

我一直在使用两种不同的方法创建自定义 WordPress 循环,这两种方法都涉及创建WP_Query对象的新实例。我通常在一个页面上有多个循环。

我不明白这两种方法有何不同,以及使用每种方法的正确上下文。

方法1:http ://codex.wordpress.org/Class_Reference/WP_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:http ://codex.wordpress.org/Function_Reference/wp_reset_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
  • 为什么我使用时返回错误信息?
4

1 回答 1

1

一些核心功能——例如一些分页功能(这里是一个例子,这似乎是一个因素)——假设了这个$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.phphttp://core.trac.wordpress.org/browser/trunk/wp-包括/post-template.php

于 2013-02-14T02:07:36.563 回答