`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.