文章目录[隐藏]
详细指南:在WordPress中集成邮件订阅与营销工具的代码实现
概述:为什么需要在WordPress中集成邮件订阅功能
在当今的数字营销环境中,邮件订阅系统是建立稳定受众群体、提升用户参与度和推动业务增长的关键工具。WordPress作为全球最流行的内容管理系统,虽然拥有众多插件可以实现邮件订阅功能,但通过代码二次开发实现这一功能具有独特优势:更高的性能、更好的定制性、更强的数据控制能力,以及减少对第三方插件的依赖。
本指南将详细介绍如何通过WordPress代码二次开发,实现一个完整的邮件订阅与营销工具系统。我们将从基础架构开始,逐步构建订阅表单、邮件发送、用户管理等功能模块,所有代码均包含详细注释,方便开发者理解和修改。
环境准备与基础配置
在开始编码之前,我们需要确保WordPress环境已正确配置,并创建必要的数据表结构来存储订阅者信息。
<?php
/**
* 邮件订阅系统 - 数据库表创建
* 这段代码应该放在主题的functions.php文件中,或者创建一个独立的插件
*/
// 插件激活时创建数据库表
function mail_subscription_activate() {
global $wpdb;
// 设置数据库表名(带前缀)
$table_name = $wpdb->prefix . 'mail_subscribers';
$charset_collate = $wpdb->get_charset_collate();
// SQL语句创建订阅者表
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
email varchar(100) NOT NULL,
name varchar(100) DEFAULT '',
status varchar(20) DEFAULT 'pending', -- pending, confirmed, unsubscribed
subscription_date datetime DEFAULT CURRENT_TIMESTAMP,
confirmation_code varchar(32) DEFAULT '',
last_email_sent datetime DEFAULT NULL,
user_ip varchar(45) DEFAULT '',
meta_data text DEFAULT '',
PRIMARY KEY (id),
UNIQUE KEY email (email)
) $charset_collate;";
// 包含WordPress升级文件以使用dbDelta函数
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
// 创建邮件日志表
$log_table_name = $wpdb->prefix . 'mail_subscription_logs';
$log_sql = "CREATE TABLE IF NOT EXISTS $log_table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
subscriber_id mediumint(9) NOT NULL,
email_type varchar(50) NOT NULL,
subject varchar(255) NOT NULL,
sent_date datetime DEFAULT CURRENT_TIMESTAMP,
status varchar(20) DEFAULT 'sent', -- sent, failed, opened
open_count mediumint(9) DEFAULT 0,
PRIMARY KEY (id),
KEY subscriber_id (subscriber_id)
) $charset_collate;";
dbDelta($log_sql);
}
register_activation_hook(__FILE__, 'mail_subscription_activate');
// 添加管理菜单
function mail_subscription_admin_menu() {
add_menu_page(
'邮件订阅管理', // 页面标题
'邮件订阅', // 菜单标题
'manage_options', // 权限要求
'mail-subscription', // 菜单slug
'mail_subscription_admin_page', // 回调函数
'dashicons-email-alt', // 图标
30 // 位置
);
// 添加子菜单
add_submenu_page(
'mail-subscription',
'订阅者列表',
'订阅者列表',
'manage_options',
'mail-subscription-subscribers',
'mail_subscription_subscribers_page'
);
add_submenu_page(
'mail-subscription',
'发送邮件',
'发送邮件',
'manage_options',
'mail-subscription-send',
'mail_subscription_send_page'
);
}
add_action('admin_menu', 'mail_subscription_admin_menu');
?>
创建邮件订阅表单前端组件
订阅表单是与用户交互的第一界面,需要设计得既美观又实用。以下代码实现了一个响应式订阅表单。
<?php
/**
* 邮件订阅表单短代码
* 使用方式:[mail_subscription_form]
*/
function mail_subscription_form_shortcode($atts) {
// 提取短代码属性
$atts = shortcode_atts(array(
'title' => '订阅我们的新闻通讯',
'description' => '获取最新更新和独家优惠',
'button_text' => '立即订阅',
'show_name_field' => 'yes'
), $atts);
// 处理表单提交
$message = '';
if (isset($_POST['mail_subscription_submit'])) {
$result = process_subscription_form();
if ($result['success']) {
$message = '<div class="subscription-success">' . $result['message'] . '</div>';
} else {
$message = '<div class="subscription-error">' . $result['message'] . '</div>';
}
}
// 构建表单HTML
ob_start();
?>
<div class="mail-subscription-form-wrapper">
<?php echo $message; ?>
<div class="subscription-header">
<h3><?php echo esc_html($atts['title']); ?></h3>
<?php if ($atts['description']) : ?>
<p><?php echo esc_html($atts['description']); ?></p>
<?php endif; ?>
</div>
<form method="post" action="" class="mail-subscription-form" id="mail-subscription-form">
<?php wp_nonce_field('mail_subscription_action', 'mail_subscription_nonce'); ?>
<?php if ($atts['show_name_field'] === 'yes') : ?>
<div class="form-group">
<label for="subscriber_name">姓名 (可选)</label>
<input type="text" name="subscriber_name" id="subscriber_name"
placeholder="请输入您的姓名" class="form-control">
</div>
<?php endif; ?>
<div class="form-group">
<label for="subscriber_email">邮箱地址 *</label>
<input type="email" name="subscriber_email" id="subscriber_email"
placeholder="your@email.com" required class="form-control">
</div>
<div class="form-group privacy-checkbox">
<input type="checkbox" name="privacy_agreement" id="privacy_agreement" required>
<label for="privacy_agreement">
我同意接收营销邮件并已阅读
<a href="<?php echo get_privacy_policy_url(); ?>" target="_blank">隐私政策</a>
</label>
</div>
<div class="form-group">
<button type="submit" name="mail_subscription_submit"
class="subscription-button">
<?php echo esc_html($atts['button_text']); ?>
</button>
</div>
</form>
<div class="subscription-footer">
<small>随时可以取消订阅,我们尊重您的隐私</small>
</div>
</div>
<style>
.mail-subscription-form-wrapper {
max-width: 500px;
margin: 20px auto;
padding: 30px;
background: #f8f9fa;
border-radius: 10px;
box-shadow: 0 5px 15px rgba(0,0,0,0.05);
}
.subscription-header h3 {
margin-top: 0;
color: #333;
}
.form-group {
margin-bottom: 20px;
}
.form-control {
width: 100%;
padding: 12px 15px;
border: 1px solid #ddd;
border-radius: 5px;
font-size: 16px;
box-sizing: border-box;
}
.privacy-checkbox {
display: flex;
align-items: center;
}
.privacy-checkbox input {
margin-right: 10px;
}
.subscription-button {
background: #007cba;
color: white;
border: none;
padding: 14px 30px;
font-size: 16px;
border-radius: 5px;
cursor: pointer;
width: 100%;
transition: background 0.3s;
}
.subscription-button:hover {
background: #005a87;
}
.subscription-success {
background: #d4edda;
color: #155724;
padding: 12px;
border-radius: 5px;
margin-bottom: 20px;
border: 1px solid #c3e6cb;
}
.subscription-error {
background: #f8d7da;
color: #721c24;
padding: 12px;
border-radius: 5px;
margin-bottom: 20px;
border: 1px solid #f5c6cb;
}
</style>
<script>
// 前端表单验证
document.getElementById('mail-subscription-form').addEventListener('submit', function(e) {
var email = document.getElementById('subscriber_email').value;
var emailRegex = /^[^s@]+@[^s@]+.[^s@]+$/;
if (!emailRegex.test(email)) {
e.preventDefault();
alert('请输入有效的邮箱地址');
return false;
}
var privacyCheck = document.getElementById('privacy_agreement');
if (!privacyCheck.checked) {
e.preventDefault();
alert('请同意隐私政策');
return false;
}
// 防止重复提交
var submitBtn = document.querySelector('[name="mail_subscription_submit"]');
submitBtn.disabled = true;
submitBtn.innerHTML = '处理中...';
});
</script>
<?php
return ob_get_clean();
}
add_shortcode('mail_subscription_form', 'mail_subscription_form_shortcode');
/**
* 处理订阅表单提交
*/
function process_subscription_form() {
// 验证nonce
if (!isset($_POST['mail_subscription_nonce']) ||
!wp_verify_nonce($_POST['mail_subscription_nonce'], 'mail_subscription_action')) {
return array('success' => false, 'message' => '安全验证失败');
}
// 获取并清理表单数据
$email = sanitize_email($_POST['subscriber_email']);
$name = isset($_POST['subscriber_name']) ? sanitize_text_field($_POST['subscriber_name']) : '';
// 验证邮箱
if (!is_email($email)) {
return array('success' => false, 'message' => '请输入有效的邮箱地址');
}
global $wpdb;
$table_name = $wpdb->prefix . 'mail_subscribers';
// 检查是否已存在
$existing = $wpdb->get_var($wpdb->prepare(
"SELECT id FROM $table_name WHERE email = %s",
$email
));
if ($existing) {
return array('success' => false, 'message' => '该邮箱地址已订阅');
}
// 生成确认码
$confirmation_code = wp_generate_password(32, false);
// 获取用户IP
$user_ip = $_SERVER['REMOTE_ADDR'];
// 插入新订阅者
$result = $wpdb->insert(
$table_name,
array(
'email' => $email,
'name' => $name,
'status' => 'pending',
'confirmation_code' => $confirmation_code,
'user_ip' => $user_ip,
'subscription_date' => current_time('mysql')
),
array('%s', '%s', '%s', '%s', '%s', '%s')
);
if ($result) {
// 发送确认邮件
send_confirmation_email($email, $name, $confirmation_code);
return array(
'success' => true,
'message' => '订阅成功!请检查您的邮箱确认订阅。'
);
}
return array('success' => false, 'message' => '订阅失败,请稍后重试');
}
?>
邮件发送与确认系统
邮件发送是订阅系统的核心功能。以下代码实现了双重确认机制和邮件发送功能。
<?php
/**
* 发送确认邮件
*/
function send_confirmation_email($email, $name, $confirmation_code) {
$site_name = get_bloginfo('name');
$site_url = get_site_url();
// 构建确认链接
$confirmation_link = add_query_arg(
array(
'confirm_subscription' => '1',
'email' => urlencode($email),
'code' => $confirmation_code
),
$site_url
);
// 邮件主题
$subject = sprintf('请确认订阅 %s 的新闻通讯', $site_name);
// 邮件内容
$message = "<html><body>";
$message .= "<h2>感谢您订阅 $site_name</h2>";
$message .= "<p>尊敬的" . ($name ?: '用户') . ",</p>";
$message .= "<p>请点击以下链接确认您的订阅:</p>";
$message .= "<p><a href='$confirmation_link' style='background:#007cba;color:white;padding:12px 24px;text-decoration:none;border-radius:5px;display:inline-block;'>确认订阅</a></p>";
$message .= "<p>或者复制以下链接到浏览器:<br>$confirmation_link</p>";
$message .= "<p>如果您没有请求订阅,请忽略此邮件。</p>";
$message .= "<hr><small>此邮件由 $site_name 系统自动发送</small>";
$message .= "</body></html>";
// 邮件头
$headers = array(
'Content-Type: text/html; charset=UTF-8',
'From: ' . $site_name . ' <' . get_option('admin_email') . '>'
);
// 发送邮件
$sent = wp_mail($email, $subject, $message, $headers);
// 记录邮件发送
if ($sent) {
global $wpdb;
$subscriber_id = $wpdb->get_var($wpdb->prepare(
"SELECT id FROM {$wpdb->prefix}mail_subscribers WHERE email = %s",
$email
));
if ($subscriber_id) {
$wpdb->insert(
$wpdb->prefix . 'mail_subscription_logs',
array(
'subscriber_id' => $subscriber_id,
'email_type' => 'confirmation',
'subject' => $subject,
'sent_date' => current_time('mysql')
),
array('%d', '%s', '%s', '%s')
);
}
}
return $sent;
}
/**
* 处理确认链接
*/
function handle_subscription_confirmation() {
if (isset($_GET['confirm_subscription']) && $_GET['confirm_subscription'] == '1') {
if (isset($_GET['email']) && isset($_GET['code'])) {
$email = sanitize_email($_GET['email']);
$code = sanitize_text_field($_GET['code']);
global $wpdb;
$table_name = $wpdb->prefix . 'mail_subscribers';
// 验证确认码
$result = $wpdb->update(
$table_name,
array('status' => 'confirmed', 'confirmation_code' => ''),
array('email' => $email, 'confirmation_code' => $code, 'status' => 'pending'),
array('%s', '%s'),
array('%s', '%s', '%s')
);
if ($result) {
// 发送欢迎邮件
send_welcome_email($email);
// 显示成功消息
wp_die(
'<h1>订阅确认成功!</h1>' .
'<p>感谢您确认订阅。您将开始收到我们的最新更新。</p>' .
'<p><a href="' . home_url() . '">返回首页</a></p>',
'订阅确认成功',
array('response' => 200)
);
} else {
wp_die(
'<h1>确认失败</h1>' .
'<p>确认链接无效或已过期。</p>' .
'<p><a href="' . home_url() . '">返回首页</a></p>',
'确认失败',
array('response' => 400)
);
}
}
}
}
add_action('init', 'handle_subscription_confirmation');
/**
* 发送欢迎邮件
*/
function send_welcome_email($email) {
global $wpdb;
$table_name = $wpdb->prefix . 'mail_subscribers';
$subscriber = $wpdb->get_row($wpdb->prepare(
"SELECT name FROM $table_name WHERE email = %s",
$email
));
$site_name = get_bloginfo('name');
$subject = "欢迎订阅 $site_name";
$message = "<html><body>";
$message .= "<h2>欢迎加入 $site_name 社区!</h2>";
$message .= "<p>尊敬的" . ($subscriber->name ?: '用户') . ",</p>";
$message .= "<p>感谢您确认订阅。您将定期收到:</p>";
$message .= "<ul>";
$message .= "<li>最新文章和教程</li>";
$message .= "<li>独家优惠和折扣</li>";
$message .= "<li>行业动态和趋势分析</li>";
$message .= "</ul>";
$message .= "<p>如果您有任何问题,请随时回复此邮件。</p>";
$message .= "<hr>";
$message .= "<p><small><a href='" . add_query_arg('unsubscribe', '1', home_url()) . "?email=" . urlencode($email) . "'>取消订阅</a></small></p>";
$message .= "</body></html>";
$headers = array(
'Content-Type: text/html; charset=UTF-8',
'From: ' . $site_name . ' <' . get_option('admin_email') . '>'
);
wp_mail($email, $subject, $message, $headers);
}
?>
批量邮件发送与营销功能
实现批量邮件发送功能是营销工具的核心。以下代码提供了安全的邮件队列系统。
<?php
/**
* 邮件队列系统 - 发送批量邮件
*/
// 添加定时任务发送队列邮件
function mail_subscription_schedule_events() {
if (!wp_next_scheduled('mail_subscription_send_queue')) {
wp_schedule_event(time(), 'hourly', 'mail_subscription_send_queue');
}
}
add_action('wp', 'mail_subscription_schedule_events');
// 处理邮件队列
function process_mail_queue() {
global $wpdb;
// 获取待发送的邮件(每次最多50封)
$queue_table = $wpdb->prefix . 'mail_queue';
$emails = $wpdb->get_results(
"SELECT * FROM $queue_table
WHERE status = 'pending'
AND send_time <= NOW()
ORDER BY priority DESC, created_at ASC
LIMIT 50"
);
foreach ($emails as $email) {
$sent = send_marketing_email(
$email->recipient_email,
$email->subject,
$email->content,
$email->email_type
);
if ($sent) {
$wpdb->update(
$queue_table,
array('status' => 'sent', 'sent_at' => current_time('mysql')),
array('id' => $email->id),
array('%s', '%s'),
array('%d')
);
} else {
$wpdb->update(
$queue_table,
array('status' => 'failed', 'attempts' => $email->attempts + 1),
array('id' => $email->id),
array('%s', '%d'),
array('%d')
);
}
// 防止服务器过载,每发送一封邮件暂停0.5秒
usleep(500000);
}
}
add_action('mail_subscription_send_queue', 'process_mail_queue');
/**
* 发送营销邮件
*/
function send_marketing_email($recipient_email, $subject, $content, $email_type = 'newsletter') {
global $wpdb;
// 获取订阅者信息
$subscriber_table = $wpdb->prefix . 'mail_subscribers';
$subscriber = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM $subscriber_table WHERE email = %s AND status = 'confirmed'",
$recipient_email
));
if (!$subscriber) {
return false;
}
// 个性化内容
$personalized_content = personalize_email_content($content, $subscriber);
// 添加退订链接
$unsubscribe_link = add_query_arg(
array(
'unsubscribe' => '1',
'email' => urlencode($recipient_email),
'code' => wp_hash($recipient_email . 'unsubscribe')
),
home_url()
);
$footer = "<hr style='margin:30px 0;border-top:1px solid #eee;'>";
$footer .= "<p style='font-size:12px;color:#666;text-align:center;'>";
$footer .= "您收到此邮件是因为您订阅了" . get_bloginfo('name') . "的邮件列表。<br>";
$footer .= "<a href='$unsubscribe_link' style='color:#666;'>点击这里退订</a>";
$footer .= "</p>";
$full_content = $personalized_content . $footer;
// 邮件头
$headers = array(
'Content-Type: text/html; charset=UTF-8',
'From: ' . get_bloginfo('name') . ' <' . get_option('admin_email') . '>',
'List-Unsubscribe: <' . $unsubscribe_link . '>',
'Precedence: bulk'
);
// 发送邮件
$sent = wp_mail($recipient_email, $subject, $full_content, $headers);
// 记录发送日志
if ($sent) {
$wpdb->insert(
$wpdb->prefix . 'mail_subscription_logs',
array(
'subscriber_id' => $subscriber->id,
'email_type' => $email_type,
'subject' => $subject,
'sent_date' => current_time('mysql'),
'status' => 'sent'
),
array('%d', '%s', '%s', '%s', '%s')
);
// 更新最后发送时间
$wpdb->update(
$subscriber_table,
array('last_email_sent' => current_time('mysql')),
array('id' => $subscriber->id),
array('%s'),
array('%d')
);
}
return $sent;
}
/**
* 个性化邮件内容
*/
function personalize_email_content($content, $subscriber) {
$replacements = array(
'{name}' => $subscriber->name ?: '朋友',
'{email}' => $subscriber->email,
'{site_name}' => get_bloginfo('name'),
'{site_url}' => home_url(),
'{date}' => date('Y年m月d日'),
'{unsubscribe_link}' => add_query_arg(
array('unsubscribe' => '1', 'email' => urlencode($subscriber->email)),
home_url()
)
);
return str_replace(array_keys($replacements), array_values($replacements), $content);
}
/**
* 创建邮件队列表
*/
function create_mail_queue_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'mail_queue';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id bigint(20) NOT NULL AUTO_INCREMENT,
recipient_email varchar(100) NOT NULL,
subject varchar(255) NOT NULL,
content longtext NOT NULL,
email_type varchar(50) DEFAULT 'newsletter',
status varchar(20) DEFAULT 'pending', -- pending, sent, failed
priority int(11) DEFAULT 0,
send_time datetime DEFAULT CURRENT_TIMESTAMP,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
sent_at datetime DEFAULT NULL,
attempts int(11) DEFAULT 0,
meta_data text DEFAULT '',
PRIMARY KEY (id),
KEY status (status),
KEY send_time (send_time)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'create_mail_queue_table');
?>
管理后台界面实现
创建功能完善的管理后台,方便管理订阅者和发送邮件。
<?php
/**
* 订阅者管理页面
*/
function mail_subscription_subscribers_page() {
global $wpdb;
$table_name = $wpdb->prefix . 'mail_subscribers';
// 处理批量操作
if (isset($_POST['bulk_action']) && isset($_POST['subscribers'])) {
$action = $_POST['bulk_action'];
$subscriber_ids = array_map('intval', $_POST['subscribers']);
if ($action === 'delete') {
foreach ($subscriber_ids as $id) {
$wpdb->delete($table_name, array('id' => $id), array('%d'));
}
echo '<div class="notice notice-success"><p>已删除选中的订阅者</p></div>';
} elseif ($action === 'confirm') {
$wpdb->query("UPDATE $table_name SET status = 'confirmed' WHERE id IN (" . implode(',', $subscriber_ids) . ")");
echo '<div class="notice notice-success"><p>已确认选中的订阅者</p></div>';
}
}
// 分页设置
$per_page = 20;
$current_page = isset($_GET['paged']) ? max(1, intval($_GET['paged'])) : 1;
$offset = ($current_page - 1) * $per_page;
// 获取订阅者总数
$total_items = $wpdb->get_var("SELECT COUNT(*) FROM $table_name");
$total_pages = ceil($total_items / $per_page);
// 获取当前页数据
$subscribers = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM $table_name ORDER BY subscription_date DESC LIMIT %d OFFSET %d",
$per_page,
$offset
)
);
?>
<div class="wrap">
<h1 class="wp-heading-inline">邮件订阅者管理</h1>
<a href="<?php echo admin_url('admin.php?page=mail-subscription-send'); ?>" class="page-title-action">发送邮件</a>
<hr class="wp-header-end">
<form method="post" action="">
<div class="tablenav top">
<div class="alignleft actions bulkactions">
<label for="bulk-action-selector-top" class="screen-reader-text">选择批量操作</label>
<select name="bulk_action" id="bulk-action-selector-top">
<option value="-1">批量操作</option>
<option value="confirm">确认订阅</option>
<option value="delete">删除</option>
</select>
<input type="submit" class="button action" value="应用">
</div>
<div class="tablenav-pages">
<span class="displaying-num"><?php echo $total_items; ?> 个项目</span>
<?php if ($total_pages > 1): ?>
<span class="pagination-links">
<?php
echo paginate_links(array(
'base' => add_query_arg('paged', '%#%'),
'format' => '',
'prev_text' => '«',
'next_text' => '»',
'total' => $total_pages,
'current' => $current_page
));
?>
</span>
<?php endif; ?>
</div>
<br class="clear">
</div>
<table class="wp-list-table widefat fixed striped">
<thead>
<tr>
<td id="cb" class="manage-column column-cb check-column">
<label class="screen-reader-text" for="cb-select-all-1">全选</label>
<input id="cb-select-all-1" type="checkbox">
</td>
<th scope="col" class="manage-column column-email">邮箱地址</th>
<th scope="col" class="manage-column column-name">姓名</th>
<th scope="col" class="manage-column column-status">状态</th>
<th scope="col" class="manage-column column-date">订阅时间</th>
<th scope="col" class="manage-column column-last-sent">最后发送</th>
<th scope="col" class="manage-column column-actions">操作</th>
</tr>
</thead>
<tbody>
<?php if ($subscribers): ?>
<?php foreach ($subscribers as $subscriber): ?>
<tr>
<th scope="row" class="check-column">
<input type="checkbox" name="subscribers[]" value="<?php echo $subscriber->id; ?>">
</th>
<td class="column-email">
<strong><?php echo esc_html($subscriber->email); ?></strong>
</td>
<td class="column-name"><?php echo esc_html($subscriber->name); ?></td>
<td class="column-status">
<?php
$status_labels = array(
'pending' => '<span class="dashicons dashicons-clock" style="color:#f56e28;"></span> 待确认',
'confirmed' => '<span class="dashicons dashicons-yes" style="color:#46b450;"></span> 已确认',
'unsubscribed' => '<span class="dashicons dashicons-no" style="color:#dc3232;"></span> 已退订'
);
echo $status_labels[$subscriber->status] ?? $subscriber->status;
?>
</td>
<td class="column-date"><?php echo date('Y-m-d H:i', strtotime($subscriber->subscription_date)); ?></td>
<td class="column-last-sent">
<?php echo $subscriber->last_email_sent ? date('Y-m-d H:i', strtotime($subscriber->last_email_sent)) : '从未'; ?>
</td>
<td class="column-actions">
<a href="<?php echo wp_nonce_url(admin_url('admin.php?page=mail-subscription-subscribers&action=delete&id=' . $subscriber->id), 'delete_subscriber_' . $subscriber->id); ?>"
class="button button-small"
onclick="return confirm('确定要删除这个订阅者吗?')">删除</a>
<?php if ($subscriber->status === 'pending'): ?>
<a href="<?php echo wp_nonce_url(admin_url('admin.php?page=mail-subscription-subscribers&action=confirm&id=' . $subscriber->id), 'confirm_subscriber_' . $subscriber->id); ?>"
class="button button-small button-primary">确认</a>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr>
<td colspan="7" style="text-align:center;">暂无订阅者</td>
</tr>
<?php endif; ?>
</tbody>
</table>
</form>
</div>
<style>
.column-email { width: 25%; }
.column-name { width: 15%; }
.column-status { width: 15%; }
.column-date { width: 15%; }
.column-last-sent { width: 15%; }
.column-actions { width: 15%; }
</style>
<?php
}
/**
* 邮件发送页面
*/
function mail_subscription_send_page() {
// 处理邮件发送
if (isset($_POST['send_email'])) {
$subject = sanitize_text_field($_POST['email_subject']);
$content = wp_kses_post($_POST['email_content']);
$email_type = sanitize_text_field($_POST['email_type']);
if (empty($subject) || empty($content)) {
echo '<div class="notice notice-error"><p>请填写邮件主题和内容</p></div>';
} else {
// 获取所有已确认的订阅者
global $wpdb;
$subscribers = $wpdb->get_results(
"SELECT email FROM {$wpdb->prefix}mail_subscribers WHERE status = 'confirmed'"
);
$count = 0;
foreach ($subscribers as $subscriber) {
// 添加到邮件队列
$wpdb->insert(
$wpdb->prefix . 'mail_queue',
array(
'recipient_email' => $subscriber->email,
'subject' => $subject,
'content' => $content,
'email_type' => $email_type,
'send_time' => current_time('mysql')
),
array('%s', '%s', '%s', '%s', '%s')
);
$count++;
}
echo '<div class="notice notice-success"><p>已成功将邮件添加到发送队列,共 ' . $count . ' 封邮件</p></div>';
}
}
?>
<div class="wrap">
<h1>发送营销邮件</h1>
<div class="notice notice-info">
<p>此功能将向所有已确认的订阅者发送邮件。邮件将通过队列系统发送,避免服务器过载。</p>
</div>
<form method="post" action="">
<table class="form-table">
<tr>
<th scope="row"><label for="email_subject">邮件主题</label></th>
<td>
<input type="text" name="email_subject" id="email_subject"
class="regular-text" required
placeholder="请输入邮件主题">
<p class="description">这将显示在收件人的邮箱主题中</p>
</td>
</tr>
<tr>
<th scope="row"><label for="email_type">邮件类型</label></th>
<td>
<select name="email_type" id="email_type" class="regular-text">
<option value="newsletter">新闻通讯</option>
<option value="promotion">促销活动</option>
<option value="announcement">公告通知</option>
<option value="update">更新通知</option>
</select>
</td>
</tr>
<tr>
<th scope="row"><label for="email_content">邮件内容</label></th>
<td>
<?php
$editor_id = 'email_content';
$settings = array(
'textarea_name' => 'email_content',
'textarea_rows' => 15,
'media_buttons' => true,
'tinymce' => array(
'toolbar1' => 'formatselect,bold,italic,bullist,numlist,blockquote,alignleft,aligncenter,alignright,link,unlink,undo,redo',
'toolbar2' => ''
),
'quicktags' => true
);
wp_editor('', $editor_id, $settings);
?>
<p class="description">支持HTML格式。可用变量:{name} {email} {site_name} {date}</p>
</td>
</tr>
<tr>
<th scope="row">预览</th>
<td>


