WordPress 4.9.6中TinyMCE.ui.Controller未定义问题求助
这问题我之前帮开发者排查过类似的,结合WordPress 4.9.6的核心更新和TinyMCE的变动,大概率是以下几个原因导致的:
可能的原因
WordPress对TinyMCE的模块裁剪
WordPress 4.9.6升级时,可能为了优化后台加载速度,对内置的TinyMCE进行了自定义打包,默认不再加载Controller这个非核心UI模块。而4.9.5版本是全量加载TinyMCE的UI组件,所以之前能正常访问。脚本加载顺序冲突
你的自定义代码可能在TinyMCE的Controller模块完成注册前就尝试访问它。4.9.6调整了后台脚本的加载优先级或异步策略,导致依赖的模块还未初始化就被调用。主题/插件的兼容问题
如果你的主题或第三方插件有修改TinyMCE加载逻辑的代码(比如通过tiny_mce_before_init钩子修改配置),4.9.6的核心变动可能打破了之前的兼容逻辑,导致Controller模块无法正常加载。
解决方法
1. 显式加载Controller模块
通过WordPress的tinymce_enqueue_scripts钩子,在TinyMCE初始化前强制加载Controller模块:
add_action('tinymce_enqueue_scripts', function() { // 注册Controller模块到TinyMCE的UI工厂 wp_add_inline_script( 'wp-tinymce', 'if (tinymce.ui && tinymce.ui.Factory) { tinymce.ui.Factory.add("controller", tinymce.ui.Controller); }' ); // 如果上述方法无效,可以尝试直接加载对应的模块脚本 wp_enqueue_script( 'tinymce-controller', includes_url('js/tinymce/ui/controller.js'), array('wp-tinymce'), false, true ); });
注意:脚本路径可能需要根据WordPress的实际安装目录调整。
2. 确保代码在TinyMCE初始化后执行
修改你的前端代码,监听TinyMCE的init事件,确保在编辑器完全初始化后再访问Controller:
tinymce.init({ setup: function(editor) { editor.on('init', function() { // 在这里安全访问tinymce.ui.Controller if (typeof tinymce.ui.Controller !== 'undefined') { // 你的业务逻辑代码 } else { console.warn('TinyMCE Controller模块未加载'); } }); } });
3. 核对WordPress 4.9.6更新日志
可以查看WordPress官方的4.9.6更新说明,确认是否有关于TinyMCE模块调整的记录,这能帮你更精准地定位问题根源。
从你提供的截图来看,控制台明确抛出
tinymce.ui.Controller is undefined的错误,这直接证明该模块未被注册到TinyMCE的UI命名空间中,和上面提到的模块裁剪或加载顺序问题完全匹配。
内容的提问来源于stack exchange,提问作者Britt Danzer

