WordPress的:不同的WP_Query用法:哪个是正确的,在这种情况下?(WordPress:

2019-10-17 16:52发布

我一直在用两种不同的方法,它们都涉及创建的新实例创建自定义的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
  • 为什么是返回错误信息,当我使用它吗?

Answer 1:

一些核心functions--一些分页的,例如( 这里是哪里,这似乎是一个因素为例 ) -假设$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_singleis_archive等依赖全球上$wp_query对象,它已经被复位。 我希望它是在这样的情况下,你看到的告示。

你需要参考的事情都是在http://core.trac.wordpress.org/browser/trunk/wp-includes/query.php和http://core.trac.wordpress.org/browser/trunk/wp-包括/后的template.php



文章来源: WordPress: different WP_Query usage: Which is correct, in which context?