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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 05:09:03