如何在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
相关产品推荐
相关产品推荐

