web-dev-qa-db-ja.com

ループ内容を返す方法

ときには、ショートコードやWP_Queryのフィルタで使用するために、return(通常はこの例のようにthe_contentを付けて)出力をする必要があります。

オブジェクトバッファリングを使用する次のコードは機能しますが、他の場所でバッファリングが非効率的になる可能性があることを読みました。私はHEREDOCも見ましたが、最初にすべてのテンプレートタグを変数として保存しない限り、これがどのように機能するかわかりません(これもまた非効率的です)。

だから私の質問は、ループの出力を返すための最良の方法は何ですか?

<?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

すべての部分に対して純粋な文字列を返す置き換えがあります。出力バッファに何かを出力する必要はありません。私は sprintf() が好きで、あなたの例をこのように書きます

<?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