是否有必要在WP_QUERY调用中使用wp_Reset_Query()?

时间:2011-01-29 作者:janoChen

我使用以下代码检索帖子:

<?php
$featuredPosts = new WP_Query();
$featuredPosts->query(\'showposts=5&cat=3\');

while ($featuredPosts->have_posts()) : $featuredPosts->the_post(); ?>

    <h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
    <div class="meta">
        By <?php the_author() ?>
    </div>
    <div class="storycontent">
        <?php the_excerpt(); ?>
    </div>

<?php endwhile; ?>
我需要使用wp_reset_query()? 如果我这样做了,我应该把它放在哪里?

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

你好@janoChen:

简单回答:否。

下面是函数的PHP代码wp_reset_query() 从…起/wp-includes/query.php 在WordPRess v3中。0.4以及随后调用的函数。您可以看到,它主要是关于修改全局变量。

当您使用new WP_Query($args) 您将把返回值从值分配给局部变量,因此,除非您正在做一些非常复杂的事情,以至于您已经知道这个问题的答案,否则不需要调用wp_reset_query():

function wp_reset_query() {
  unset($GLOBALS[\'wp_query\']);
  $GLOBALS[\'wp_query\'] =& $GLOBALS[\'wp_the_query\'];
  wp_reset_postdata();
}

function wp_reset_postdata() {
  global $wp_query;
  if ( !empty($wp_query->post) ) {
    $GLOBALS[\'post\'] = $wp_query->post;
    setup_postdata($wp_query->post);
  }
}

function setup_postdata($post) {
  global $id, $authordata, $day, $currentmonth, $page, $pages, $multipage, $more, $numpages;

  $id = (int) $post->ID;

  $authordata = get_userdata($post->post_author);

  $day = mysql2date(\'d.m.y\', $post->post_date, false);
  $currentmonth = mysql2date(\'m\', $post->post_date, false);
  $numpages = 1;
  $page = get_query_var(\'page\');
  if ( !$page )
    $page = 1;
  if ( is_single() || is_page() || is_feed() )
    $more = 1;
  $content = $post->post_content;
  if ( strpos( $content, \'<!--nextpage-->\' ) ) {
    if ( $page > 1 )
      $more = 1;
    $multipage = 1;
    $content = str_replace("\\n<!--nextpage-->\\n", \'<!--nextpage-->\', $content);
    $content = str_replace("\\n<!--nextpage-->", \'<!--nextpage-->\', $content);
    $content = str_replace("<!--nextpage-->\\n", \'<!--nextpage-->\', $content);
    $pages = explode(\'<!--nextpage-->\', $content);
    $numpages = count($pages);
  } else {
    $pages = array( $post->post_content );
    $multipage = 0;
  }

  do_action_ref_array(\'the_post\', array(&$post));

  return true;
}
-迈克

SO网友:Rarst

没有必要WP_Query 就其本身而言,but 如果您使用任何相关的函数/方法(例如the_post()setup_postdata() ) 用数据填充全局变量。

基本上是创建新的WP_Query 对象仅仅是数据检索,但使用它来运行活动循环并使数据可供模板标记访问确实会修改环境,并且最好在之后重置所有内容。

总的来说,调用它并没有什么意义,所以总是调用它比决定是否应该或忘记它并让某些东西神秘地损坏要容易得多。

Update

wp_reset_postdata() 功能似乎是更合适的选择。wp_reset_query() 重置全局$wp_query (哪个客户WP_Query 对象不影响)and $post (如上所述)变量。wp_reset_postdata() 仅恢复$post, 这应该足够了。

SO网友:RebelPhoenix

不可以。如果您实例化自己的WP\\U查询对象,那么您可以根据自己的意愿进行操作。但是,如果您篡改global $wp_query 变量,然后是全局名称空间中的,影响同时使用该变量的任何脚本。如果您要更改其中的数据,还必须在使用完后重置它。

SO网友:Katie

如果您使用这样的自定义查询

$cat = new WP_query(); 
$cat->query("cat=19,20,-23&showposts=5&orderby=rand"); 
while ($cat->have_posts()) : $cat->the_post(); 
  $data = get_post_meta( $post->ID, \'key\', true );
$img_arrays []= $data[\'productimage\']; 
$lnk_arrays[] =get_permalink($post_ID); 
endwhile; 
wp_reset_query(); 
这样你就不会遇到问题了。否则,如果在同一个页面上有另一个循环,您一定会得到一些意外的结果。我在上面的代码中没有使用wp\\u reset\\u query()(它放在我的header.php文件中)。然后,当我进入single.php时,我得到了其他类别的详细页面,这让我很沮丧。后来,我意识到我忘了在顶部重置查询。很快,它开始像一个魔咒一样工作。

结束

相关推荐