Wordpress - Is it necessary to use wp_reset_query() in a WP_Query call?

It is not necessary for WP_Query by itself, but it is necessary (or at least good thing to do) if you use any related functions/methods ( such as the_post() or setup_postdata() ) to fill global variables with your data.

Basically creating new WP_Query object is merely data retrieval, but using it to run active loop and making data accessible to template tags does modify environment and it is good to reset everything afterwards.

Overall - it isn't meaningful performance penalty to call it, so it is easier to always call it than deciding if you should or forgetting about it and having something mysteriously broken.

Update

wp_reset_postdata() function seems to be more fitting choice. wp_reset_query() resets global $wp_query (which custom WP_Query object doesn't affect) and $post (which it might as above) variables. wp_reset_postdata() only restores $post, which should be enough.


Hi @janoChen:

Simple answer: no.

What follows is what the PHP code for the function wp_reset_query() from /wp-includes/query.php in WordPRess v3.0.4 as well as the functions subsequently called. You can see that it's primarily about in modifying global variables.

When you use new WP_Query($args) you will be assigning the return value from values to a local variable so, unless you are doing something so complex that you'd already know the answer to this question for then no, you don't need to call 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;
}

-Mike


No. If you instantiate your own WP_Query object, its yours to do with what you will. However, if you tamper with the global $wp_query variable, well, then your in the global namespace affecting anyone's script who is concurrently using that variable. And if you do something to change the data in it, you must also reset it after your done using it.

Tags:

Wp Query