web-dev-qa-db-ja.com

ループの後にショートコード終了タグを追加する

私はアコーディオンにショートコードを使っています。このショートコードの中にループを入れたいです。しかし終了タグは未解析のようです。

<?php echo do_shortcode('[su_accordion]');?>

<?php
if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        echo '<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">';
        echo do_shortcode('[su_spoiler title="'.get_the_title().'" open="no" style="default" icon="plus" anchor="" class=""]'.get_the_content().'[/su_spoiler]');
        echo '</div>';

    endwhile;
else :
    echo wpautop( 'Sorry, no posts were found' );
endif;
?>

<?php echo do_shortcode('[/su_accordion]');?>

ショートコードの最後の部分は単純なテキストとして表示されます。

何か解決策はありますか?

1
Stefano

ループの出力をすべて変数にまとめ、アコーディオンのショートコードでラップしてから、do_shortcodeに渡します。

$output = '';   

if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        $output .= '<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">';
        $output .= do_shortcode('[su_spoiler title="'.get_the_title().'" open="no" style="default" icon="plus" anchor="" class=""]'.get_the_content().'[/su_spoiler]');
        $output .= '</div>';

    endwhile;
else :
    $output = wpautop( 'Sorry, no posts were found' );
endif;

echo do_shortcode( '[su_accordion]' . $output . '[/su_accordion]' );

私はこれをいくつかのショートコードでテストし、期待通りの出力を得ました。

3
Milo