在WordPress的Contact Form7插件邮件中集成ICS文件链接
实现Contact Form7表单生成ICS日历链接并嵌入邮件
核心实现思路
- 利用Contact Form7的
wpcf7_before_send_mail钩子,在邮件发送前处理表单提交数据 - 通过ICS类生成符合iCalendar标准的事件内容
- 将ICS文件保存到服务器可公开访问的目录,生成有效链接
- 将链接插入邮件内容,随表单邮件发送至收件箱
修正并完善后的代码
// 生成ICS文件的工具类 class ICS { private $data; private $name; // 构造函数:接收事件时间、标题、描述、地点参数 public function __construct($start, $end, $name, $description, $location) { $this->name = sanitize_file_name($name); // 生成唯一UID,避免日历应用识别冲突 $uid = uniqid('', true) . '@yourdomain.com'; // 构造符合iCalendar标准的内容 $this->data = "BEGIN:VCALENDAR VERSION:2.0 METHOD:PUBLISH BEGIN:VEVENT DTSTART:" . date("Ymd\THis\Z", strtotime($start)) . " DTEND:" . date("Ymd\THis\Z", strtotime($end)) . " LOCATION:" . htmlspecialchars($location) . " TRANSP:OPAQUE SEQUENCE:0 UID:" . $uid . " DTSTAMP:" . date("Ymd\THis\Z") . " SUMMARY:" . htmlspecialchars($name) . " DESCRIPTION:" . htmlspecialchars($description) . " PRIORITY:1 CLASS:PUBLIC BEGIN:VALARM TRIGGER:-PT10080M ACTION:DISPLAY DESCRIPTION:Reminder END:VALARM END:VEVENT END:VCALENDAR"; } // 将ICS内容保存到服务器可访问目录并返回公开链接 public function save() { // 定义存储目录:WordPress上传目录下的ics-events子文件夹 $upload_dir = wp_upload_dir(); $ics_dir = $upload_dir['basedir'] . '/ics-events'; // 目录不存在则创建 if (!file_exists($ics_dir)) { mkdir($ics_dir, 0755, true); } // 生成唯一文件名,避免重复覆盖 $file_path = $ics_dir . '/' . $this->name . '-' . uniqid() . '.ics'; file_put_contents($file_path, $this->data); // 转换为可访问的URL return str_replace($upload_dir['basedir'], $upload_dir['baseurl'], $file_path); } // 返回ICS原始内容 public function show() { return $this->data; } } // 挂钩Contact Form7邮件发送前的处理事件 add_action('wpcf7_before_send_mail', 'cf7_generate_ics_link_and_add_to_email'); function cf7_generate_ics_link_and_add_to_email($wpcf7) { // 获取表单提交实例 $submission = WPCF7_Submission::get_instance(); if (!$submission) return; $posted_data = $submission->get_posted_data(); // 从表单数据中提取字段(请根据你的CF7表单实际字段名修改) $start_date = isset($posted_data['start-date']) ? $posted_data['start-date'] : ''; $end_date = isset($posted_data['end-date']) ? $posted_data['end-date'] : ''; $event_name = isset($posted_data['event-name']) ? $posted_data['event-name'] : '未命名事件'; $event_desc = isset($posted_data['event-description']) ? $posted_data['event-description'] : ''; $event_location = isset($posted_data['event-location']) ? $posted_data['event-location'] : ''; // 验证必要字段是否完整 if (empty($start_date) || empty($end_date)) return; // 生成ICS文件并获取公开链接 $ics_event = new ICS($start_date, $end_date, $event_name, $event_desc, $event_location); $ics_link = $ics_event->save(); // 获取并修改邮件内容 $mail = $wpcf7->prop('mail'); // 在邮件末尾添加ICS链接(也可替换自定义邮件标签,比如[ics-link]) $mail['body'] .= "\n\n---\n添加到日历:<a href='$ics_link'>点击下载ICS文件</a>"; // 更新邮件内容 $wpcf7->set_prop('mail', $mail); }
关键注意事项
- 字段名适配:请根据你的Contact Form7表单实际字段名,修改
$posted_data中的键名(如start-date、event-name等) - 权限配置:确保服务器对
wp-content/uploads/ics-events目录有写入权限,否则无法保存ICS文件 - UID唯一性:代码中生成的唯一UID是为了避免日历应用识别重复事件,可根据需要修改域名后缀
内容的提问来源于stack exchange,提问作者Myuser03
相关产品推荐
相关产品推荐

