昨日的沙坪坝天气大晴,得意忘形之下急性咽炎发作,大意了。从校医院拿了药回来,不太想干活,就来整理一下这几天遇到的一个关于 wordpress 主题屏蔽部分 js 导致的解析错误问题。

wordpress 版本 5.3.2 更换主题 kratos-pjax 后,插入的音频列表无法被正确的解析出来。通过审查元素发现,DOM ID 为 tmpl-wp-playlist-itemtmpl-wp-playlist-current-item 的脚本都存在,初步断定 wp_playlist_scripts() 脚本大概率工作正常;同时 DOM Class 为 wp-playlist wp-audio-playlist wp-playlist-light 的元素也都存在,且被正确解析,大体可以排除文章内容渲染的问题。

suki.playlist.jpg

在局域网搭建一个新的 wordpress 站点,安装同样的插件后,在默认的 twenty-twenty 主题下,插入的音频列表可以被正确解析且能够播放;安装 kratos-pjax 主题后无法解析,因此可以断定问题出在主题上。kratos-pjax 是一个基于 kratos 进行二次开发的主题,目录结构和 function.php 差异很大,为进一步排除干扰,安装 kratos 并再次测试,音频列表解析正常。再次查看网页源代码,发现没有加载 wp-playlist.min.jsmediaelement-migrate.min.jsmediaelement-and-player.min.js 这三个脚本,而相应的 wp-mediaelement.min.css 有被加载出来,至此锁定到问题源。

wordpress 的主题开发可以通过 remove_action 屏蔽部分不必要的模块,推测是主题中移除了 mediaelement 相关的脚本。查看主题代码 core.php 文件,发现有大量 remove_action 移除 header 脚本的操作,但是没有找到与 mediaelement 相关的移除代码,更进一步地全局搜索 wp_playlist_scriptsmediaelement 等关键字,也未发现任何移除的迹象。尝试注释所有 remove_action 代码段,并重启 fpm 服务,脚本依然无法加载。

因此换一个思路,在 function.php 最下面添加了如下代码,尝试将 mediaelement 重新加载进去。

function 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 解析的问题。

<script src='https://suki.xiocs.com/wp-includes/js/hoverintent-js.min.js?ver=2.2.1'></script>
<script src='https://suki.xiocs.com/wp-includes/js/admin-bar.min.js?ver=5.3.2'></script>
<script src='https://suki.xiocs.com/wp-includes/js/comment-reply.min.js?ver=5.3.2'></script>
<script src='https://suki.xiocs.com/wp-includes/js/wp-embed.min.js?ver=5.3.2'></script>
<script src='https://suki.xiocs.com/wp-includes/js/underscore.min.js?ver=1.8.3'></script>
<script src='https://suki.xiocs.com/wp-includes/js/jquery/jquery.js?ver=1.12.4-wp'></script>
<script src='https://suki.xiocs.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=1.4.1'></script>
<script src='https://suki.xiocs.com/wp-includes/js/wp-util.min.js?ver=5.3.2'></script>
<script src='https://suki.xiocs.com/wp-includes/js/backbone.min.js?ver=1.4.0'></script>
<script src='https://suki.xiocs.com/wp-includes/js/underscore.min.js?ver=1.8.3'></script>        
<script src='https://suki.xiocs.com/wp-includes/js/mediaelement/mediaelement-and-player.min.js?ver=4.2.13-9993131'></script>
<script src='https://suki.xiocs.com/wp-includes/js/mediaelement/mediaelement-migrate.min.js?ver=5.3.2'></script>
<script>
var _wpmejsSettings = {"pluginPath":"\/wp-includes\/js\/mediaelement\/","classPrefix":"mejs-","stretching":"responsive"};
</script>
<script src='https://suki.xiocs.com/wp-includes/js/mediaelement/wp-playlist.min.js?ver=5.3.2'></script>

(完)