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

如何在Contact Form 7邮件中动态附加生成的Word文档?

我来帮你解决这个问题!核心矛盾在于wpcf7_before_send_mail和wpcf7_mail_components这两个钩子是独立执行的,没法直接共享变量,所以我们需要用全局变量来传递每个提交生成的唯一Word文档路径,具体实现如下:

解决方案步骤

1. 修改原生成文档的函数,存储路径到全局变量

在你的cv_word_doc函数里,生成完Word文档后,把完整文件路径存到一个全局变量中,确保后续过滤器能获取到它:

add_action('wpcf7_before_send_mail', 'cv_word_doc');
function cv_word_doc($WPCF7_ContactForm) {
    // 仅针对ID为212的表单执行逻辑
    if ( $WPCF7_ContactForm->id() !== 212 ) return;

    $submission = WPCF7_Submission::get_instance();
    if (!$submission) return;

    $data = $submission->get_posted_data();
    if (empty($data)) return;

    // 从表单数据中提取姓名(根据你的实际字段名调整)
    $firstName = isset($data['first-name']) ? $data['first-name'] : 'unknown';
    $lastName = isset($data['last-name']) ? $data['last-name'] : 'user';

    // 设置文件存储路径和文件名
    $upload_dir = wp_upload_dir();
    $upload_dir = $upload_dir['basedir'] . '/cv/';
    $fileName = 'cv-' . str_replace(' ', '-', strtolower($firstName)) . '-' . str_replace(' ', '-', strtolower($lastName)) .'-'. time() .'.docx';
    $fileFullPath = $upload_dir . $fileName;

    // 你的PHPWord生成文档逻辑(省略部分保留)
    // $objWriter->save($fileFullPath);

    // 将文件路径存入全局变量,供后续过滤器使用
    global $cf7_generated_doc_path;
    $cf7_generated_doc_path = $fileFullPath;
}

2. 用wpcf7_mail_components过滤器添加附件

编写过滤器函数,读取全局变量中的文件路径,将其添加到邮件附件列表,处理完成后记得清空全局变量,避免后续提交复用错误路径:

add_filter( 'wpcf7_mail_components', 'add_generated_doc_to_cf7_email' );
function add_generated_doc_to_cf7_email( $components ) {
    global $cf7_generated_doc_path;

    // 校验文件路径有效性:变量存在且文件确实存在
    if ( isset($cf7_generated_doc_path) && file_exists($cf7_generated_doc_path) ) {
        // 将生成的Word文档加入邮件附件
        $components['attachments'][] = $cf7_generated_doc_path;
        
        // 清空全局变量,防止影响下一次表单提交
        unset($cf7_generated_doc_path);
    }

    return $components;
}

额外注意事项

  • 表单范围控制:如果不想让这个逻辑影响所有CF7表单,可以在过滤器函数里也增加表单ID判断,比如:
    $current_form = WPCF7_ContactForm::get_current();
    if ($current_form->id() !== 212) return $components;
    
  • 文件权限检查:确保/wp-content/uploads/cv/目录有服务器写入权限,否则文档生成会失败。
  • 调试排查:可以添加日志记录辅助排查问题,比如在生成文件后添加error_log('Generated CV path: ' . $fileFullPath);,查看服务器日志确认路径是否正确。

这样就能实现每个表单提交对应唯一Word文档,并成功附加到CF7发送的邮件中了。

内容的提问来源于stack exchange,提问作者lukeseager

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:03:19