文章目录[隐藏]
详细指南:在WordPress中集成邮件订阅与营销工具,通过代码二次开发实现常用互联网小工具功能
引言:为什么需要在WordPress中集成邮件订阅与营销工具
在当今数字营销时代,邮件订阅与营销仍然是企业与用户保持联系、提升转化率的最有效方式之一。据统计,邮件营销的投资回报率(ROI)高达4200%,平均每花费1美元可获得42美元的回报。对于WordPress网站所有者而言,集成专业的邮件订阅与营销工具不仅能提升用户体验,还能为网站带来持续的流量和收入。
然而,许多WordPress用户仅仅依赖第三方插件来实现这些功能,这不仅可能导致网站性能下降,还可能带来安全风险。通过代码二次开发的方式,我们可以更灵活、更高效地实现邮件订阅与营销功能,同时保持网站的性能和安全性。
本指南将详细介绍如何通过WordPress代码二次开发,实现邮件订阅表单、用户管理、自动化营销等常用互联网小工具功能,帮助您打造一个功能强大且高度定制化的邮件营销系统。
第一部分:准备工作与环境配置
1.1 选择合适的邮件营销服务API
在开始开发之前,您需要选择一个邮件营销服务提供商。以下是几个主流选择:
- Mailchimp:用户友好,免费套餐适合初学者
- SendinBlue:强大的自动化功能,性价比高
- ConvertKit:专注于内容创作者
- MailerLite:简洁易用,价格合理
本指南将以Mailchimp为例,但原理适用于大多数邮件营销服务。
1.2 获取API密钥与配置开发环境
- 登录您的Mailchimp账户,进入"账户" > "扩展功能" > "API密钥"
- 创建新的API密钥并妥善保存
- 在WordPress中配置API密钥:
// 在wp-config.php中添加
define('MAILCHIMP_API_KEY', 'your-api-key-here');
define('MAILCHIMP_LIST_ID', 'your-list-id-here');
1.3 创建自定义插件结构
为了避免主题更新导致代码丢失,我们建议创建一个独立的插件:
wp-content/plugins/custom-email-marketing/
├── custom-email-marketing.php
├── includes/
│ ├── class-mailchimp-handler.php
│ ├── class-subscription-manager.php
│ └── class-automation-triggers.php
├── assets/
│ ├── css/
│ └── js/
└── templates/
└── subscription-form.php
第二部分:构建核心邮件订阅功能
2.1 创建邮件订阅表单处理类
// includes/class-subscription-manager.php
class Custom_Email_Subscription_Manager {
private $mailchimp_handler;
public function __construct() {
$this->mailchimp_handler = new Mailchimp_Handler();
add_action('wp_ajax_subscribe_email', array($this, 'handle_subscription'));
add_action('wp_ajax_nopriv_subscribe_email', array($this, 'handle_subscription'));
add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
}
public function enqueue_scripts() {
wp_enqueue_script(
'custom-email-subscription',
plugin_dir_url(__FILE__) . '../assets/js/subscription.js',
array('jquery'),
'1.0.0',
true
);
wp_localize_script('custom-email-subscription', 'email_ajax', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('email_subscription_nonce')
));
}
public function handle_subscription() {
// 验证nonce
if (!wp_verify_nonce($_POST['nonce'], 'email_subscription_nonce')) {
wp_die('安全验证失败');
}
// 验证和清理输入
$email = sanitize_email($_POST['email']);
$first_name = sanitize_text_field($_POST['first_name'] ?? '');
$last_name = sanitize_text_field($_POST['last_name'] ?? '');
if (!is_email($email)) {
wp_send_json_error('请输入有效的邮箱地址');
}
// 调用Mailchimp API
$result = $this->mailchimp_handler->add_subscriber(
$email,
$first_name,
$last_name
);
if ($result['success']) {
// 在本地数据库中也保存用户信息
$this->save_subscriber_locally($email, $first_name, $last_name);
// 发送欢迎邮件
$this->send_welcome_email($email, $first_name);
wp_send_json_success('订阅成功!请检查您的邮箱确认订阅。');
} else {
wp_send_json_error($result['message']);
}
}
private function save_subscriber_locally($email, $first_name, $last_name) {
global $wpdb;
$table_name = $wpdb->prefix . 'email_subscribers';
$wpdb->insert(
$table_name,
array(
'email' => $email,
'first_name' => $first_name,
'last_name' => $last_name,
'subscription_date' => current_time('mysql'),
'status' => 'active'
),
array('%s', '%s', '%s', '%s', '%s')
);
}
private function send_welcome_email($email, $name) {
$subject = '欢迎订阅我们的内容!';
$message = "亲爱的" . ($name ?: '用户') . ",nn";
$message .= "感谢您订阅我们的内容!nn";
$message .= "您将定期收到我们的最新内容、优惠信息和其他更新。nn";
$message .= "祝好,n您的网站团队";
wp_mail($email, $subject, $message);
}
}
2.2 实现Mailchimp API处理类
// includes/class-mailchimp-handler.php
class Mailchimp_Handler {
private $api_key;
private $list_id;
private $data_center;
private $api_url;
public function __construct() {
$this->api_key = defined('MAILCHIMP_API_KEY') ? MAILCHIMP_API_KEY : '';
$this->list_id = defined('MAILCHIMP_LIST_ID') ? MAILCHIMP_LIST_ID : '';
$this->data_center = substr($this->api_key, strpos($this->api_key, '-') + 1);
$this->api_url = 'https://' . $this->data_center . '.api.mailchimp.com/3.0/';
}
public function add_subscriber($email, $first_name = '', $last_name = '') {
$member_id = md5(strtolower($email));
$url = $this->api_url . 'lists/' . $this->list_id . '/members/' . $member_id;
$data = array(
'email_address' => $email,
'status' => 'pending', // 或 'subscribed' 如果不需要确认
'merge_fields' => array(
'FNAME' => $first_name,
'LNAME' => $last_name
)
);
$response = wp_remote_request($url, array(
'method' => 'PUT',
'headers' => array(
'Authorization' => 'Basic ' . base64_encode('user:' . $this->api_key),
'Content-Type' => 'application/json'
),
'body' => json_encode($data),
'timeout' => 15
));
if (is_wp_error($response)) {
return array(
'success' => false,
'message' => '连接邮件服务失败:' . $response->get_error_message()
);
}
$response_code = wp_remote_retrieve_response_code($response);
$response_body = json_decode(wp_remote_retrieve_body($response), true);
if ($response_code == 200) {
return array('success' => true, 'data' => $response_body);
} else {
$error_message = isset($response_body['detail']) ?
$response_body['detail'] : '未知错误';
return array('success' => false, 'message' => $error_message);
}
}
public function get_subscriber_count() {
$url = $this->api_url . 'lists/' . $this->list_id;
$response = wp_remote_get($url, array(
'headers' => array(
'Authorization' => 'Basic ' . base64_encode('user:' . $this->api_key)
),
'timeout' => 10
));
if (!is_wp_error($response)) {
$data = json_decode(wp_remote_retrieve_body($response), true);
return isset($data['stats']['member_count']) ?
$data['stats']['member_count'] : 0;
}
return 0;
}
}
2.3 创建订阅表单模板
// templates/subscription-form.php
<div class="email-subscription-form">
<h3>订阅我们的内容</h3>
<p>获取最新更新和独家内容</p>
<form id="email-subscription-form" method="post">
<div class="form-group">
<input type="text" name="first_name" id="first_name"
placeholder="名字 (可选)" class="form-control">
</div>
<div class="form-group">
<input type="text" name="last_name" id="last_name"
placeholder="姓氏 (可选)" class="form-control">
</div>
<div class="form-group">
<input type="email" name="email" id="email"
placeholder="邮箱地址 *" required class="form-control">
</div>
<div class="form-group privacy-consent">
<input type="checkbox" name="privacy_consent" id="privacy_consent" required>
<label for="privacy_consent">
我同意接收营销邮件并已阅读
<a href="/privacy-policy">隐私政策</a>
</label>
</div>
<button type="submit" class="btn btn-primary">
<span class="default-text">订阅</span>
<span class="loading-text" style="display:none;">
<i class="spinner"></i> 处理中...
</span>
</button>
<div class="response-message" style="display:none;"></div>
</form>
</div>
<style>
.email-subscription-form {
background: #f8f9fa;
padding: 30px;
border-radius: 8px;
margin: 20px 0;
}
.email-subscription-form .form-group {
margin-bottom: 15px;
}
.email-subscription-form .form-control {
width: 100%;
padding: 12px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 16px;
}
.email-subscription-form .btn-primary {
background: #007cba;
color: white;
border: none;
padding: 12px 30px;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
width: 100%;
}
.email-subscription-form .privacy-consent {
font-size: 14px;
margin-bottom: 20px;
}
.email-subscription-form .response-message {
margin-top: 15px;
padding: 10px;
border-radius: 4px;
}
.email-subscription-form .success {
background: #d4edda;
color: #155724;
border: 1px solid #c3e6cb;
}
.email-subscription-form .error {
background: #f8d7da;
color: #721c24;
border: 1px solid #f5c6cb;
}
</style>
2.4 添加前端JavaScript处理
// assets/js/subscription.js
jQuery(document).ready(function($) {
$('#email-subscription-form').on('submit', function(e) {
e.preventDefault();
var form = $(this);
var submitBtn = form.find('button[type="submit"]');
var defaultText = submitBtn.find('.default-text');
var loadingText = submitBtn.find('.loading-text');
var responseMessage = form.find('.response-message');
// 显示加载状态
defaultText.hide();
loadingText.show();
responseMessage.hide().removeClass('success error');
// 收集表单数据
var formData = {
action: 'subscribe_email',
nonce: email_ajax.nonce,
email: $('#email').val(),
first_name: $('#first_name').val(),
last_name: $('#last_name').val()
};
// 发送AJAX请求
$.ajax({
url: email_ajax.ajax_url,
type: 'POST',
data: formData,
dataType: 'json',
success: function(response) {
if (response.success) {
responseMessage.text(response.data).addClass('success').show();
form[0].reset(); // 重置表单
} else {
responseMessage.text(response.data).addClass('error').show();
}
},
error: function() {
responseMessage.text('网络错误,请稍后重试').addClass('error').show();
},
complete: function() {
defaultText.show();
loadingText.hide();
}
});
});
});
第三部分:创建用户管理与细分功能
3.1 设计本地用户数据库表
// 在插件激活时创建数据库表
register_activation_hook(__FILE__, 'custom_email_marketing_create_tables');
function custom_email_marketing_create_tables() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
$table_name = $wpdb->prefix . 'email_subscribers';
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
email varchar(100) NOT NULL,
first_name varchar(50),
last_name varchar(50),
subscription_date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
last_engagement datetime,
status varchar(20) DEFAULT 'active',
tags text,
source varchar(100),
custom_fields text,
PRIMARY KEY (id),
UNIQUE KEY email (email)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
// 创建用户标签表
$tags_table = $wpdb->prefix . 'subscriber_tags';
$sql_tags = "CREATE TABLE IF NOT EXISTS $tags_table (
id mediumint(9) NOT NULL AUTO_INCREMENT,
tag_name varchar(50) NOT NULL,
tag_description text,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY tag_name (tag_name)
) $charset_collate;";
dbDelta($sql_tags);
// 创建用户-标签关系表
$relation_table = $wpdb->prefix . 'subscriber_tag_relations';
$sql_relation = "CREATE TABLE IF NOT EXISTS $relation_table (
subscriber_id mediumint(9) NOT NULL,
tag_id mediumint(9) NOT NULL,
assigned_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (subscriber_id, tag_id),
FOREIGN KEY (subscriber_id) REFERENCES $table_name(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES $tags_table(id) ON DELETE CASCADE
) $charset_collate;";
dbDelta($sql_relation);
}
3.2 实现用户标签管理系统
// includes/class-subscriber-tags.php
class Subscriber_Tags_Manager {
public function __construct() {
add_action('admin_menu', array($this, 'add_admin_menu'));
add_action('wp_ajax_add_subscriber_tag', array($this, 'ajax_add_tag'));
add_action('wp_ajax_assign_tag_to_subscriber', array($this, 'ajax_assign_tag'));
}
public function add_admin_menu() {
add_submenu_page(
'tools.php',
'邮件订阅者管理',
'邮件订阅者',
'manage_options',
'email-subscribers',
array($this, 'render_admin_page')
);
}
public function render_admin_page() {
global $wpdb;
$subscribers_table = $wpdb->prefix . 'email_subscribers';
$tags_table = $wpdb->prefix . 'subscriber_tags';
// 获取所有订阅者
$subscribers = $wpdb->get_results(
"SELECT * FROM $subscribers_table ORDER BY subscription_date DESC"
);
// 获取所有标签
$tags = $wpdb->get_results("SELECT * FROM $tags_table");
include(plugin_dir_path(__FILE__) . '../templates/admin-subscribers.php');
}
public function ajax_add_tag() {
if (!current_user_can('manage_options')) {
wp_die('权限不足');
}
$tag_name = sanitize_text_field($_POST['tag_name']);
$tag_description = sanitize_textarea_field($_POST['tag_description'] ?? '');
global $wpdb;
$table_name = $wpdb->prefix . 'subscriber_tags';
$result = $wpdb->insert(
$table_name,
array(
'tag_name' => $tag_name,
'tag_description' => $tag_description
),
array('%s', '%s')
);
if ($result) {
wp_send_json_success(array(
'id' => $wpdb->insert_id,
'tag_name' => $tag_name
));
} else {
wp_send_json_error('创建标签失败');
}
}
public function ajax_assign_tag() {
if (!current_user_can('manage_options')) {
wp_die('权限不足');
}
$subscriber_id = intval($_POST['subscriber_id']);
$tag_id = intval($_POST['tag_id']);
global $wpdb;
$table_name = $wpdb->prefix . 'subscriber_tag_relations';
// 检查是否已存在
$exists = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $table_name WHERE subscriber_id = %d AND tag_id = %d",
$subscriber_id, $tag_id
));
if ($exists) {
wp_send_json_error('该标签已分配给此订阅者');
}
$result = $wpdb->insert(
$table_name,
array(
'subscriber_id' => $subscriber_id,
'tag_id' => $tag_id
),
array('%d', '%d')
);
if ($result) {
// 同步到Mailchimp
$this->sync_tag_to_mailchimp($subscriber_id, $tag_id);
wp_send_json_success('标签分配成功');
} else {
wp_send_json_error('标签分配失败');
}
}
private function sync_tag_to_mailchimp($subscriber_id, $tag_id) {
global $wpdb;
// 获取订阅者邮箱
$subscribers_table = $wpdb->prefix . 'email_subscribers';
$email = $wpdb->get_var($wpdb->prepare(
"SELECT email FROM $subscribers_table WHERE id = %d",
$subscriber_id
));
// 获取标签名称
$tags_table = $wpdb->prefix . 'subscriber_tags';
$tag_name = $wpdb->get_var($wpdb->prepare(
"SELECT tag_name FROM $tags_table WHERE id = %d",
$tag_id
));
if ($email && $tag_name) {
$mailchimp = new Mailchimp_Handler();
$mailchimp->add_tag_to_subscriber($email, $tag_name);
}
}
}
3.3 创建用户细分与过滤功能
// includes/class-subscriber-segmentation.php
class Subscriber_Segmentation {
public function get_segments() {
return array(
'active' => array(
'name' => '活跃用户',
'description' => '最近30天内有互动的用户',
'query' => "WHERE last_engagement >= DATE_SUB(NOW(), INTERVAL 30 DAY)"
),
'inactive' => array(
'name' => '不活跃用户',
'description' => '超过90天没有互动的用户',
'query' => "WHERE last_engagement < DATE_SUB(NOW(), INTERVAL 90 DAY) OR last_engagement IS NULL"
),
'new' => array(
'name' => '新用户',
'description' => '最近7天内订阅的用户',
'query' => "WHERE subscription_date >= DATE_SUB(NOW(), INTERVAL 7 DAY)"
),
'premium' => array(
'name' => '付费用户',
'description' => '标记为付费用户的订阅者',
'query' => "WHERE id IN (SELECT subscriber_id FROM {$wpdb->prefix}subscriber_tag_relations WHERE tag_id = (SELECT id FROM {$wpdb->prefix}subscriber_tags WHERE tag_name = 'premium'))"
)
);
}
public function get_subscribers_by_segment($segment_key, $limit = 100, $offset = 0) {
global $wpdb;
$segments = $this->get_segments();
if (!isset($segments[$segment_key])) {
return array();
}
$table_name = $wpdb->prefix . 'email_subscribers';
$query = "SELECT * FROM $table_name " . $segments[$segment_key]['query'];
$query .= " LIMIT %d OFFSET %d";
return $wpdb->get_results($wpdb->prepare($query, $limit, $offset));
}
public function create_custom_segment($conditions) {
// 动态构建查询条件
$where_clauses = array();
$params = array();
foreach ($conditions as $condition) {
switch ($condition['field']) {
case 'subscription_date':
if ($condition['operator'] == 'after') {
$where_clauses[] = "subscription_date >= %s";
$params[] = $condition['value'];
}
break;
case 'tag':
$where_clauses[] = "id IN (SELECT subscriber_id FROM {$wpdb->prefix}subscriber_tag_relations WHERE tag_id = %d)";
$params[] = intval($condition['value']);
break;
case 'source':
$where_clauses[] = "source = %s";
$params[] = sanitize_text_field($condition['value']);
break;
}
}
if (empty($where_clauses)) {
return "1=1";
}
$where_sql = implode(' AND ', $where_clauses);
global $wpdb;
$prepared_sql = $wpdb->prepare($where_sql, $params);
return $prepared_sql;
}
}
第四部分:实现自动化营销工作流
4.1 设计自动化触发器系统
// includes/class-automation-triggers.php
class Automation_Triggers {
private $triggers = array();
public function __construct() {
$this->register_default_triggers();
add_action('init', array($this, 'check_triggers'));
}
private function register_default_triggers() {
$this->triggers = array(
'new_subscription' => array(
'name' => '新用户订阅',
'callback' => array($this, 'handle_new_subscription'),
'description' => '当新用户订阅时触发'
),
'post_published' => array(
'name' => '文章发布',
'callback' => array($this, 'handle_post_published'),
'description' => '当新文章发布时触发'
),
'user_inactivity' => array(
'name' => '用户不活跃',
'callback' => array($this, 'handle_user_inactivity'),
'description' => '当用户超过指定时间未互动时触发'
),
'specific_tag_added' => array(
'name' => '添加特定标签',
'callback' => array($this, 'handle_tag_added'),
'description' => '当用户被添加特定标签时触发'
)
);
}
public function add_trigger($key, $name, $callback, $description = '') {
$this->triggers[$key] = array(
'name' => $name,
'callback' => $callback,
'description' => $description
);
}
public function check_triggers() {
// 检查计划任务
if (!wp_next_scheduled('check_automation_triggers')) {
wp_schedule_event(time(), 'hourly', 'check_automation_triggers');
}
add_action('check_automation_triggers', array($this, 'execute_scheduled_triggers'));
}
public function execute_scheduled_triggers() {
// 检查不活跃用户
$this->check_inactive_users();
// 检查其他需要定时执行的触发器
do_action('custom_email_automation_scheduled_check');
}
public function handle_new_subscription($subscriber_data) {
// 发送欢迎系列邮件
$this->send_welcome_sequence($subscriber_data['email']);
// 记录用户来源
$this->track_subscription_source($subscriber_data);
// 触发后续自动化
do_action('custom_email_new_subscription', $subscriber_data);
}
private function send_welcome_sequence($email) {
$sequence = array(
array(
'delay' => 0, // 立即发送
'subject' => '欢迎加入我们!',
'template' => 'welcome-1'
),
array(
'delay' => 86400, // 1天后
'subject' => '了解更多关于我们',
'template' => 'welcome-2'
),
array(
'delay' => 259200, // 3天后
'subject' => '特别优惠等你来',
'template' => 'welcome-3'
)
);
foreach ($sequence as $email_data) {
$this->schedule_email($email, $email_data);
}
}
private function schedule_email($email, $email_data) {
$scheduled_time = time() + $email_data['delay'];
wp_schedule_single_event(
$scheduled_time,
'send_scheduled_email',
array($email, $email_data)
);
}
public function handle_post_published($post_id) {
$post = get_post($post_id);
if ($post->post_type != 'post' || $post->post_status != 'publish') {
return;
}
// 获取相关标签的用户
$tags = wp_get_post_tags($post_id);
$tag_names = wp_list_pluck($tags, 'name');
// 查找对这些标签感兴趣的用户
$subscribers = $this->get_subscribers_by_interests($tag_names);
// 发送新文章通知
foreach ($subscribers as $subscriber) {
$this->send_post_notification($subscriber->email, $post);
}
}
private function check_inactive_users() {
global $wpdb;
$table_name = $wpdb->prefix . 'email_subscribers';
// 找到超过60天未互动的用户
$inactive_users = $wpdb->get_results(
"SELECT * FROM $table_name
WHERE (last_engagement < DATE_SUB(NOW(), INTERVAL 60 DAY)
OR last_engagement IS NULL)
AND status = 'active'"
);
foreach ($inactive_users as $user) {
$this->send_reactivation_email($user);
}
}
}
4.2 创建电子邮件模板系统
// includes/class-email-templates.php
class Email_Templates {
private $templates = array();
public function __construct() {
$this->load_templates();
add_filter('wp_mail_content_type', array($this, 'set_html_content_type'));
}
private function load_templates() {
$this->templates = array(
'welcome-1' => array(
'subject' => '欢迎加入{site_name}',
'html' => $this->get_welcome_template_1(),
'text' => '欢迎加入{site_name}!感谢您的订阅。'
),
'newsletter' => array(
'subject' => '{site_name}最新动态 - {date}',
'html' => $this->get_newsletter_template(),
'text' => ''
),
'promotional' => array(
'subject' => '特别优惠:{offer_title}',
'html' => $this->get_promotional_template(),
'text' => ''
)
);
}
public function get_template($template_name, $data = array()) {
if (!isset($this->templates[$template_name])) {
return false;
}
$template = $this->templates[$template_name];
// 替换变量
$html = $this->replace_variables($template['html'], $data);
$subject = $this->replace_variables($template['subject'], $data);
return array(
'subject' => $subject,
'html' => $html,
'text' => $this->replace_variables($template['text'], $data)
);
}
private function replace_variables($content, $data) {
$defaults = array(
'site_name' => get_bloginfo('name'),
'site_url' => home_url(),
'date' => date('Y年m月d日'),
'year' => date('Y')
);
$variables = array_merge($defaults, $data);
foreach ($variables as $key => $value) {
$content = str_replace('{' . $key . '}', $value, $content);
}
return $content;
}
private function get_welcome_template_1() {
return '
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>欢迎邮件</title>
<style>
body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
.container { max-width: 600px; margin: 0 auto; padding: 20px; }
.header { background: #0073aa; color: white; padding: 20px; text-align: center; }
.content { padding: 30px; background: #f9f9f9; }
.footer { text-align: center; padding: 20px; color: #666; font-size: 12px; }
.button { display: inline-block; padding: 12px 24px; background: #0073aa;
color: white; text-decoration: none; border-radius: 4px; }
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>欢迎加入{site_name}!</h1>
</div>
<div class="content">
<p>亲爱的{user_name},</p>
<p>感谢您订阅{site_name}。我们很高兴您能加入我们的社区!</p>
<p>作为新订阅者,您将:</p>
<ul>
<li>定期收到我们的最新内容</li>
<li>获取独家优惠和折扣</li>
<li>优先了解新产品和服务</li>
</ul>
<p style="text-align: center;">
<a href="{site_url}" class="button">访问我们的网站</a>
</p>
</div>
<div class="footer">
<p>© {year} {site_name}. 保留所有权利。</p>
<p>
<a href="{unsubscribe_url}">取消订阅</a> |
<a href="{preferences_url}">管理订阅偏好</a>
</p>
</div>
</div>
</body>
</html>';
}
public function set_html_content_type() {
return 'text/html';
}
}
第五部分:集成分析与报告功能
5.1 实现邮件发送跟踪
// includes/class-email-tracking.php
class Email_Tracking {
public function __construct() {
add_action('phpmailer_init', array($this, 'track_links'));
add_action('wp_ajax_nopriv_track_email_open', array($this, 'track_open'));
add_action('wp_ajax_nopriv_track_email_click', array($this, 'track_click'));
}
public function track_links($phpmailer) {
if (strpos($phpmailer->Body, 'tracking-enabled') !== false) {
$this->add_tracking_to_links($phpmailer);
$this->add_open_tracking($phpmailer);
}
}
private function add_tracking_to_links(&$phpmailer) {
$pattern = '/<a[^>]+href="([^"]+)"[^>]*>/i';
$phpmailer->Body = preg_replace_callback($pattern, function($matches) {
$original_url = $matches[1];
// 跳过不需要跟踪的链接
if ($this->should_skip_tracking($original_url)) {
return $matches[0];
}
$tracking_url = $this->create_tracking_url($original_url, 'click');
return str_replace($original_url, $tracking_url, $matches[0]);
}, $phpmailer->Body);
}
private function add_open_tracking(&$phpmailer) {
$tracking_pixel = '<img src="' . home_url('/wp-json/email-tracking/open') .
'?email={email_id}&campaign={campaign_id}" width="1" height="1" />';
$phpmailer->Body = str_replace('</body>', $tracking_pixel . '</body>', $phpmailer->Body);
}
public function track_open() {
$email_id = sanitize_text_field($_GET['email']);
$campaign_id = sanitize_text_field($_GET['campaign']);
$this->record_event('open', $email_id, $campaign_id);
// 返回透明的1x1像素
header('Content-Type: image/png');
echo base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=');
exit;
}
public function track_click() {
$redirect_url = base64_decode($_GET['url']);
$email_id = sanitize_text_field($_GET['email']);
$campaign_id = sanitize_text_field($_GET['campaign']);
$this->record_event('click', $email_id, $campaign_id, $redirect_url);
wp_redirect($redirect_url);
exit;
}
private function record_event($type, $email_id, $campaign_id, $data = '') {
global $wpdb;
