web-dev-qa-db-fra.com

Comment retourner le contenu de la boucle

Parfois, je dois renvoyer la sortie d'une boucle (généralement avec WP_Query comme dans cet exemple) pour l'utiliser dans un shortcode ou avec un filtre sur the_content .

Le code suivant qui utilise la mise en mémoire tampon d’objets fonctionne, mais j’ai lu ailleurs qu’elle pouvait être inefficace. J'ai aussi vu HEREDOC, mais je ne vois pas comment cela fonctionnerait ici à moins que je ne commence par enregistrer chaque balise de modèle en tant que variable (ce qui semble à nouveau inefficace).

Ma question est donc la suivante: quel est le meilleur moyen de renvoyer la sortie d’une boucle?

<?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(); ?>" 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! ?>
5
mrwweb

Il existe des remplacements qui renvoient des chaînes pures pour toutes les pièces, sans avoir à imprimer quoi que ce soit dans un tampon de sortie. J'aime sprintf() et écrirais votre exemple comme ceci:

<?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" 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;
6
fuxia