Products
96SEO 2025-09-01 10:20 6
B站自2020年3月起,全面将视频链接ID由传统的“av”号升级为以“BV”开头的新格式。官方表示此举是为了保护稿件信息平安、容纳更多投稿并维护UP自主权益。但这一变动直接导致很多WordPress视频播放插件无法正常解析B站视频地址,其中就包括非常受欢迎的Smartideo插件。
由于Smartideo插件原有的正则表达式只能匹配“av”开头的数字ID, 复制粘贴带有BV号的视频链接时无法被识别,导致视频无法嵌入和播放。更糟糕的是 插件作者已多年未更新该插件,应对不断变化的视频站点支持不足,所以呢需要用户自行通过代码钩子进行修改,让插件支持B站最新的BV号。
要 Smartideo, 使其支持B站BV号,需要先了解两个关键点:
wp_embed_register_handler
注册新的URL处理规则,实现对新URL格式的支持。B站传统的视频链接形式为:
https://www.bilibili.com/video/av12345678
而升级后的新格式为:
https://www.bilibili.com/video/BV1xx411x7xQ
BV号由大写字母和数字组成, 长度固定但不规则,为了精准匹配,我们设计如下正则表达式:
#https?://?bilibili\.com/video/BV#i
说明:
#...#i
: 正则定界符及不区分大小写标志。?
: 匹配可选的“www.”前缀。BV
: 捕获关键部分,即“BV”后面跟随的一串字母数字组合作为视频ID。- 登录你的WordPress后台服务器, 通过FTP或主机文件管理器找到Smartideo插件目录,路径通常类似于:
/wp-content/plugins/smartideo/
- 找到smartideo.php文件,这个文件包含了主要的视频URL处理逻辑。请务必做好备份,以防误操作导致网站故障。
- 打开smartideo.php, 找到大约第87行左右的位置, 可以看到类似下面代码片段,这里是各种视频网站URL处理器注册位置:
wp_embed_register_handler( 'smartvideo_bilibili_av',
'#https?://?bilibili\.com/video/av#i',
array
);
- 在该位置下方添加对B站BV号新格式的支持,如下所示:
// 新增 Bilibili BV 视频识别规则
wp_embed_register_handler( 'smartvideo_bilibili_bv',
'#https?://?bilibili\.com/video/BV#i',
array
);
- 在同一文件中靠近其他处理函数的位置,添加如下函数,用于针对BV格式生成正确的视频嵌入代码:
public function smartideo_embed_handler_bilibili_bv {
// 获取捕获到的视频ID
$video_id = isset ? $matches : '';
// 默认播放页面页码
$page = 1;
// 构建播放器iframe URL
$iframe_src = "https://player.bilibili.com/player.html?bvid=BV{$video_id}&page={$page}";
// 返回iframe标签HTML,宽度高度自适应,可
$embed = '';
return apply_filters;
}
apply_filters
用于兼容WP过滤器调用和后续拓展调用。- 完成以上修改并保存后 在WordPress后台新建或编辑一篇文章,只需直接插入带有完整.
- 发布或预览文章时检查页面是否成功加载出B站官方播放器并能正常播放对应视频。若显示异常,请确认之前代码准确无误且缓存已刷新。
// 原来的 av ID 正则保留,并用老方法处理:
wp_embed_register_handler( 'smartvideo_bilibili_av',
'#https?://?bilibili\.com/video/av#i',
array
);
// 新增 BV ID 支持:
wp_embed_register_handler( 'smartvideo_bilibili_bv',
'#https?://?bilibili\.com/video/BV#i',
array
);
public function smartideo_embed_handler_bilibili_bv {
$pattern_page = '##';
preg_match;
$page = isset ? intval : 1;
$video_id = isset ? trim : '';
if ) {
return ''; // 未捕获到有效id,则返回空避免错误显示。
}
$src_url = sprintf, esc_attr);
return sprintf('', esc_url_raw);
}
Demand feedback