At times, I need to return the output of a loop (usually with WP_Query
like in this example) for use in a shortcode or with a filter on the_content
.
The following code that uses object buffering works, but I’ve read in other places that buffering can be inefficient. I’ve seen HEREDOC too, but I don’t see how that would work here unless I saved every template tag as a variable first (which seems inefficient again).
So my question is, what’s the best way to return the output of a loop?
<?php if ( $cms_pl_pages->have_posts() ) :
ob_start(); // start object buffering. we'll run the loop and spit out final contents.
echo '<section class="cms-pl-gallery">';
while ( $cms_pl_pages->have_posts() ) : $cms_pl_pages->the_post();
?>
<article class="cms-pl-item clearfix">
<?php has_post_thumbnail() ? the_post_thumbnail() : null; ?>
<a href="https://wordpress.stackexchange.com/questions/57000/<?php the_permalink(); ?>" title="Read '<?php the_title(); ?>.'">
<h2><?php the_title(); ?></h2>
</a>
<?php has_excerpt() ? the_excerpt() : null; ?>
</article>
<?php endwhile;
echo '</section> <!-- end .cms-pl-gallery -->';
$content = ob_get_contents(); // set $content to buffered object
ob_end_clean(); // throw away the buffered object
endif; wp_reset_postdata();
return $content; // return! ?>