问题描述

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

<?php
$featuredPosts = new WP_Query();
$featuredPosts->query('showposts=5&cat=3');
while ($featuredPosts->have_posts()) : $featuredPosts->the_post(); ?>
<h1><a href="<?php%20the_permalink()%20?>"><?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()如果我必须使用它应该放在哪里?

最佳解决方案

你好 @janoChen:

简单的答案:不。

以下是 WordPRESS v3.0.4 中/wp-includes/query.php 的功能 wp_reset_query()的 PHP 代码以及随后调用的函数。您可以看到它主要是在修改全局变量。

当您使用 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;
}

-麦克风

次佳解决方案

WP_Query 本身不是必需的,但如果您使用任何相关的功能/方法 (如 the_post()setup_postdata()) 填充全局变量,则必须 (或至少要做的更好) 。

基本上创建新的 WP_Query 对象只是数据检索,但是使用它来运行主动循环并使得模板标签可访问的数据可以修改环境,并且以后重新设置好。

总体来说,调用它不是有意义的性能损失,所以总是调用它更容易,而不是决定是否应该或忘记它,并且有神秘的破坏。

更新

 wp_reset_postdata()功能似乎更适合选择。 wp_reset_query()复位全局 $wp_query(哪个自定义 WP_Query 对象不影响) 和 $post(它可能如上所述) 变量。 wp_reset_postdata()只能恢复 $post,这应该够了。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。