You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CF7表单提交时functions.php中var_dump触发Invalid JSON错误排查

报错核心原因

这个invalid_json报错是CF7 AJAX提交流程被异常中断导致的:

  1. 新版CF7默认通过REST接口处理表单提交,要求接口最终返回标准JSON格式响应,你在回调函数里用var_dump直接输出内容、再调用die终止程序执行,会导致接口返回的内容是你打印的PHP变量结构,完全不符合JSON格式要求,前端自然抛出解析错误。
  2. 邮件能正常发送是因为wpcf7_mail_sent钩子的触发时机是邮件发送流程完成之后,你中断程序的时候邮件已经发出去了,不影响邮件投递,只是响应返回环节被打断。
  3. 两周前同代码能正常调试,大概率是当时站点未启用CF7的REST提交模式,或存在其他配置切换到了兼容性更高的老式admin-ajax提交通道,近期配置变更后就触发了报错。回退CF7版本没有效果,是因为问题和CF7版本本身无关,是调试方式不符合当前接口返回要求。

另外注意你代码里绑定的是wpcf7_mail_sent钩子,和你提到的before_mail_sent时机完全不同:如果要排查邮件内容缺失问题,这个钩子拿到的数据是发件完成后的存档数据,你需要绑定wpcf7_before_send_mail钩子,才能拿到实际用于生成邮件内容的提交数据。

可行解决方案

不要在CF7的AJAX处理钩子中直接输出内容、中断程序执行,用下面的方式调试即可:

  1. 开启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 );
  1. 修改你的钩子回调代码,把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 ) );
}
  1. 正常提交一次表单,之后打开站点路径wp-content/debug.log,就能看到完整的提交数据,不会触发任何JSON报错。
数据缺失排查提示

如果日志里确实能看到部分字段缺失,优先排查这几个方向:

  • 表单前端的字段name属性是否被自定义JS、主题代码、缓存插件修改,导致提交时字段名和CF7后台配置的不一致
  • 是否安装了反垃圾、表单字段过滤类插件,自动拦截了识别为可疑内容的字段
  • 多选、复选框类字段如果未选中任何选项,CF7默认不会在提交数据中保留对应字段,属于正常逻辑

内容的提问来源于stack exchange,提问作者JakobF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:27:22