How to return loop contents

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="<?php the_permalink(); ?>" rel="nofollow noreferrer noopener" 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! ?>

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

There are replacements that return pure strings for all parts, no need to print anything into an output buffer. I like sprintf() and would write your example like this:

<?php
if ( $cms_pl_pages->have_posts() )
{
    $content = '<section class="cms-pl-gallery">';
    while ( $cms_pl_pages->have_posts() )
    {
        $cms_pl_pages->the_post();
        $content .= sprintf(
            '<article class="cms-pl-item clearfix">
                %1$s
                <h2>
                    <a href="%2$s" rel="nofollow noreferrer noopener" title="Read %3$s">%4$s</a>
                </h2>
                %5$s
            </article>',
            get_the_post_thumbnail(),
            apply_filters( 'the_permalink', get_permalink() ),
            the_title_attribute( array( 'echo' => FALSE ) ),
            the_title( '', '', FALSE ),
            has_excerpt() ? apply_filters( 'the_excerpt', get_the_excerpt() ) : ''
        );
    }
    $content .= '</section> <!-- end .cms-pl-gallery -->';
}
wp_reset_postdata();
return $content;


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x