如何将API响应$body填充到Contact Form 7的$posted_data隐藏字段
问题根因
WPCF7_Submission::get_posted_data()方法返回的是提交数据的副本,直接修改赋值后的$posted_data变量不会同步到提交对象本身,因此后续钩子读取到的仍然是原始提交值- 你现有代码的else分支中,获取到
$body后直接return结束了函数,没有执行写入提交对象的操作,也是赋值不生效的原因之一
解决方法
修改$posted_data后调用$submission->set_posted_data()方法,将修改后的数据写回提交对象即可,修改后的代码如下:
add_action( 'wpcf7_before_send_mail', 'Kiri_cf7_api_sender' ); function Kiri_cf7_api_sender( $contact_form ) { if ( $contact_form->title === 'Quote_form' ) { $submission = WPCF7_Submission::get_instance(); if ( $submission ) { $posted_data = $submission->get_posted_data(); $name = $posted_data['your-name']; $surname = $posted_data['your-name2']; $phone = $posted_data['tel-922']; $urltest = $posted_data['dynamichidden-739']; $body = $posted_data['dynamichidden-458']; if ( strpos( $urltest, '?phone' ) !== false ) { $url = 'api string'; // 该分支如果需要请求API,逻辑和下方else分支一致即可 } elseif ( strpos( $urltest, '?email' ) !== false ) { $url = 'api string'; // 该分支如果需要请求API,逻辑和下方else分支一致即可 } else { $url = 'api string'; $response = wp_remote_post( $url ); $body = wp_remote_retrieve_body( $response ); // 调试日志可以保留,不要提前return中断流程 ob_start(); var_dump( $name, $surname, $phone, $url, $urltest, $body ); $contents = ob_get_contents(); ob_end_clean(); error_log( $contents ); // 给posted_data副本赋值 $posted_data["dynamichidden-458"] = $body; // 将修改后的数据写回提交对象,后续钩子就能读到新值 $submission->set_posted_data( $posted_data ); } } } }
后续取值说明
在wpcf7_mail_sent钩子中,只要通过WPCF7_Submission::get_instance()->get_posted_data()获取提交数据,就能拿到你修改后的dynamichidden-458字段值。
注意事项
- 确保你使用的CF7版本支持
set_posted_data方法,该方法在CF7 4.6+版本中已稳定支持 - 确保
dynamichidden-458字段确实在你的CF7表单配置中存在,否则CF7会自动过滤不存在的字段
内容的提问来源于stack exchange,提问作者KiriqN
相关产品推荐
相关产品推荐

