Working on _s, I came across an issue asking if we could remove the loop syntax in singular templates since there is never more than one post. I asked for Michael Field‘s opinion on the matter and he pointed me to a core ticket for Twenty Eleven about the same issue.

<?php
    while ( have_posts() ) :
        the_post();
?>
 
    // Code here...
     
<?php endwhile; ?>

When have_posts() is called for the first time, it will return true and we can go about our business of calling the_post() and displaying the content. One of the things the_post() does, is to set the internal in_the_loop property to true, signalling – you guessed it – that we are in the loop. In the second iteration of the while loop, there is no post and have_posts() sets in_the_loop back to false.

This is important! It makes the in_the_loop() (#) conditional tag work, that plugins might rely on to properly work. If we would not call have_posts(), WP_Query‘s in_the_loop attribute would stay true for the rest of the page load, possibly causing havoc in widgets or other parts of the page.