web-dev-qa-db-fra.com

Avoir des problèmes avec un foreach à l'intérieur d'un shortcode avec ACF gallery

Normalement, je mettrais simplement ce type de contenu dans un modèle, mais la façon dont j'insère le contenu est un peu différente. J'ai fait un shortcode avec lequel j'ai eu des problèmes. Il utilise le curseur d'orbite de Foundation 5 et une galerie ACF. Il commence à être accroché à la partie foreach.

// Add Shortcode
function custom_carousel($atts, $content = null) {
    extract(
      shortcode_atts(
        array(), $atts));
    $out1 = '<ul class="orbit" data-orbit data-options="timer_speed:1500;">';
    $carouselimages = get_field('gallery');
    foreach ($carouselimages as $carouselimage) {
        $output = ' <li class="text-center"> <img src="' . $carouselimage['url'] . '" title="' . $carouselimage['title'] . '" alt="' . $carouselimage['alt'] . '" /></li>';
    }
    $out3 = '</ul>';
    return $out1 . $output . $out3;
}

add_shortcode('custom-carousel', 'custom_carousel');

J'utilise ce code pour la version mobile du site dans le modèle qui fonctionne parfaitement:

<?php
$carouselimages = get_field('gallery');
if ($carouselimages) {
    ?>
            <ul class="orbit" data-orbit data-options="timer_speed:1500;">
                <?php foreach ($carouselimages as $carouselimage) { ?>
                    <li class="text-center">
                        <img src="<?php echo $carouselimage['url']; ?>" title="<?php echo $carouselimage['title']; ?>" alt="<?php echo $carouselimage['alt']; ?>" />
                        <?php echo $carouselimage['description']; ?>
                    </li>
                <?php }; ?>
            </ul>
<?php } ?>
1
Aibrean

Au début, n'utilisez pas extract. C'est un très mauvais style de code et il est également dégradé.

Chaque fois que votre boucle foreach est exécutée, vous substituez le contenu de $output car vous affectez à ce variable un nouveau contenu. Ce que vous voulez, c'est concaténer un nouvel élément de liste avec ceux existants. Cela peut être fait en utilisant l'opérateur d'affectation concaténant:

$output .= '<li class="text-center"> <img src="' . $carouselimage['url'] . '" title="' . $carouselimage['title'] . '" alt="' . $carouselimage['alt'] . '" /></li>';

La variable $output doit être définie avant votre instruction foreach. Il suffit de lui attribuer une chaîne vide.

1
ScheRas