2017-08-02 63 views
0

任何人都可以通過使用foreach循環來幫助我創建一個如下所示的短代碼嗎?如何使用foreach循環創建這個長的短代碼(PHP + Wordpress)

此簡碼的目的是生成一個播放列表,並使用開始和結束標記:

[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

很明顯,這是做這樣的事情的錯誤方法。更何況,結束標籤沒有采取,而是在文本中顯示。也許這就是爲什麼整個事情都不起作用?

我應該提到,通過使用它自己的工作很好的整個短代碼。只有當我嘗試以這種方式構建短碼時,它纔會起作用。

你會如何建議我去完成這樣的事情?非常感謝。


UPDATE: 感謝大家的輸入。這就是我想出來的,與@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()); ?> 

它的工作完美。再次感謝社區。

+1

我可能不會跟隨,但你應該使用'do_shortcode'如果你只是試圖生成我不認爲簡碼文本。將整個代碼作爲單個字符串生成,然後對結果調用'do_shortcode'。 –

+0

@TheManiac這是非常有意義的。讓我試試看。任何機會,你可以給我一個快速片段?無論哪種方式,謝謝! – anthonyCam

+0

看起來像DACrosby已經爲你做了一個片段。很確定他說得對。 –

回答

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); 
} 
+0

在我看到您的評論之前,我實際上已經完成了這項工作,但這幾乎是我所做的。我會在我的帖子中發佈我的代碼。非常感謝! – anthonyCam

0

只需將您的示例代碼與簡單的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

希望這會有所幫助。

+0

有趣的,讓我檢查一下,我會讓你知道它是怎麼回事。另外,你是如何打印出來的?謝謝! – anthonyCam

+0

我使用了一個簡單的自定義插件,並將此方法添加到我的自定義插件中,並將其打印在自定義模板上。 –

相關問題