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

时间:2017-08-02 21:50:41

标签: php wordpress loops foreach shortcode

任何人都可以通过使用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]

正如您所看到的,每首歌曲的短代码都是一个接一个地出现,包含在开始/结束标签中。

我认为我能做到的最简单方法是使用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]');
}

这是我得到的结果。 enter image description here

显然,这是做错的方法。更不用说,结束标记没有采用,而是以文本显示。也许这就是为什么整件事都不起作用?

我应该提一下,通过使用整个短代码就可以了。只有当我尝试以这种方式构建短代码时才会起作用。

你怎么建议我去完成这样的事情?非常感谢。

更新 感谢大家的投入。这就是我提出的,类似于@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()); ?>

它完美运作。再次感谢社区。

2 个答案:

答案 0 :(得分:1)

它可能无法正常工作,因为[/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 );
}

答案 1 :(得分:0)

只需使用简单的for循环获取示例代码即可打印出结果,然后就可以了。

似乎某些字符串值包含特殊字符(例如:/&#39;&#34;&#34;)

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

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

希望这会有所帮助。