【问题标题】:How to generate audio shortcode when there's an mp3 in a link tag in Wordpress当 Wordpress 的链接标签中有 mp3 时如何生成音频短代码
【发布时间】:2019-09-12 20:37:43
【问题描述】:

我正在尝试编写一个函数,该函数将使用带有 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中实现这一点。

【问题讨论】:

  • 我认为您最好的选择是查看帖子内容(可能连接到the_content 过滤器),并使用正则表达式来查找信息。你熟悉preg_match_all()preg_replace()吗?
  • 我不熟悉,只是用谷歌搜索了一下。这确实有道理。基本上,查找和替换。我没有想过要这样攻击它。我假设有某种方法可以在部分标准中使用某种“通配符”来编写preg_match_all 逻辑。匹配条件必须包括 .mp3,但不能包括 URL 的其余部分。无论如何,我会摆弄那个。谢谢!

标签: php wordpress audio


【解决方案1】:

是的,Regex(正则表达式)非常强大。以下是我将如何进行替换:

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

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

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

"

"[^>]" - [] 表示它正在寻找一组字符中的任何一个。 ^ 是否定符,意思是“不”。 "" 表示这些字符中的 0 个或多个。总而言之,它的意思是“寻找 0 个或更多的任何字符接受“>”,这使我们保持在“a”标签内。

"href=" - 只是为了找到那个文本

"['\"]" - 左引号

"([^\"']+.mp3)" - 括号让我们稍后可以访问这个字符串(在替换部分)。括号部分意味着我们正在寻找任何接受结束引号的字符(因为两者都不引号字符通常出现在链接中,我们这样做是安全的。“+”表示它正在寻找这些字符中的一个或多个。. 表示文字句点字符和 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”作为过滤器的“添加过滤器”函数将您的函数添加到每次从数据库访问帖子内容时都必须针对帖子内容运行的函数队列。这应该有你想要的结果。

【讨论】:

  • 哇。感谢您花时间这么清楚地回答这个问题!我确实去了一点正则表达式兔子洞。迷人。我知道它有多么强大——即使它让我的眼睛在这一点上有点交叉。关于你的最后一段:我很高兴你这样说。我不想做的是在数据库上运行一个脚本来更改那里的所有这些链接。我想完全按照你说的做:“拦截并更改从数据库到屏幕的帖子内容。”我很想知道您建议如何处理。
  • 我确实在这里遇到了类似的问题:stackoverflow.com/questions/26470658/…
  • 配置 mediaelement.js 的方法(在我刚刚发布的链接中描述)确实有效 - 有点。但我遇到了另一个问题 - 因为我使用 AJAX 加载页面,所以脚本不会在每次 AJAX 调用时重新加载。我知道有解决方法。我觉得你的解决方案更简单。
  • 是的,我对javascript不太了解。我一直在阅读它,但我在 PHP 方面更强大。这种方法对我来说似乎更可靠,但这可能是我的偏见。我更新了我的答案以包括您如何使用过滤器(特别是“the_content”)来做你想做的事。如果您发现the_content 过于宽泛并影响了太多项目,那么 WP 中的无数过滤器可能会有所帮助。如果您想尝试不同的过滤器,则必须进行一些搜索。
  • 这比我用 Javascript 做的要好得多,而且我能够大大减少代码量——它可以很好地处理 AJAX 调用,无需重新加载脚本。非常感谢@Stevish!唯一的小调整是正则表达式字符串需要在关闭 &lt;/a 标记的末尾关闭 &gt;。否则,它不会替换它并在播放器之后留下一个呈现为文本的&gt;。不管怎样,我欠你一个!
【解决方案2】:

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

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

【讨论】:

  • 谢谢你,苏雷什!当您说“在您的 javascript 文件中”时,您指的是哪个文件?我想我的想法是 - 创建一个外部 javascript 文件,并在 functions.php 中使用 wp_enqueue_scripts 来导入它。
  • 是的,您可以创建外部文件,也可以使用 wp_head 操作挂钩添加此代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多