CF7表单提交时functions.php中var_dump触发Invalid JSON错误排查
报错核心原因
这个invalid_json报错是CF7 AJAX提交流程被异常中断导致的:
- 新版CF7默认通过REST接口处理表单提交,要求接口最终返回标准JSON格式响应,你在回调函数里用
var_dump直接输出内容、再调用die终止程序执行,会导致接口返回的内容是你打印的PHP变量结构,完全不符合JSON格式要求,前端自然抛出解析错误。 - 邮件能正常发送是因为
wpcf7_mail_sent钩子的触发时机是邮件发送流程完成之后,你中断程序的时候邮件已经发出去了,不影响邮件投递,只是响应返回环节被打断。 - 两周前同代码能正常调试,大概率是当时站点未启用CF7的REST提交模式,或存在其他配置切换到了兼容性更高的老式admin-ajax提交通道,近期配置变更后就触发了报错。回退CF7版本没有效果,是因为问题和CF7版本本身无关,是调试方式不符合当前接口返回要求。
另外注意你代码里绑定的是wpcf7_mail_sent钩子,和你提到的before_mail_sent时机完全不同:如果要排查邮件内容缺失问题,这个钩子拿到的数据是发件完成后的存档数据,你需要绑定wpcf7_before_send_mail钩子,才能拿到实际用于生成邮件内容的提交数据。
可行解决方案
不要在CF7的AJAX处理钩子中直接输出内容、中断程序执行,用下面的方式调试即可:
- 开启WordPress原生调试日志,在站点根目录的
wp-config.php文件中添加以下配置(放在/* That's all, stop editing! Happy publishing. */这行之前):
define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', false ); @ini_set( 'display_errors', 0 );
- 修改你的钩子回调代码,把
var_dump($posted_data); die;替换为写入日志的逻辑,如果要排查发件前的数据,顺便把钩子换成发件前触发的类型:
// 换成发件前触发的钩子,拿到的是实际用于生成邮件的真实数据 add_action('wpcf7_before_send_mail', 'ftw_veranstaltungsForm_debug_data' ); function ftw_veranstaltungsForm_debug_data( $contact_form ){ $form_id = $contact_form->id(); $submission = WPCF7_Submission::get_instance(); $posted_data = $submission->get_posted_data(); // 把提交数据写入日志文件,不干扰正常接口响应 error_log( "CF7表单[ID:{$form_id}]提交数据:" . print_r( $posted_data, true ) ); }
- 正常提交一次表单,之后打开站点路径
wp-content/debug.log,就能看到完整的提交数据,不会触发任何JSON报错。
数据缺失排查提示
如果日志里确实能看到部分字段缺失,优先排查这几个方向:
- 表单前端的字段
name属性是否被自定义JS、主题代码、缓存插件修改,导致提交时字段名和CF7后台配置的不一致 - 是否安装了反垃圾、表单字段过滤类插件,自动拦截了识别为可疑内容的字段
- 多选、复选框类字段如果未选中任何选项,CF7默认不会在提交数据中保留对应字段,属于正常逻辑
内容的提问来源于stack exchange,提问作者JakobF
相关产品推荐
相关产品推荐

