Contact Form 7 条件触发免发信跳转时出现invalid_json错误如何解决
问题排查与修复方案
核心问题原因
- 判断逻辑误用赋值运算符:你代码中
if判断里的$service = "Full Package for Single"是赋值操作,不是等值判断,无论用户选的是什么service,这里都会被赋值为目标值,判断逻辑完全失效,正确应该用==或者===做等值判断。 - 重定向逻辑不符合CF7的提交机制:当前版本Contact Form 7默认走REST API接口提交表单,前端提交后要求返回标准JSON格式响应,你直接在服务端执行
wp_redirect+exit会打断CF7的响应生成流程,直接返回302重定向响应,前端无法解析自然会报invalid_json错误。 - 潜在字段类型不匹配问题:表单提交的
applicant_pin默认是字符串类型,你预设的邮编数组是数字类型,部分严格场景下会出现匹配失败的问题。
修复后的完整实现
第一步:服务端代码(添加到主题functions.php或自定义插件中)
add_action( 'wpcf7_before_send_mail', 'wpcf7_check_redirection', 10, 1 ); function wpcf7_check_redirection( $contact_form ) { // 只处理目标表单 if( $contact_form->id() != 2852 ) { return; } $submission = WPCF7_Submission::get_instance(); if ( ! $submission ) { return; } $cf7_data = $submission->get_posted_data(); $service = $cf7_data['service'] ?? ''; $pincode = intval( $cf7_data['applicant_pin'] ?? 0 ); $saltLake = array(700064, 700091, 700097, 700098, 700105, 700106, 700059, 700101, 700135, 700102, 700157, 700159); // 匹配条件:服务符合+邮编在列表内 if ( in_array( $service, array("Full Package for Single", "Full Package for Couples") ) && in_array( $pincode, $saltLake ) ) { // 跳过邮件发送 $contact_form->skip_mail = true; // 给提交实例加标记,后续用来加跳转参数 $submission->add_custom_property( 'need_redirect', true ); } } // 向CF7响应中添加重定向参数 add_filter( 'wpcf7_feedback_response', 'wpcf7_add_redirect_param', 10, 2 ); function wpcf7_add_redirect_param( $response, $result ) { $submission = WPCF7_Submission::get_instance(); if ( $submission && $submission->get_custom_property( 'need_redirect' ) ) { $response['redirect_url'] = "https://example.com/services/"; } return $response; }
第二步:前端JS代码(添加到表单页页脚或主题自定义JS文件中)
document.addEventListener( 'wpcf7submit', function( event ) { // 检查响应中是否有重定向地址 if ( event.detail.response && event.detail.response.redirect_url ) { window.location.href = event.detail.response.redirect_url; } }, false );
验证说明
修改后提交表单如果满足匹配条件,CF7会正常返回JSON响应,前端接收到响应中的redirect_url参数后自动执行跳转,不会再出现JSON解析错误。
内容的提问来源于stack exchange,提问作者Ranadeep
相关产品推荐
相关产品推荐

