如何使用 foreach 循环创建这个长短代码 (PHP + Wordpress)

How to create this long shortcode by using a foreach loop (PHP + Wordpress)

任何人都可以使用 foreach 循环帮助我创建如下所示的短代码吗?

此短代码的目的是生成一个播放列表,并使用开始和结束标签:

[zoomsounds id="favorites_playlist"] [/zoomsounds]

在这些标签之间,要添加到播放列表的每首歌曲都有自己的短代码,如下所示:

[zoomsounds_player config="favorites-playlist" source="'.$source.'" type="detect" songname="'.$title.'" init_player="off" play_target="footer"]

假设用户的播放列表中有 2 首歌曲,整个短代码如下所示:

[zoomsounds id="favorites_playlist"][zoomsounds_player config="favorites-playlist" source="http://www.test.com/sound/brobob.mp3" type="detect" songname="Song 1" init_player="off" play_target="footer"][zoomsounds_player config="favorites-playlist" source="http://www.test.com/sound/brobob2.mp3" type="detect" songname="Song 2" init_player="off" play_target="footer"][/zoomsounds]

如您所见,每首歌曲的短代码接连出现,包含在 start/close 标签中。


我认为最简单的方法是使用 foreach 循环来生成每首歌曲的短代码。这是我写的简单函数。

function streamFavoritesPlaylist() {
    $favs[] = get_user_favorites();

    echo do_shortcode('[zoomsounds id="favorites_playlist"]');
        foreach ($favs[0] as $fav) {
            $title = get_the_title($fav);
            $post = get_post($fav);
            $post_slug = $post->post_name;
            $source = '.../mp3/'.$post_slug.'.mp3';
            $song_name = get_the_title($fav);

            echo do_shortcode('[zoomsounds_player config="favorites-playlist" source="'.$source.'" type="detect" songname="'.$title.'" init_player="off" play_target="footer"]');
        }
    echo do_shortcode('[/zoomsounds]');
}

这就是我得到的结果。

显然,这样做是错误的。更何况,结束标签并没有带上,而是一直显示在文本中。也许这就是为什么整个事情都不起作用的原因?

我应该提一下,通过单独使用整个短代码可以很好地工作。只有当我尝试以这种方式构建短代码时,它才不起作用。

你建议我如何着手完成这样的事情?非常感谢。


更新: 感谢大家的投入。这是我想出的,类似于@DACrosby 发布的内容,@TheManiac 建议。

function streamFavoritesPlaylist() {
    $favs[] = get_user_favorites();
    $shortcode_full = "";

    foreach ($favs[0] as $fav) {
        $title = get_the_title($fav);
        $post = get_post($fav);
        $post_slug = $post->post_name;
        $source = '.../mp3/'.$post_slug.'.mp3';
        $song_name = get_the_title($fav);
        $shortcode = '[zoomsounds_player config="favorites-playlist" source="'.$source.'" type="detect" songname="'.$title.'" init_player="off" play_target="footer"]';

        $shortcode_full .= $shortcode;
    }

    return '[zoomsounds id="favorites_playlist"]'.$shortcode_full.'[/zoomsounds]';
}

在我实际需要生成简码的地方,我使用的是:

<?php echo do_shortcode(streamFavoritesPlaylist()); ?>

一切正常。再次感谢社区。

只需使用带有简单 for 循环的示例代码来打印结果,就可以了。

似乎是某些字符串值包含特殊字符(例如:/' "")

您可以检查字符串值或使用下面的一些示例代码来测试该方法。

echo do_shortcode('[zoomsounds id="favorites_playlist"]');
        for($i = 0; $i < 5; $i++){
            $title = "FAV ".$i;
            $post = "FAV ".$i;
            $post_slug = "FAV ".$i;
            $source = "FAV ".$i;
            $song_name = "FAV ".$i;

            echo do_shortcode('[zoomsounds_player config="favorites-playlist" source="'.$source.'" type="detect" songname="'.$title.'" init_player="off" play_target="footer"]');
        }
echo do_shortcode('[/zoomsounds]');

打印出来: results

希望这会有所帮助。

它可能不起作用,因为 [/zoomsounds] 不是简码 - 它是一个的结束标记。因此 运行 第一个 [zoomsounds ...] 和最后一个 [/zoomsounds] 分别没有按预期工作。就像评论中提到的 TheManiac 一样,尝试先构建字符串,然后只构建一个 do_shortcode

function streamFavoritesPlaylist() {
    $favs[] = get_user_favorites();
    $str = '[zoomsounds id="favorites_playlist"]';

    foreach ($favs[0] as $fav) {
        $title = get_the_title($fav);
        $post = get_post($fav);
        $post_slug = $post->post_name;
        $source = '.../mp3/'.$post_slug.'.mp3';
        $song_name = get_the_title($fav);

        $str .= '[zoomsounds_player config="favorites-playlist"'
              . ' source="'.$source.'" type="detect"'
              . ' songname="'.$title.'" init_player="off"'
              . ' play_target="footer"]';
    }
    $str .= '[/zoomsounds]';
    echo do_shortcode( $str );
}