首页 / 应用软件 / WordPress 插件开发教程,实现网站自动化营销漏斗与客户旅程追踪

WordPress 插件开发教程,实现网站自动化营销漏斗与客户旅程追踪

WordPress插件开发教程:实现网站自动化营销漏斗与客户旅程追踪

引言:WordPress插件开发的无限可能

在当今数字化营销时代,网站不仅仅是企业的线上名片,更是潜在客户转化的重要渠道。WordPress作为全球最受欢迎的内容管理系统,其强大的可扩展性为开发者提供了无限可能。通过自定义插件开发,我们可以将WordPress从一个简单的博客平台转变为功能强大的营销自动化工具。

本教程将深入探讨如何通过WordPress插件开发,实现网站自动化营销漏斗与客户旅程追踪功能。我们将从基础概念讲起,逐步构建一个完整的营销自动化插件,帮助您更好地理解客户行为,优化转化路径,并最终提升业务成果。

第一部分:理解营销漏斗与客户旅程

1.1 营销漏斗的基本概念

营销漏斗是描述潜在客户从认知到购买决策过程的模型。传统营销漏斗通常包括以下阶段:

  • 认知阶段:用户首次接触品牌
  • 兴趣阶段:用户对产品或服务产生兴趣
  • 考虑阶段:用户评估不同选项
  • 意向阶段:用户表现出购买意愿
  • 购买阶段:用户完成交易
  • 忠诚阶段:用户成为忠实客户并推荐他人

1.2 客户旅程追踪的重要性

客户旅程追踪是指记录和分析用户与品牌互动的全过程。通过追踪客户旅程,企业可以:

  • 识别转化路径中的瓶颈
  • 个性化用户体验
  • 优化营销策略
  • 提高客户留存率
  • 增加客户生命周期价值

1.3 WordPress在营销自动化中的优势

WordPress作为开发平台具有以下优势:

  • 庞大的用户基础和成熟的生态系统
  • 灵活的插件架构和丰富的API
  • 开源特性,允许深度定制
  • 与各种第三方服务的良好兼容性
  • 强大的社区支持和丰富的学习资源

第二部分:WordPress插件开发基础

2.1 插件开发环境搭建

在开始开发之前,我们需要准备以下环境:

  1. 本地开发环境:推荐使用XAMPP、MAMP或Local by Flywheel
  2. 代码编辑器:VS Code、PHPStorm或Sublime Text
  3. WordPress安装:最新版本的WordPress
  4. 调试工具:安装Query Monitor、Debug Bar等调试插件

2.2 创建第一个WordPress插件

每个WordPress插件至少需要一个主文件,通常以插件名称命名。以下是创建基础插件结构的步骤:

  1. wp-content/plugins/目录下创建新文件夹,命名为marketing-automation-funnel
  2. 在该文件夹中创建主文件marketing-automation-funnel.php
  3. 添加插件头部信息:
<?php
/**
 * Plugin Name: 营销自动化漏斗与客户旅程追踪
 * Plugin URI:  https://yourwebsite.com/marketing-automation-funnel
 * Description: 实现网站自动化营销漏斗与客户旅程追踪功能
 * Version:     1.0.0
 * Author:      您的姓名
 * Author URI:  https://yourwebsite.com
 * License:     GPL v2 or later
 * Text Domain: marketing-automation-funnel
 */

2.3 WordPress插件架构基础

了解WordPress插件的基本架构是开发的关键:

  1. 钩子系统:动作钩子(Actions)和过滤器钩子(Filters)
  2. 短代码系统:允许在文章和页面中嵌入动态内容
  3. 自定义数据库表:存储插件特定数据
  4. 管理界面:为插件创建设置页面
  5. AJAX处理:实现前端与后端的异步通信

第三部分:构建客户旅程追踪系统

3.1 设计数据存储结构

客户旅程数据需要专门的数据库表来存储。我们将创建两个主要表:

  1. 客户表:存储客户基本信息
  2. 互动事件表:记录客户的每一次互动

以下是创建数据库表的代码示例:

// 在插件激活时创建数据库表
register_activation_hook(__FILE__, 'maf_create_tables');

function maf_create_tables() {
    global $wpdb;
    
    $charset_collate = $wpdb->get_charset_collate();
    
    // 客户表
    $table_name_customers = $wpdb->prefix . 'maf_customers';
    $sql_customers = "CREATE TABLE IF NOT EXISTS $table_name_customers (
        id INT(11) NOT NULL AUTO_INCREMENT,
        email VARCHAR(100) NOT NULL,
        first_name VARCHAR(50),
        last_name VARCHAR(50),
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        last_seen DATETIME,
        funnel_stage VARCHAR(50) DEFAULT 'awareness',
        PRIMARY KEY (id),
        UNIQUE KEY email (email)
    ) $charset_collate;";
    
    // 互动事件表
    $table_name_events = $wpdb->prefix . 'maf_events';
    $sql_events = "CREATE TABLE IF NOT EXISTS $table_name_events (
        id INT(11) NOT NULL AUTO_INCREMENT,
        customer_id INT(11) NOT NULL,
        event_type VARCHAR(50) NOT NULL,
        event_data TEXT,
        page_url VARCHAR(500),
        referrer VARCHAR(500),
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id),
        KEY customer_id (customer_id),
        KEY event_type (event_type)
    ) $charset_collate;";
    
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql_customers);
    dbDelta($sql_events);
}

3.2 实现客户识别与追踪

客户识别是旅程追踪的基础。我们将通过以下方式识别客户:

  1. Cookie追踪:为匿名用户设置唯一标识符
  2. 用户登录识别:对已登录用户直接识别
  3. 电子邮件识别:通过表单提交获取电子邮件
// 设置客户Cookie
function maf_set_customer_cookie() {
    if (!isset($_COOKIE['maf_customer_id'])) {
        $customer_id = uniqid('maf_', true);
        setcookie('maf_customer_id', $customer_id, time() + (365 * 24 * 60 * 60), '/');
    }
}
add_action('init', 'maf_set_customer_cookie');

// 识别当前客户
function maf_identify_customer() {
    global $wpdb;
    
    $customer_id = null;
    
    // 检查是否已登录
    if (is_user_logged_in()) {
        $user_id = get_current_user_id();
        $user_info = get_userdata($user_id);
        
        // 检查用户是否已存在于客户表中
        $table_name = $wpdb->prefix . 'maf_customers';
        $existing_customer = $wpdb->get_row(
            $wpdb->prepare(
                "SELECT id FROM $table_name WHERE email = %s",
                $user_info->user_email
            )
        );
        
        if ($existing_customer) {
            $customer_id = $existing_customer->id;
        } else {
            // 创建新客户记录
            $wpdb->insert(
                $table_name,
                array(
                    'email' => $user_info->user_email,
                    'first_name' => $user_info->first_name,
                    'last_name' => $user_info->last_name,
                    'created_at' => current_time('mysql')
                )
            );
            $customer_id = $wpdb->insert_id;
        }
    } 
    // 检查Cookie
    elseif (isset($_COOKIE['maf_customer_id'])) {
        $cookie_id = sanitize_text_field($_COOKIE['maf_customer_id']);
        
        // 查找基于Cookie的客户记录
        $table_name = $wpdb->prefix . 'maf_customers';
        $existing_customer = $wpdb->get_row(
            $wpdb->prepare(
                "SELECT id FROM $table_name WHERE email = %s",
                $cookie_id . '@anonymous.com'
            )
        );
        
        if ($existing_customer) {
            $customer_id = $existing_customer->id;
        }
    }
    
    return $customer_id;
}

3.3 记录客户互动事件

客户与网站的每一次互动都应该被记录:

// 记录客户事件
function maf_track_event($event_type, $event_data = array()) {
    global $wpdb;
    
    $customer_id = maf_identify_customer();
    
    if (!$customer_id) {
        // 为匿名用户创建临时记录
        $table_name = $wpdb->prefix . 'maf_customers';
        $cookie_id = isset($_COOKIE['maf_customer_id']) ? sanitize_text_field($_COOKIE['maf_customer_id']) : uniqid('maf_', true);
        
        $wpdb->insert(
            $table_name,
            array(
                'email' => $cookie_id . '@anonymous.com',
                'created_at' => current_time('mysql'),
                'last_seen' => current_time('mysql')
            )
        );
        
        $customer_id = $wpdb->insert_id;
    }
    
    // 更新客户最后访问时间
    $wpdb->update(
        $wpdb->prefix . 'maf_customers',
        array('last_seen' => current_time('mysql')),
        array('id' => $customer_id)
    );
    
    // 记录事件
    $table_name = $wpdb->prefix . 'maf_events';
    
    $wpdb->insert(
        $table_name,
        array(
            'customer_id' => $customer_id,
            'event_type' => sanitize_text_field($event_type),
            'event_data' => maybe_serialize($event_data),
            'page_url' => isset($_SERVER['REQUEST_URI']) ? esc_url_raw($_SERVER['REQUEST_URI']) : '',
            'referrer' => isset($_SERVER['HTTP_REFERER']) ? esc_url_raw($_SERVER['HTTP_REFERER']) : '',
            'created_at' => current_time('mysql')
        )
    );
    
    return $wpdb->insert_id;
}

// 自动追踪页面访问
function maf_track_page_view() {
    if (is_admin()) {
        return;
    }
    
    $post_id = get_the_ID();
    $post_type = get_post_type();
    
    $event_data = array(
        'post_id' => $post_id,
        'post_title' => get_the_title(),
        'post_type' => $post_type
    );
    
    maf_track_event('page_view', $event_data);
}
add_action('wp', 'maf_track_page_view');

第四部分:构建自动化营销漏斗

4.1 定义漏斗阶段与规则

营销漏斗需要明确的阶段定义和转换规则:

// 定义漏斗阶段
function maf_get_funnel_stages() {
    return array(
        'awareness' => array(
            'name' => '认知阶段',
            'description' => '用户首次接触品牌',
            'next_stages' => array('interest'),
            'triggers' => array('page_view', 'social_click')
        ),
        'interest' => array(
            'name' => '兴趣阶段',
            'description' => '用户对产品或服务产生兴趣',
            'next_stages' => array('consideration'),
            'triggers' => array('form_submission', 'content_download')
        ),
        'consideration' => array(
            'name' => '考虑阶段',
            'description' => '用户评估不同选项',
            'next_stages' => array('intent'),
            'triggers' => array('product_view', 'pricing_view')
        ),
        'intent' => array(
            'name' => '意向阶段',
            'description' => '用户表现出购买意愿',
            'next_stages' => array('purchase'),
            'triggers' => array('cart_add', 'demo_request')
        ),
        'purchase' => array(
            'name' => '购买阶段',
            'description' => '用户完成交易',
            'next_stages' => array('loyalty'),
            'triggers' => array('order_complete')
        ),
        'loyalty' => array(
            'name' => '忠诚阶段',
            'description' => '用户成为忠实客户并推荐他人',
            'next_stages' => array(),
            'triggers' => array('repeat_purchase', 'referral')
        )
    );
}

// 检查并更新客户漏斗阶段
function maf_update_customer_funnel_stage($customer_id, $event_type) {
    global $wpdb;
    
    $funnel_stages = maf_get_funnel_stages();
    $table_name = $wpdb->prefix . 'maf_customers';
    
    // 获取客户当前阶段
    $current_stage = $wpdb->get_var(
        $wpdb->prepare(
            "SELECT funnel_stage FROM $table_name WHERE id = %d",
            $customer_id
        )
    );
    
    // 检查事件是否触发阶段转换
    foreach ($funnel_stages as $stage_id => $stage) {
        if ($stage_id === $current_stage && in_array($event_type, $stage['triggers'])) {
            // 移动到下一个阶段
            if (!empty($stage['next_stages'])) {
                $next_stage = $stage['next_stages'][0]; // 简单实现:取第一个下一个阶段
                
                $wpdb->update(
                    $table_name,
                    array('funnel_stage' => $next_stage),
                    array('id' => $customer_id)
                );
                
                // 记录阶段转换事件
                maf_track_event('funnel_stage_change', array(
                    'from_stage' => $current_stage,
                    'to_stage' => $next_stage,
                    'trigger_event' => $event_type
                ));
                
                // 触发阶段转换动作
                do_action('maf_funnel_stage_changed', $customer_id, $current_stage, $next_stage);
            }
            break;
        }
    }
}

4.2 实现自动化营销动作

根据客户所在的漏斗阶段,触发相应的营销动作:

// 根据漏斗阶段执行自动化动作
function maf_execute_funnel_actions($customer_id, $from_stage, $to_stage) {
    $actions = array();
    
    switch ($to_stage) {
        case 'interest':
            $actions[] = array(
                'type' => 'email',
                'action' => 'send_welcome_series',
                'delay' => 0
            );
            $actions[] = array(
                'type' => 'internal',
                'action' => 'tag_customer',
                'tag' => 'interested'
            );
            break;
            
        case 'consideration':
            $actions[] = array(
                'type' => 'email',
                'action' => 'send_case_studies',
                'delay' => 1 // 1天后发送
            );
            $actions[] = array(
                'type' => 'internal',
                'action' => 'tag_customer',
                'tag' => 'considering'
            );
            break;
            
        case 'intent':
            $actions[] = array(
                'type' => 'email',
                'action' => 'send_demo_offer',
                'delay' => 0
            );
            $actions[] = array(
                'type' => 'task',
                'action' => 'notify_sales_team',
                'delay' => 0
            );
            break;
            
        case 'purchase':
            $actions[] = array(
                'type' => 'email',
                'action' => 'send_thank_you',
                'delay' => 0
            );
            $actions[] = array(
                'type' => 'email',
                'action' => 'send_upsell_offer',
                'delay' => 7 // 7天后发送
            );
            break;
    }
    
    // 执行动作
    foreach ($actions as $action) {
        if ($action['delay'] > 0) {
            // 计划延迟执行
            wp_schedule_single_event(
                time() + ($action['delay'] * DAY_IN_SECONDS),
                'maf_scheduled_action',
                array($customer_id, $action)
            );
        } else {
            // 立即执行
            maf_execute_single_action($customer_id, $action);
        }
    }
}
add_action('maf_funnel_stage_changed', 'maf_execute_funnel_actions', 10, 3);

// 执行单个动作
function maf_execute_single_action($customer_id, $action) {
    global $wpdb;
    
    $table_name = $wpdb->prefix . 'maf_customers';
    $customer = $wpdb->get_row(
        $wpdb->prepare(
            "SELECT * FROM $table_name WHERE id = %d",
            $customer_id
        )
    );
    
    if (!$customer) {
        return;
    }
    
    switch ($action['type']) {
        case 'email':
            maf_send_automated_email($customer, $action['action']);
            break;
            
        case 'internal':
            if ($action['action'] === 'tag_customer') {
                // 为客户添加标签
                $tags = get_user_meta($customer_id, 'maf_tags', true);
                if (!is_array($tags)) {
                    $tags = array();
                }
                
                if (!in_array($action['tag'], $tags)) {
                    $tags[] = $action['tag'];
                    update_user_meta($customer_id, 'maf_tags', $tags);
                }
            }
            break;
            
        case 'task':
            if ($action['action'] === 'notify_sales_team') {
                // 通知销售团队
                $admin_email = get_option('admin_email');
                $subject = '新销售线索:客户进入意向阶段';
                $message = "客户 {$customer->email} 已进入意向阶段,请及时跟进。";
                wp_mail($admin_email, $subject, $message);
            }
            break;
    }
    
    // 记录动作执行
    maf_track_event('automation_action', array(
        'action_type' => $action['type'],
        'action_name' => $action['action'],
        'customer_id' => $customer_id
    ));
}

第五部分:创建管理界面与

第五部分:创建管理界面与数据分析面板

5.1 构建插件管理菜单

一个直观的管理界面对于营销自动化插件至关重要。我们将创建多级管理菜单,让用户可以轻松访问所有功能:

// 添加管理菜单
function maf_add_admin_menu() {
    // 主菜单
    add_menu_page(
        '营销自动化漏斗',
        '营销自动化',
        'manage_options',
        'marketing-automation-funnel',
        'maf_dashboard_page',
        'dashicons-chart-line',
        30
    );
    
    // 子菜单项
    add_submenu_page(
        'marketing-automation-funnel',
        '仪表板',
        '仪表板',
        'manage_options',
        'marketing-automation-funnel',
        'maf_dashboard_page'
    );
    
    add_submenu_page(
        'marketing-automation-funnel',
        '客户旅程',
        '客户旅程',
        'manage_options',
        'maf-customer-journeys',
        'maf_customer_journeys_page'
    );
    
    add_submenu_page(
        'marketing-automation-funnel',
        '营销漏斗',
        '营销漏斗',
        'manage_options',
        'maf-marketing-funnel',
        'maf_marketing_funnel_page'
    );
    
    add_submenu_page(
        'marketing-automation-funnel',
        '自动化规则',
        '自动化规则',
        'manage_options',
        'maf-automation-rules',
        'maf_automation_rules_page'
    );
    
    add_submenu_page(
        'marketing-automation-funnel',
        '设置',
        '设置',
        'manage_options',
        'maf-settings',
        'maf_settings_page'
    );
}
add_action('admin_menu', 'maf_add_admin_menu');

// 仪表板页面
function maf_dashboard_page() {
    if (!current_user_can('manage_options')) {
        wp_die('您没有权限访问此页面');
    }
    
    ?>
    <div class="wrap maf-dashboard">
        <h1 class="wp-heading-inline">营销自动化仪表板</h1>
        
        <div class="maf-stats-container">
            <div class="maf-stat-card">
                <h3>总客户数</h3>
                <div class="maf-stat-number"><?php echo maf_get_total_customers(); ?></div>
                <div class="maf-stat-trend">+12% 较上月</div>
            </div>
            
            <div class="maf-stat-card">
                <h3>今日互动</h3>
                <div class="maf-stat-number"><?php echo maf_get_today_interactions(); ?></div>
                <div class="maf-stat-trend">+5% 较昨日</div>
            </div>
            
            <div class="maf-stat-card">
                <h3>转化率</h3>
                <div class="maf-stat-number"><?php echo maf_get_conversion_rate(); ?>%</div>
                <div class="maf-stat-trend">+2.3% 较上周</div>
            </div>
            
            <div class="maf-stat-card">
                <h3>平均停留阶段</h3>
                <div class="maf-stat-number"><?php echo maf_get_avg_stage_duration(); ?>天</div>
                <div class="maf-stat-trend">-1.2天 较上月</div>
            </div>
        </div>
        
        <div class="maf-charts-container">
            <div class="maf-chart-card">
                <h3>漏斗阶段分布</h3>
                <div class="maf-chart" id="funnel-stage-chart"></div>
            </div>
            
            <div class="maf-chart-card">
                <h3>客户增长趋势</h3>
                <div class="maf-chart" id="customer-growth-chart"></div>
            </div>
        </div>
        
        <div class="maf-recent-activity">
            <h3>最近活动</h3>
            <table class="wp-list-table widefat fixed striped">
                <thead>
                    <tr>
                        <th>时间</th>
                        <th>客户</th>
                        <th>事件</th>
                        <th>页面</th>
                        <th>阶段变化</th>
                    </tr>
                </thead>
                <tbody>
                    <?php echo maf_get_recent_activities_html(); ?>
                </tbody>
            </table>
        </div>
    </div>
    
    <script>
    // 使用Chart.js渲染图表
    jQuery(document).ready(function($) {
        // 漏斗阶段分布图
        var funnelCtx = document.getElementById('funnel-stage-chart').getContext('2d');
        var funnelChart = new Chart(funnelCtx, {
            type: 'doughnut',
            data: {
                labels: <?php echo json_encode(maf_get_funnel_stage_labels()); ?>,
                datasets: [{
                    data: <?php echo json_encode(maf_get_funnel_stage_counts()); ?>,
                    backgroundColor: [
                        '#FF6384', '#36A2EB', '#FFCE56', '#4BC0C0', '#9966FF', '#FF9F40'
                    ]
                }]
            },
            options: {
                responsive: true,
                maintainAspectRatio: false
            }
        });
        
        // 客户增长趋势图
        var growthCtx = document.getElementById('customer-growth-chart').getContext('2d');
        var growthChart = new Chart(growthCtx, {
            type: 'line',
            data: {
                labels: <?php echo json_encode(maf_get_last_30_days_labels()); ?>,
                datasets: [{
                    label: '新客户',
                    data: <?php echo json_encode(maf_get_new_customers_last_30_days()); ?>,
                    borderColor: '#36A2EB',
                    fill: false
                }, {
                    label: '总客户',
                    data: <?php echo json_encode(maf_get_total_customers_last_30_days()); ?>,
                    borderColor: '#FF6384',
                    fill: false
                }]
            },
            options: {
                responsive: true,
                maintainAspectRatio: false,
                scales: {
                    y: {
                        beginAtZero: true
                    }
                }
            }
        });
    });
    </script>
    <?php
}

5.2 客户旅程可视化界面

创建详细的客户旅程查看界面,让营销人员能够深入了解每个客户的行为路径:

// 客户旅程页面
function maf_customer_journeys_page() {
    if (!current_user_can('manage_options')) {
        wp_die('您没有权限访问此页面');
    }
    
    global $wpdb;
    
    // 分页参数
    $per_page = 20;
    $current_page = isset($_GET['paged']) ? max(1, intval($_GET['paged'])) : 1;
    $offset = ($current_page - 1) * $per_page;
    
    // 搜索功能
    $search = isset($_GET['s']) ? sanitize_text_field($_GET['s']) : '';
    $where_clause = '';
    
    if (!empty($search)) {
        $where_clause = $wpdb->prepare(
            " WHERE email LIKE %s OR first_name LIKE %s OR last_name LIKE %s",
            '%' . $wpdb->esc_like($search) . '%',
            '%' . $wpdb->esc_like($search) . '%',
            '%' . $wpdb->esc_like($search) . '%'
        );
    }
    
    // 获取客户总数
    $table_name = $wpdb->prefix . 'maf_customers';
    $total_customers = $wpdb->get_var("SELECT COUNT(*) FROM $table_name $where_clause");
    $total_pages = ceil($total_customers / $per_page);
    
    // 获取客户列表
    $customers = $wpdb->get_results(
        $wpdb->prepare(
            "SELECT * FROM $table_name $where_clause ORDER BY last_seen DESC LIMIT %d OFFSET %d",
            $per_page,
            $offset
        )
    );
    
    ?>
    <div class="wrap">
        <h1 class="wp-heading-inline">客户旅程</h1>
        
        <form method="get" class="search-form">
            <input type="hidden" name="page" value="maf-customer-journeys">
            <p class="search-box">
                <label class="screen-reader-text" for="customer-search">搜索客户:</label>
                <input type="search" id="customer-search" name="s" value="<?php echo esc_attr($search); ?>">
                <input type="submit" id="search-submit" class="button" value="搜索客户">
            </p>
        </form>
        
        <div class="tablenav top">
            <div class="tablenav-pages">
                <span class="displaying-num"><?php echo $total_customers; ?> 个客户</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>
        </div>
        
        <table class="wp-list-table widefat fixed striped">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>邮箱</th>
                    <th>姓名</th>
                    <th>当前阶段</th>
                    <th>首次访问</th>
                    <th>最后活动</th>
                    <th>总互动数</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($customers as $customer): ?>
                <tr>
                    <td><?php echo $customer->id; ?></td>
                    <td>
                        <strong><?php echo esc_html($customer->email); ?></strong>
                        <?php if (strpos($customer->email, '@anonymous.com') !== false): ?>
                        <span class="dashicons dashicons-admin-users" title="匿名用户"></span>
                        <?php endif; ?>
                    </td>
                    <td><?php echo esc_html($customer->first_name . ' ' . $customer->last_name); ?></td>
                    <td>
                        <?php 
                        $stage_info = maf_get_funnel_stage_info($customer->funnel_stage);
                        echo '<span class="maf-stage-badge maf-stage-' . $customer->funnel_stage . '">' . 
                             esc_html($stage_info['name']) . '</span>';
                        ?>
                    </td>
                    <td><?php echo date('Y-m-d H:i', strtotime($customer->created_at)); ?></td>
                    <td><?php echo $customer->last_seen ? date('Y-m-d H:i', strtotime($customer->last_seen)) : '从未'; ?></td>
                    <td><?php echo maf_get_customer_interaction_count($customer->id); ?></td>
                    <td>
                        <a href="<?php echo admin_url('admin.php?page=maf-customer-journeys&view=customer&id=' . $customer->id); ?>" 
                           class="button button-small">查看旅程</a>
                        <button class="button button-small maf-send-message" 
                                data-customer-id="<?php echo $customer->id; ?>"
                                data-customer-email="<?php echo esc_attr($customer->email); ?>">
                            发送消息
                        </button>
                    </td>
                </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
    </div>
    
    <!-- 发送消息模态框 -->
    <div id="maf-message-modal" class="maf-modal" style="display:none;">
        <div class="maf-modal-content">
            <div class="maf-modal-header">
                <h3>发送消息给客户</h3>
                <span class="maf-modal-close">&times;</span>
            </div>
            <div class="maf-modal-body">
                <form id="maf-message-form">
                    <input type="hidden" id="maf-message-customer-id" name="customer_id">
                    <div class="maf-form-group">
                        <label for="maf-message-subject">主题:</label>
                        <input type="text" id="maf-message-subject" name="subject" class="regular-text" required>
                    </div>
                    <div class="maf-form-group">
                        <label for="maf-message-content">内容:</label>
                        <textarea id="maf-message-content" name="content" rows="6" class="large-text" required></textarea>
                    </div>
                    <div class="maf-form-group">
                        <label for="maf-message-type">消息类型:</label>
                        <select id="maf-message-type" name="message_type">
                            <option value="email">电子邮件</option>
                            <option value="notification">站内通知</option>
                            <option value="sms">短信</option>
                        </select>
                    </div>
                    <div class="maf-form-actions">
                        <button type="submit" class="button button-primary">发送</button>
                        <button type="button" class="button maf-modal-cancel">取消</button>
                    </div>
                </form>
            </div>
        </div>
    </div>
    
    <script>
    jQuery(document).ready(function($) {
        // 发送消息模态框
        $('.maf-send-message').click(function() {
            var customerId = $(this).data('customer-id');
            var customerEmail = $(this).data('customer-email');
            
            $('#maf-message-customer-id').val(customerId);
            $('#maf-message-subject').val('来自 ' + '<?php echo get_bloginfo("name"); ?> 的消息');
            $('#maf-message-modal').show();
        });
        
        $('.maf-modal-close, .maf-modal-cancel').click(function() {
            $('#maf-message-modal').hide();
        });
        
        // 发送消息表单提交
        $('#maf-message-form').submit(function(e) {
            e.preventDefault();
            
            var formData = $(this).serialize();
            
            $.ajax({
                url: ajaxurl,
                type: 'POST',
                data: {
                    action: 'maf_send_customer_message',
                    nonce: '<?php echo wp_create_nonce("maf_send_message"); ?>',
                    form_data: formData
                },
                beforeSend: function() {
                    $('.maf-form-actions button').prop('disabled', true).text('发送中...');
                },
                success: function(response) {
                    if (response.success) {
                        alert('消息发送成功!');
                        $('#maf-message-modal').hide();
                        $('#maf-message-form')[0].reset();
                    } else {
                        alert('发送失败: ' + response.data);
                    }
                },
                complete: function() {
                    $('.maf-form-actions button').prop('disabled', false).text('发送');
                }
            });
        });
    });
    </script>
    <?php
}

5.3 营销漏斗分析页面

创建可视化漏斗分析页面,帮助用户理解转化路径和瓶颈:

// 营销漏斗分析页面
function maf_marketing_funnel_page() {
    if (!current_user_can('manage_options')) {
        wp_die('您没有权限访问此页面');
    }
    
    global $wpdb;
    
    // 获取时间段参数
    $time_range = isset($_GET['time_range']) ? sanitize_text_field($_GET['time_range']) : '30days';
    $start_date = maf_calculate_start_date($time_range);
    
    // 获取漏斗数据
    $funnel_data = maf_get_funnel_analysis_data($start_date);
    
    ?>
    <div class="wrap">
        <h1 class="wp-heading-inline">营销漏斗分析</h1>
        
        <div class="maf-funnel-controls">
            <form method="get" class="maf-time-range-form">
                <input type="hidden" name="page" value="maf-marketing-funnel">
                <label for="time-range">时间范围:</label>
                <select name="time_range" id="time-range" onchange="this.form.submit()">
                    <option value="7days" <?php selected($time_range, '7days'); ?>>最近7天</option>
                    <option value="30days" <?php selected($time_range, '30days'); ?>>最近30天</option>
                    <option value="90days" <?php selected($time_range, '90days'); ?>>最近90天</option>
                    <option value="custom" <?php selected($time_range, 'custom'); ?>>自定义</option>
                </select>
                
                <?php if ($time_range === 'custom'): ?>
                <label for="start-date">开始日期:</label>
                <input type="date" name="start_date" id="start-date" 
                       value="<?php echo isset($_GET['start_date']) ? esc_attr($_GET['start_date']) : ''; ?>">
                <label for="end-date">结束日期:</label>
                <input type="date" name="end_date" id="end-date" 
                       value="<?php echo isset($_GET['end_date']) ? esc_attr($_GET['end_date']) : ''; ?>">
                <input type="submit" class="button" value="应用">
                <?php endif; ?>
            </form>
        </div>
        
        <div class="maf-funnel-visualization">
            <h3>漏斗可视化</h3>
            <div class="maf-funnel-chart-container">
                <div class="maf-funnel-chart">
                    <?php foreach ($funnel_data['stages'] as $stage): ?>
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5132.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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