The wp_reset_query and wp_reset_postdata are two important functions in WordPress that are used to reset the global query object and post data respectively. wp_reset_query and wp_reset_postdataThe wp_reset_query() function is typically used to restore the global $wp_query object back to the original state after a custom query has been run using WP_Query or get_posts().
This is important because WordPress uses the global $wp_query object to determine the context of the current page or post, and if it is not reset after a custom query, it can cause unexpected behavior or errors.
wp_reset_postdata()Â – In your first block of code you run a custom WP_Query.
wp_reset_query() – This should be used if you change the global $wp_query or use query_posts().
The main distinction between the two is that :
wp_reset_query():- check to see whether the main query has been reset to the original main query.
wp_reset_postdata() :-Ensures that the global $post in the main query has been restored to the current post.
Indeed, the wp_reset_query() calls the wp_reset_post_data(), as can be seen in the source code.
The following line is the sole difference between the two:
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
(in the wp_reset_query() ) So wp_reset_query() is only required if those two globals vary, which only happens if query_posts() has been used.
When should I put them to use?
To put it another way :
wp_reset_postdata() :- immediately following each custom WP_Query().wp_reset_query() :- query_posts() is called immediately after each loop.
Basically, every time you perform one of the following, you should use wp_reset_post_data():
A secondary query :
<?php
$my_query = new WP_Query( $args );
while ( $my_query->have_posts() ) : $my_query->the_post();
the_title();
endwhile;
wp_reset_postdata();
?> Looping over the results of get_posts():
<?php
global $post;
$my_posts = get_posts( $args );
foreach ( $my_posts as $post ) : setup_postdata( $post );
the_title();
endforeach;
wp_reset_postdata();
?>
Alternatively, you may obtain a single post and use template tags :
<?php
global $post;
$post = get_post( $id );
setup_postdata( $post );
the_title();
wp_reset_postdata();
?>If you ever needed to go back to the beginning of the loop, you’d call rewind_posts(). This is an odd example, but I couldn’t come up with a better one. Basically, if you just want to see the first three posts of the loop, go back to the beginning and show them all :
<?php
global $wp_query;
$started_over = false;
while ( have_posts() ) : the_post();
the_title();
if ( ! $started_over && $wp_query->current_post == 2 ) {
$started_over = true;
rewind_posts();
}
endwhile;
?>
Note : Also, wp reset query() should never be used;
Should I use the Wp_reset_query function ?
Yes, but only after query()posts has been used . You should never use query_posts(), as you’ve said . If you never wp_reset_query and wp_reset_postdata (rather than wp_reset_postdata() is unnecessary.
In summary, you shouldn’t ever need to use the wp_reset_query() instead of the wp_reset_postdata()!






