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

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

详细指南:在WordPress中集成邮件订阅与营销工具,通过代码二次开发实现常用互联网小工具功能

引言:为什么需要在WordPress中集成邮件订阅与营销工具

在当今数字营销时代,邮件订阅与营销仍然是企业与用户保持联系、提升转化率的最有效方式之一。据统计,邮件营销的投资回报率(ROI)高达4200%,平均每花费1美元可获得42美元的回报。对于WordPress网站所有者而言,集成专业的邮件订阅与营销工具不仅能提升用户体验,还能为网站带来持续的流量和收入。

然而,许多WordPress用户仅仅依赖第三方插件来实现这些功能,这不仅可能导致网站性能下降,还可能带来安全风险。通过代码二次开发的方式,我们可以更灵活、更高效地实现邮件订阅与营销功能,同时保持网站的性能和安全性。

本指南将详细介绍如何通过WordPress代码二次开发,实现邮件订阅表单、用户管理、自动化营销等常用互联网小工具功能,帮助您打造一个功能强大且高度定制化的邮件营销系统。

第一部分:准备工作与环境配置

1.1 选择合适的邮件营销服务API

在开始开发之前,您需要选择一个邮件营销服务提供商。以下是几个主流选择:

  • Mailchimp:用户友好,免费套餐适合初学者
  • SendinBlue:强大的自动化功能,性价比高
  • ConvertKit:专注于内容创作者
  • MailerLite:简洁易用,价格合理

本指南将以Mailchimp为例,但原理适用于大多数邮件营销服务。

1.2 获取API密钥与配置开发环境

  1. 登录您的Mailchimp账户,进入"账户" > "扩展功能" > "API密钥"
  2. 创建新的API密钥并妥善保存
  3. 在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;
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5055.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

工作时间:周一至周五,9:00-17:30,节假日休息
返回顶部