昨日的沙坪坝天气大晴,得意忘形之下急性咽炎发作,大意了。从校医院拿了药回来,不太想干活,就来整理一下这几天遇到的一个关于 wordpress 主题屏蔽部分 js 导致的解析错误问题。
wordpress 版本 5.3.2 更换主题 kratos-pjax 后,插入的音频列表无法被正确的解析出来。通过审查元素发现,DOM ID 为 tmpl-wp-playlist-item 和 tmpl-wp-playlist-current-item 的脚本都存在,初步断定 wp_playlist_scripts() 脚本大概率工作正常;同时 DOM Class 为 wp-playlist wp-audio-playlist wp-playlist-light 的元素也都存在,且被正确解析,大体可以排除文章内容渲染的问题。
在局域网搭建一个新的 wordpress 站点,安装同样的插件后,在默认的 twenty-twenty 主题下,插入的音频列表可以被正确解析且能够播放;安装 kratos-pjax 主题后无法解析,因此可以断定问题出在主题上。kratos-pjax 是一个基于 kratos 进行二次开发的主题,目录结构和 function.php 差异很大,为进一步排除干扰,安装 kratos 并再次测试,音频列表解析正常。再次查看网页源代码,发现没有加载 wp-playlist.min.js、mediaelement-migrate.min.js、mediaelement-and-player.min.js 这三个脚本,而相应的 wp-mediaelement.min.css 有被加载出来,至此锁定到问题源。
wordpress 的主题开发可以通过 remove_action 屏蔽部分不必要的模块,推测是主题中移除了 mediaelement 相关的脚本。查看主题代码 core.php 文件,发现有大量 remove_action 移除 header 脚本的操作,但是没有找到与 mediaelement 相关的移除代码,更进一步地全局搜索 wp_playlist_scripts、mediaelement 等关键字,也未发现任何移除的迹象。尝试注释所有 remove_action 代码段,并重启 fpm 服务,脚本依然无法加载。
因此换一个思路,在 function.php 最下面添加了如下代码,尝试将 mediaelement 重新加载进去。 1
2
3
4
5
6function playlist_enqueue_scripts(){
wp_enqueue_style('wp-mediaelement');
wp_enqueue_script( 'jquery' );
wp_enqueue_script('wp-mediaelement');
}
add_action('wp_enqueue_scripts', 'playlist_enqueue_scripts');
该代码段未起作用,依然无法解析 playlist。关于 kratos-pjax 的个性化修改暂时放一放,暂时在 footer.php 中强行加入下面的 js 脚本来解决 playlist 解析的问题。
1 | <script src='https://suki.xiocs.com/wp-includes/js/hoverintent-js.min.js?ver=2.2.1'></script> |
(完)