问题描述
用户评论文章时提示“网络错误,请重试”的错误信息,刷新页面能看到发布的评论。
解决方案
经过站长调试,发现问题出在主题设置→通知设置中的这两项
报错解析
有人会问了,你开了SMTP发件系统开关,是不是没配置啊?
配置了,但就是会报错。
Uncaught ReferenceError: jQuery is not defined
页面上有一个 JavaScript 脚本(在 archives/312 这个页面里)试图调用 jQuery($ 符号),但此时浏览器还没有加载或根本找不到 jQuery 这个库。大概率是主题或插件的脚本加载顺序出了问题(脚本在 jQuery 库文件加载之前就执行了),或者 jQuery 库因 CDN 链接失效、被插件禁用等原因根本没有加载成功。
因为第一行的报错带来的连锁反应导致第二个报错发生
Uncaught TypeError: is not a function (位于 erphpdown.js)
erphpdown 插件(一个收费下载/会员插件)的 JS 文件开始运行了。它内部的标准写法通常是
(function($){ … })(jQuery);
既然 jQuery 是 undefined(未定义),那么传进插件的参数就是 undefined。插件试图把 undefined 当作函数来调用(比如 $.ajax 或 $(document)),所以浏览器报错“这不是一个函数”。
所以说这是由“jQuery 未加载”直接导致的,插件本身并没有坏,只是它的运行环境坏了。
因为前两项的报错导致最终评论系统报错
SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data (位于 comments.js)
前端评论脚本通过 AJAX 向服务器请求数据,并期望服务器返回一个标准的 JSON 格式 数据。但服务器返回的第一行第一个字符不是 { 或 [,而是别的字符(比如 PHP 警告、报错信息、或者 HTML 标签)。
为啥会这样?因为 erphpdown 插件的 JS 挂了,它很可能也同时挂载了后端的某些钩子(Hook)。当 PHP 后端因为插件兼容性问题抛出 致命错误(Fatal Error) 或 警告(Warning) 时,这些错误文本会直接输出到 AJAX 的返回值里,污染了原本该返回的 JSON 数据,导致前端的 JSON.parse 解析失败。
总结:
jQuery 库加载失败
➔ 导致 erphpdown.js 无法运行(报错 is not a function)
➔ 导致该插件相关的 PHP 后端逻辑出现异常,输出错误信息污染了 AJAX 接口
➔ 导致评论提交时拿不到正确的 JSON 数据,最终报 JSON.parse 错误。
那这一时刻又有聪明的吴彦祖要问了
“关掉邮箱通知跟jQuery库有什么关系呢?”
问得好,“关掉邮箱评论通知”并没有修复“jQuery未定义”的报错,但它精准地绕过了导致“评论提交失败”的那个核心点。
邮箱发信失败时产生的“错误警告文本”,污染了本该返回纯JSON格式的数据接口
当你点击提交评论时,WordPress 后端会按顺序做两件事:
-
先保存评论内容到数据库。
-
再触发“邮箱评论通知”功能(调用 wp_mail() 函数给你或管理员发邮件)。
主题自带的SMTP功能并不完善,当 wp_mail() 尝试发信但失败时,PHP 会吐出一个警告(Warning)或错误(Notice)
更生草的是,这个警告文本不是存进日志里,而是直接打印(echo)在了接口的返回输出流里。
结果前端 comments.js 期待的返回值应该是 {“success”:true, “msg”:”…”},但因为发信报错,实际返回变成了:
Warning: mail(): Failed to connect to mailserver at … in /xxx/wp-includes/pluggable.php
{“success”:true, “msg”:”…”}
JSON.parse() 看到第一行第一个字符是 W(而不是 {),直接报错 unexpected character at line 1 column 1,所以评论发布后提示失败。
理论上还是发信配置问题
为什么关掉发信就能好?当你关掉“邮箱评论通知”后,WordPress 后台逻辑直接跳过了 wp_mail() 的执行步骤。不再尝试发信,PHP 也就不再抛出任何警告文本。后端干干净净地只输出纯 JSON 数据,前端解析成功,评论自然就提交成功了。
但是,jQuery is not defined 报错:这个报错依然存在,只是它们没有阻塞评论提交的 HTTP 请求。
关掉邮件通知后,只是觉得“评论功能好了”,但如果打开浏览器 F12 控制台,那个红色的 JS 报错大概率还在,不过不影响纯文字评论的提交了。



评论(1)