wp_reset_query
is for cleaning up after a query_posts
call, you don’t need to call it after a standard posts loop, only if you use query_posts
. Since you should never use query_posts
to fetch posts from the database, you should never use this function.
But How Do I Cleanup After The Main Loop?
You don’t, this is an example of a full main post loop:
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// display content
}
} else {
// none found
}
What About WP_Query
or get_posts
?
There’s a similar and more useful function named wp_reset_postdata
. This function cleans up after these functions:
WP_Query::the_post
setup_postdata
So an example of a WP_Query
post loop should look like:
$q = new WP_Query( [ ... ] );
if ( $q->have_posts() ) {
while ( $q->have_posts() ) {
$q->the_post();
// display content
}
wp_reset_postdata();
} else {
// none found
}
Notice that I called wp_reset_postdata
after the while
loop, but inside the if
statement, not after it. Only reset postdata if there’s something to clean up
And If I Need To Override The Loop?
Use the pre_get_posts
filter to modify the main loop, don’t create a new replacement query.
What About get_posts
?
If you never set the postdata, then you never have to reset it.