当Wordpress中的链接标签中有mp3时如何生成音频短代码

时间:2019-04-23 15:46:00

标签: php wordpress audio

我正在尝试编写一个函数,该函数将使用带有Wordpress音频短代码的.mp3 URL覆盖任何<a>标签。

我要从api将帖子拉到Wordpress中-因此,我无法将音频简短代码手动添加到每个帖子中的mp3链接中,甚至无法在自己的行上放置mp3 URL,这会自动生成该简短代码。这些帖子是广播故事。每个标签都以<a>标签开头,其结构完全如下:

<a href="https:storyurl.mp3" class="asset-audio">Hear the radio version of this story.</a>

我相信这就是我需要将该标签转换为:

[audio mp3="https:storyurl.mp3" class="asset-audio" title="Hear the radio version of this story."]

有些音频播放器插件可以识别任何mp3并将其包装在其自己的短代码中,但是Wordpress默认情况下不会使用其核心mediaelement.js来执行此操作。我希望在我的孩子主题的functions.php中实现这一目标。

2 个答案:

答案 0 :(得分:1)

是的,正则表达式(正则表达式)非常强大。这是我的替换方法:

$reg = "#<a [^>]*href=['\"]([^\"']+\.mp3)['\"][^>]*>(.*?)</a>#";
$content = preg_replace($reg, "[audio mp3='$1' class='asset-audio' title='$2']", $content);

$content是保存帖子内容的任何变量。我将解释正则表达式的作用:

“#”-第一个和最后一个字符是分隔符。他们实际上不是比赛的一部分

“ [^>] ”-[]表示它正在寻找一组字符中的任何一个。 ^是一个否定符,表示“否”。 “ ”表示这些字符中的0个或多个。总而言之,它表示“寻找0个或多个任何字符都接受“>”,这使我们处于“ a”标记之内。

“ href =”-只是找到该文本

“ ['\”]“-引号

“(([^ \”'] +。mp3)“-括号使我们以后可以访问此字符串(在替换部分中)。方括号部分意味着我们想知道任何字符都接受结束引号(因为引号字符通常显示在链接中,我们大多数情况下都是安全的。“ +”表示正在查找这些字符中的1个或多个。.表示字面量的字符和mp3(因此我们仅匹配mp3链接!)

“ ['\”]“-结束语

“ [^>] *>”-任意数量的非“>”字符,后跟>

“(。*?)”-再次加上括号以捕获此字符串。 “。”表示任何字符,*表示0或更大,而“?”表示不要太激进...尽可能匹配最少的字符(否则它将一直持续到帖子中最后一个链接的结束标记

在替换部分,注意$ 1和$ 2。这些指的是比赛中的第一个和第二个括号。

这不是对正则表达式的全部解释,也不是100%完美的解决方案,但它在您的情况下几乎可以100%起作用。正则表达式实际上是一种语言本身,在那里有很多研究。我鼓励您学习并精通它,因为它有很多用途!

我也没有回答您的其余问题,即如何在从数据库到屏幕的途中拦截和更改帖子内容。如果您也需要帮助,请告诉我。

编辑------------------------

这是我在插件或functions.php文件中执行的操作:

add_filter( 'the_content', 'myprefix_use_audio_short_tag' );

function myprefix_use_audio_short_tag( $content ) {
    $reg = "#<a [^>]*href=['\"]([^\"']+\.mp3)['\"][^>]*>(.*?)</a#";
    $content = preg_replace($reg, "[audio mp3='$1' class='asset-audio' title='$2']", $content);

    return $content;
}

带有“ the_content”作为过滤器的“添加过滤器”功能会将您的功能添加到每次从数据库访问帖子内容时都要针对帖子内容运行的功能队列中。这应该会达到您想要的结果。

答案 1 :(得分:0)

将代码粘贴到您的javascript文件中,它将解决您的问题。但愿如此。

$('.asset-audio').each(function(){
   var newtag = "[audio mp3="+ $(this).attr('href') +" class="+ 
   $(this).attr('class') +" title="+ $(this).html() +"]";
   $(this).after(newtag);
   $(this).remove();
});