web-dev-qa-db-fra.com

Ajout d'une balise de fermeture shortcode après une boucle

J'utilise un shortcode pour accordéon. Je voudrais mettre une boucle à l'intérieur de ce shortcode. Cependant, la balise de fermeture semble être non analysée.

<?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]');?>

La dernière partie du shortcode est affichée sous forme de texte simple.

Toute solution?

1
Stefano

Recueillez toute la sortie de la boucle dans une variable, enroulez-la dans le shortcode accordéon, puis transmettez-la via 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]' );

J'ai testé cela avec un couple de Shortcodes englobant et j'ai obtenu le résultat attendu.

3
Milo