如何在WordPress Contact Form 7的functions.php中修改表单收件人?
问题原因
你现有代码运行报错的核心问题如下:
- AJAX上下文全局$post失效:Contact Form 7 提交走AJAX请求,请求上下文不会加载当前页的全局
$post对象,$post->ID无法拿到正确值,导致ACF字段查询为空,收件人地址无效触发发送错误 - 缺少邮箱合法性校验:未判断ACF返回值是否为有效邮箱,空值、非法格式值直接赋值给收件人必然触发发送失败
- 钩子使用不规范:
wpcf7_before_send_mail是动作钩子而非过滤器,不需要返回值,用add_action调用更符合CF7的设计规范
修复后的可用代码
add_action( 'wpcf7_before_send_mail', 'wpcf7_dynamic_recipient_from_acf', 10, 3 ); function wpcf7_dynamic_recipient_from_acf( $contact_form, &$abort, $submission ) { // 获取表单嵌入的所属文章/页面ID,兼容AJAX提交场景 $post_id = $submission->get_meta('container_post_id'); if ( !$post_id ) { return; // 拿不到所属ID时保留CF7后台配置的默认收件人 } $dynamic_email = get_field( 'form_email', $post_id ); // 仅在获取到合法邮箱时替换收件人 if ( is_email( $dynamic_email ) ) { $properties = $contact_form->get_properties(); $properties['mail']['recipient'] = $dynamic_email; $contact_form->set_properties( $properties ); } }
额外注意事项
- 确认ACF字段
form_email的绑定规则正确,需要绑定到表单嵌入的文章/页面/自定义文章类型 - 若站点存在多个CF7表单,可在逻辑中加
$contact_form->id()判断指定表单ID再执行替换,避免影响其他表单 - 如果表单放在侧边栏小工具、全局页脚等非单篇文章上下文的位置,需要单独调整ID获取逻辑适配场景
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

