我需要帮助防止自定义字段在第一次发布后被更新。
我有一些帖子,其中有一个mp3文件的链接和该文件的描述。发布时,我有一个函数,可以从内容中删除指向mp3文件的链接,并将其添加到一个名为audio_url
.
如果我更改帖子,自定义字段中的mp3链接将被删除。
my中的代码functions.php
:
function save_url_link( $post_id, $post ){
if ( has_post_format(\'audio\', $post_id)) {
if (! wp_is_post_revision( $post_id ) ){
preg_match_all ( "/(http|https):\\/\\/.*\\/(.*)\\.(mp3|m4a|ogg|wav|wma)/", $post->post_content, $matches );
update_post_meta( $post_id, \'audio_url\', $matches[0][0] );
}
remove_action(\'save_post\', \'save_url_link\', 10, 2);
wp_update_post(array(\'ID\' => $post_id, \'post_content\' => preg_replace(\'/(http|https):\\/\\/.*\\/(.*)\\.(mp3|m4a|ogg|wav|wma)/\', "", $post->post_content)));
}
}
最合适的回答,由SO网友:janh 整理而成
您正在更新audio\\u url,无论是否在内容中找到。让它有条件:
if(preg_match_all ( "/(http|https):\\/\\/.*\\/(.*)\\.(mp3|m4a|ogg|wav|wma)/", $post->post_content, $matches )) {
update_post_meta( $post_id, \'audio_url\', $matches[0][0] );
}
在这种情况下,您还可以使用preg\\u match,因为您只查找一个实例。
还要确保您的正则表达式工作正常。现在,如果文档中有两个URL,就会得到错误的结果,因为“.*”是贪婪的,会尽可能匹配。添加?将这种行为转变为不贪婪。现在,让我们不再需要使用不同的分隔符来转义每个斜杠:
"!(http|https)://.*?/(.*?)\\.(mp3|m4a|ogg|wav|wma)!"
你不需要在那一秒周围加括号
.*?
, 但也许你有更多需要它的代码?此外,(http | https)还可以写为
https?
, 问号使前一个字符成为可选字符。