首页 / 应用软件 / 详细指南,在WordPress中集成邮件订阅与营销工具

详细指南,在WordPress中集成邮件订阅与营销工具

详细指南:在WordPress中集成邮件订阅与营销工具的代码实现 概述:为什么需要在WordPress中集成邮件订阅功能 在当今的数字营销环境中,邮件订阅系统是建立稳定受众群体、提升用户参与度和推动业务增长的关键工具。WordPress作为全球最流行的内容管理系统,虽然…

详细指南:在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' => '&laquo;',
                            'next_text' => '&raquo;',
                            '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>
本文来自网络投稿,不代表本站点的立场,转载请注明出处:https://www.gongxiangcang.com/5055.html

溯源库®作者

漳州柔性供应链服务有限公司 小批量订单定制化服务商( 投稿邮箱:vip@jiaochengku.com)
上一篇
下一篇

为您推荐

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@suyuanku.com

工作时间:周一至周五,9:00-17:30,节假日休息
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部