WP下七牛云储存与表单插件冲突的解决方法

最近维护的网站被管理员报告说表单功能无法正常工作。于是打开浏览器调试器发现以下error:

本来以为应该是公共库的问题,毕竟以前都没事的突然之间说无法正常工作了所以觉得应该是哪里更新完了之后出问题了。

不过查了下理论上公共库应该不会出问题才对。毕竟遇到的只有我一人?!

然后再看了下同样用wordpress的我自己的blog用同样的表单插件都没有问题。所以说明要么是这个表单插件有问题,要么是这个表单插件和最近更新的哪个插件有问题,又或者是最新版本的WordPress出问题了。

既然是js的问题,查了下error信息之后发现应该是jquery和prototype.js之间的冲突上。也就是理论上哪个地方开了jquery或者prototype.js没关上导致后继调用代码跑到另一边去了所以找不到函数。

于是检查了半天最终确定了问题出现在WPJAM 七牛镜像存储这个插件上。如果将这个插件停用之后表单就能不报错正常编辑了。但是很不幸这个插件在1.4.6版本之后被强制绑入及其无用又垃圾的WPJAM BASIC插件上。所以考虑到既然以前没问题那么换回旧版试试,于是从网上找了个最后一个稳定版1.4.5(1.4.4)装上。结果问题依然如此还是报错。

最后和朋友的帮助下发现了插件中/include/wpjam-setting-api.php中有段写js调用的部分,即方法名为wpjam_upload_image_enqueue_scripts()的部分调用了wp_enqueue_media();这个方法。就是因为调用了这个方法导致了整个error的产生。注释掉即可修复。

即原代码为


// 后台表单 JS
add_action('admin_enqueue_scripts', 'wpjam_upload_image_enqueue_scripts');
function wpjam_upload_image_enqueue_scripts() {
wp_enqueue_media();
wp_enqueue_script('wpjam-setting', plugins_url('/wpjam-setting-2.js', __FILE__), array('jquery'));
wp_localize_script('wpjam-setting', 'wpjam_setting', array(
'ajax_url'	=> admin_url('admin-ajax.php'),
'nonce'		=> wp_create_nonce('wpjam_setting_nonce')
));

wp_enqueue_style('wpjam-style', plugins_url('/wpjam-style-2.css', __FILE__));
}

修改成


// 后台表单 JS
add_action('admin_enqueue_scripts', 'wpjam_upload_image_enqueue_scripts');
function wpjam_upload_image_enqueue_scripts() {
//wp_enqueue_media();
wp_enqueue_script('wpjam-setting', plugins_url('/wpjam-setting-2.js', __FILE__), array('jquery'));
wp_localize_script('wpjam-setting', 'wpjam_setting', array(
'ajax_url'	=> admin_url('admin-ajax.php'),
'nonce'		=> wp_create_nonce('wpjam_setting_nonce')
));

wp_enqueue_style('wpjam-style', plugins_url('/wpjam-style-2.css', __FILE__));
}

即可。

 

目前暂不清楚具体是啥原因导致的问题,不过这么修改之后解决了冲突问题,希望能对有同样问题的朋友提供帮助。另外感谢@xlfdll的技术帮助。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

:b1 :b2 :b3 :b4 :b5 :b6 more »

Note: Commenter is allowed to use '@User+blank' to automatically notify your reply to other commenter. e.g, if ABC is one of commenter of this post, then write '@ABC '(exclude ') will automatically send your comment to ABC. Using '@all ' to notify all previous commenters. Be sure that the value of User should exactly match with commenter's name (case sensitive).