Contact Form7中wpcf7_before_send_mail钩子get_posted_data返回NULL求助
解决CF7提交数据获取为NULL的问题
首先,你遇到的get_posted_data()返回NULL的问题,主要是钩子时机不对、CF7新版本API使用有误,或者代码逻辑偏差导致的。我给你梳理下修正方案:
核心问题分析
- 钩子优先级设置过早:你把钩子优先级设为
1,这时候CF7的提交数据可能还没完成初始化,导致WPCF7_Submission实例无法正确获取数据。 - 冗余的过时判断:
!isset($contact_form->posted_data)这个判断已经失效,CF7新版本早已弃用$contact_form->posted_data属性,直接依赖WPCF7_Submission即可。 - 字段取值逻辑错误:你代码里把表单ID(
$formData['_wpcf7'])存到first_name元字段里,这明显是笔误,应该取对应表单字段的实际值(比如$formData['first_name'])。
修正后的代码
add_action('wpcf7_before_send_mail', 'contactform7_save_booked_event_data', 10); function contactform7_save_booked_event_data($contact_form) { // 获取CF7提交实例,这是新版本获取数据的标准方式 $submission = WPCF7_Submission::get_instance(); // 排除无效提交场景 if (!$submission) { return $contact_form; } // 获取提交的表单数据 $form_data = $submission->get_posted_data(); // 确保数据存在,同时可以添加表单ID过滤(只处理目标表单) $target_form_id = 123; // 替换成你的CF7表单ID,从编辑页URL或短代码中获取 if (empty($form_data) || $form_data['_wpcf7'] != $target_form_id) { return $contact_form; } // 安全获取表单字段值,这里假设你的表单有name为first_name的字段 $first_name = isset($form_data['first_name']) ? sanitize_text_field($form_data['first_name']) : ''; // 更新文章元字段,确保199是正确的目标文章ID if (!empty($first_name)) { update_post_meta(199, 'first_name', $first_name); } return $contact_form; }
额外检查事项
- 确认表单字段name属性:在CF7编辑界面,你的姓名字段应该是类似
[text first_name "Your Name"]的格式,first_name就是字段的name,必须和代码里的取值键完全一致。 - 排查插件/主题冲突:暂时禁用其他插件、切换到默认主题(比如Twenty Twenty-One)测试,看是否有其他代码干扰CF7的提交流程。
- 恢复AJAX提交:CF7的AJAX提交是默认且稳定的,强制关闭反而可能导致数据获取异常,建议开启AJAX提交测试。
内容的提问来源于stack exchange,提问作者user3795286
相关产品推荐
相关产品推荐

