首页 / 应用软件 / WordPress插件开发教程,实现网站广告位智能管理与投放

WordPress插件开发教程,实现网站广告位智能管理与投放

WordPress插件开发教程:实现网站广告位智能管理与投放

引言:为什么需要广告位智能管理插件

在当今的数字营销时代,网站广告已成为许多网站盈利的重要方式。然而,对于大多数WordPress网站管理员来说,广告管理常常是一个令人头疼的问题。手动插入广告代码不仅效率低下,而且难以实现精准投放、效果追踪和优化调整。传统的广告管理方式存在诸多局限性:广告位置固定无法根据用户行为调整、缺乏数据统计功能、无法实现A/B测试、难以针对不同设备展示不同广告等。

正是这些痛点催生了智能广告管理系统的需求。通过开发一个专业的WordPress插件,我们可以实现广告位的自动化、智能化管理,让广告投放变得更加高效和精准。本教程将带领您从零开始,开发一个功能完整的WordPress广告位智能管理插件,同时展示如何通过WordPress代码二次开发实现常用互联网小工具功能。

第一章:WordPress插件开发基础与环境搭建

1.1 WordPress插件架构概述

WordPress插件本质上是一组PHP文件,遵循特定的结构和规范,用于扩展WordPress核心功能。一个标准的WordPress插件至少包含一个主PHP文件,该文件头部包含特定的插件信息注释。插件可以包含CSS、JavaScript、图片资源以及其他PHP文件。

插件开发的核心原则包括:遵循WordPress编码标准、确保插件安全性和稳定性、提供清晰的用户界面、保持与WordPress核心和其他插件的兼容性。我们的广告管理插件将采用模块化设计,将不同功能分离到不同的类和文件中,便于维护和扩展。

1.2 开发环境配置

在开始开发之前,我们需要搭建合适的开发环境:

  1. 本地服务器环境:推荐使用XAMPP、MAMP或Local by Flywheel,它们提供了集成的Apache、MySQL和PHP环境。
  2. WordPress安装:下载最新版本的WordPress,安装在本地服务器上。建议创建一个专门用于开发的测试站点。
  3. 代码编辑器:选择功能强大的代码编辑器,如Visual Studio Code、PHPStorm或Sublime Text。这些编辑器提供了代码高亮、智能提示和调试功能。
  4. 调试工具:在wp-config.php中启用WordPress调试模式:

    define('WP_DEBUG', true);
    define('WP_DEBUG_LOG', true);
    define('WP_DEBUG_DISPLAY', false);
  5. 版本控制:使用Git进行版本控制,便于团队协作和代码管理。

1.3 创建插件基本结构

首先,在WordPress的wp-content/plugins目录下创建我们的插件文件夹,命名为"smart-ad-manager"。在该文件夹中创建以下基本文件结构:

smart-ad-manager/
├── smart-ad-manager.php      # 主插件文件
├── includes/                 # 包含核心类文件
│   ├── class-ad-manager.php
│   ├── class-ad-renderer.php
│   └── class-ad-analytics.php
├── admin/                    # 后台管理相关文件
│   ├── css/
│   ├── js/
│   └── partials/
├── public/                   # 前端相关文件
│   ├── css/
│   ├── js/
│   └── templates/
├── assets/                   # 静态资源
└── uninstall.php            # 插件卸载脚本

接下来,编辑主插件文件smart-ad-manager.php,添加插件头部信息:

<?php
/**
 * Plugin Name: Smart Ad Manager
 * Plugin URI: https://yourwebsite.com/smart-ad-manager
 * Description: 智能广告位管理与投放系统,支持精准投放、效果追踪和优化调整。
 * Version: 1.0.0
 * Author: Your Name
 * Author URI: https://yourwebsite.com
 * License: GPL v2 or later
 * Text Domain: smart-ad-manager
 * Domain Path: /languages
 */

// 防止直接访问
if (!defined('ABSPATH')) {
    exit;
}

// 定义插件常量
define('SAM_VERSION', '1.0.0');
define('SAM_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('SAM_PLUGIN_URL', plugin_dir_url(__FILE__));
define('SAM_PLUGIN_BASENAME', plugin_basename(__FILE__));

// 初始化插件
require_once SAM_PLUGIN_DIR . 'includes/class-ad-manager.php';

function run_smart_ad_manager() {
    $plugin = new Ad_Manager();
    $plugin->run();
}
run_smart_ad_manager();

第二章:广告位管理系统的核心功能实现

2.1 数据库设计与广告位存储

广告数据需要存储在数据库中,以便持久化和高效查询。我们将创建自定义数据库表来存储广告信息:

// 在Ad_Manager类中添加数据库创建方法
class Ad_Manager {
    
    public function create_ad_tables() {
        global $wpdb;
        
        $charset_collate = $wpdb->get_charset_collate();
        $table_name = $wpdb->prefix . 'sam_ads';
        
        $sql = "CREATE TABLE IF NOT EXISTS $table_name (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            title varchar(200) NOT NULL,
            ad_type varchar(50) NOT NULL,
            ad_code text NOT NULL,
            ad_image varchar(500),
            ad_link varchar(500),
            start_date datetime,
            end_date datetime,
            max_impressions int DEFAULT 0,
            current_impressions int DEFAULT 0,
            max_clicks int DEFAULT 0,
            current_clicks int DEFAULT 0,
            status varchar(20) DEFAULT 'active',
            targeting_rules text,
            priority int DEFAULT 1,
            created_at datetime DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY (id)
        ) $charset_collate;";
        
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
        
        // 创建广告位表
        $positions_table = $wpdb->prefix . 'sam_ad_positions';
        $sql2 = "CREATE TABLE IF NOT EXISTS $positions_table (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            position_key varchar(100) NOT NULL,
            position_name varchar(200) NOT NULL,
            description text,
            default_ad_id mediumint(9),
            max_ads int DEFAULT 1,
            dimensions varchar(50),
            allowed_types varchar(200),
            is_active tinyint(1) DEFAULT 1,
            PRIMARY KEY (id),
            UNIQUE KEY position_key (position_key)
        ) $charset_collate;";
        
        dbDelta($sql2);
    }
    
    // 插件激活时创建表
    public static function activate() {
        self::create_ad_tables();
        flush_rewrite_rules();
    }
}

2.2 广告位管理后台界面开发

创建一个用户友好的后台界面是插件成功的关键。我们将使用WordPress的设置API和自定义管理页面来构建广告管理后台:

class Ad_Manager_Admin {
    
    private $ad_manager;
    
    public function __construct($ad_manager) {
        $this->ad_manager = $ad_manager;
        
        add_action('admin_menu', array($this, 'add_admin_menu'));
        add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
        add_action('wp_ajax_sam_save_ad', array($this, 'ajax_save_ad'));
        add_action('wp_ajax_sam_get_ads', array($this, 'ajax_get_ads'));
    }
    
    public function add_admin_menu() {
        // 主菜单
        add_menu_page(
            '智能广告管理',
            '广告管理',
            'manage_options',
            'smart-ad-manager',
            array($this, 'display_main_page'),
            'dashicons-megaphone',
            30
        );
        
        // 子菜单
        add_submenu_page(
            'smart-ad-manager',
            '广告列表',
            '广告列表',
            'manage_options',
            'sam-ads',
            array($this, 'display_ads_page')
        );
        
        add_submenu_page(
            'smart-ad-manager',
            '广告位设置',
            '广告位设置',
            'manage_options',
            'sam-positions',
            array($this, 'display_positions_page')
        );
        
        add_submenu_page(
            'smart-ad-manager',
            '数据统计',
            '数据统计',
            'manage_options',
            'sam-analytics',
            array($this, 'display_analytics_page')
        );
    }
    
    public function display_main_page() {
        include SAM_PLUGIN_DIR . 'admin/partials/dashboard.php';
    }
    
    public function enqueue_admin_scripts($hook) {
        if (strpos($hook, 'smart-ad-manager') !== false) {
            wp_enqueue_style('sam-admin-style', SAM_PLUGIN_URL . 'admin/css/admin.css', array(), SAM_VERSION);
            wp_enqueue_script('sam-admin-script', SAM_PLUGIN_URL . 'admin/js/admin.js', array('jquery', 'jquery-ui-sortable'), SAM_VERSION, true);
            
            wp_localize_script('sam-admin-script', 'sam_ajax', array(
                'ajax_url' => admin_url('admin-ajax.php'),
                'nonce' => wp_create_nonce('sam_ajax_nonce')
            ));
        }
    }
}

2.3 广告投放逻辑与智能匹配算法

智能广告投放的核心是根据多种条件匹配最合适的广告。我们将实现一个智能匹配算法:

class Ad_Renderer {
    
    public function get_ad_for_position($position_key, $context = array()) {
        global $wpdb;
        
        // 获取广告位信息
        $positions_table = $wpdb->prefix . 'sam_ad_positions';
        $position = $wpdb->get_row($wpdb->prepare(
            "SELECT * FROM $positions_table WHERE position_key = %s AND is_active = 1",
            $position_key
        ));
        
        if (!$position) {
            return '';
        }
        
        // 获取该广告位可用的广告
        $ads_table = $wpdb->prefix . 'sam_ads';
        $query = "SELECT * FROM $ads_table WHERE status = 'active' 
                  AND (start_date IS NULL OR start_date <= NOW()) 
                  AND (end_date IS NULL OR end_date >= NOW())";
        
        // 添加智能匹配条件
        $conditions = array();
        $params = array();
        
        // 1. 设备类型匹配
        if (isset($context['device'])) {
            $conditions[] = "(targeting_rules LIKE %s OR targeting_rules IS NULL OR targeting_rules = '')";
            $params[] = '%"device":"' . $context['device'] . '"%';
        }
        
        // 2. 用户地理位置匹配
        if (isset($context['location'])) {
            $conditions[] = "(targeting_rules LIKE %s OR targeting_rules IS NULL OR targeting_rules = '')";
            $params[] = '%"location":"' . $context['location'] . '"%';
        }
        
        // 3. 页面类型匹配
        if (isset($context['page_type'])) {
            $conditions[] = "(targeting_rules LIKE %s OR targeting_rules IS NULL OR targeting_rules = '')";
            $params[] = '%"page_type":"' . $context['page_type'] . '"%';
        }
        
        if (!empty($conditions)) {
            $query .= " AND (" . implode(" OR ", $conditions) . ")";
        }
        
        $query .= " ORDER BY priority DESC, RAND() LIMIT %d";
        $params[] = $position->max_ads;
        
        if (!empty($params)) {
            $ads = $wpdb->get_results($wpdb->prepare($query, $params));
        } else {
            $ads = $wpdb->get_results($wpdb->prepare($query . " LIMIT %d", $position->max_ads));
        }
        
        if (empty($ads)) {
            // 返回默认广告或空
            return $this->get_default_ad($position);
        }
        
        // 渲染广告
        return $this->render_ads($ads, $position);
    }
    
    private function render_ads($ads, $position) {
        $output = '<div class="sam-ad-container" data-position="' . esc_attr($position->position_key) . '">';
        
        foreach ($ads as $ad) {
            $output .= $this->render_single_ad($ad);
            
            // 更新展示次数
            $this->record_impression($ad->id);
        }
        
        $output .= '</div>';
        
        return $output;
    }
}

第三章:通过短代码和Widget实现广告位插入

3.1 创建广告短代码

短代码是WordPress中插入动态内容的简便方式。我们将创建广告短代码,让用户可以在文章、页面或侧边栏中轻松插入广告:

class Ad_Shortcodes {
    
    public function init() {
        add_shortcode('display_ad', array($this, 'display_ad_shortcode'));
        add_shortcode('ad_position', array($this, 'ad_position_shortcode'));
    }
    
    public function display_ad_shortcode($atts) {
        $atts = shortcode_atts(array(
            'id' => 0,
            'position' => '',
            'class' => '',
            'style' => ''
        ), $atts, 'display_ad');
        
        if (!empty($atts['id'])) {
            // 显示特定ID的广告
            return $this->render_ad_by_id($atts['id'], $atts);
        } elseif (!empty($atts['position'])) {
            // 显示特定广告位的广告
            $renderer = new Ad_Renderer();
            $context = $this->get_current_context();
            return $renderer->get_ad_for_position($atts['position'], $context);
        }
        
        return '';
    }
    
    public function ad_position_shortcode($atts) {
        $atts = shortcode_atts(array(
            'key' => '',
            'title' => '',
            'description' => '',
            'width' => 'auto',
            'height' => 'auto'
        ), $atts, 'ad_position');
        
        if (empty($atts['key'])) {
            return '<p>请指定广告位key</p>';
        }
        
        // 检查广告位是否存在,不存在则创建
        $this->create_position_if_not_exists($atts);
        
        $renderer = new Ad_Renderer();
        $context = $this->get_current_context();
        
        return $renderer->get_ad_for_position($atts['key'], $context);
    }
    
    private function get_current_context() {
        $context = array();
        
        // 检测设备类型
        $context['device'] = wp_is_mobile() ? 'mobile' : 'desktop';
        
        // 检测页面类型
        if (is_front_page()) {
            $context['page_type'] = 'home';
        } elseif (is_single()) {
            $context['page_type'] = 'single';
        } elseif (is_page()) {
            $context['page_type'] = 'page';
        } elseif (is_category()) {
            $context['page_type'] = 'category';
        }
        
        return $context;
    }
}

3.2 开发广告位Widget

Widget是WordPress侧边栏和小工具区域的内容块。我们将创建一个广告位Widget,让用户可以通过拖拽方式在侧边栏添加广告:

class Ad_Position_Widget extends WP_Widget {
    
    public function __construct() {
        parent::__construct(
            'sam_ad_widget',
            __('智能广告位', 'smart-ad-manager'),
            array(
                'description' => __('在侧边栏显示智能广告', 'smart-ad-manager'),
                'classname' => 'sam-ad-widget'
            )
        );
    }
    
    public function widget($args, $instance) {
        $title = apply_filters('widget_title', empty($instance['title']) ? '' : $instance['title'], $instance, $this->id_base);
        $position_key = empty($instance['position_key']) ? '' : $instance['position_key'];
        
        if (empty($position_key)) {
            return;
        }
        
        echo $args['before_widget'];
        
        if ($title) {
            echo $args['before_title'] . $title . $args['after_title'];
        }
        
        $renderer = new Ad_Renderer();
        $context = array(
            'device' => wp_is_mobile() ? 'mobile' : 'desktop',
            'location' => 'sidebar'
        );
        
        echo $renderer->get_ad_for_position($position_key, $context);
        
        echo $args['after_widget'];
    }
    
    public function form($instance) {
        global $wpdb;
        
        $title = isset($instance['title']) ? esc_attr($instance['title']) : '';
        $position_key = isset($instance['position_key']) ? esc_attr($instance['position_key']) : '';
        
        // 获取所有广告位
        $positions_table = $wpdb->prefix . 'sam_ad_positions';
        $positions = $wpdb->get_results("SELECT * FROM $positions_table WHERE is_active = 1 ORDER BY position_name");
        ?>
        
        <p>
            <label for="<?php echo $this->get_field_id('title'); ?>">
                <?php _e('标题:', 'smart-ad-manager'); ?>
            </label>
            <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" 
                   name="<?php echo $this->get_field_name('title'); ?>" type="text" 
                   value="<?php echo $title; ?>">
        </p>
        
        <p>
            <label for="<?php echo $this->get_field_id('position_key'); ?>">
                <?php _e('选择广告位:', 'smart-ad-manager'); ?>
            </label>
            <select class="widefat" id="<?php echo $this->get_field_id('position_key'); ?>" 
                    name="<?php echo $this->get_field_name('position_key'); ?>">
                <option value=""><?php _e('-- 请选择广告位 --', 'smart-ad-manager'); ?></option>
                <?php foreach ($positions as $position): ?>
                <option value="<?php echo esc_attr($position->position_key); ?>" 
                        <?php selected($position_key, $position->position_key); ?>>

第四章:广告效果追踪与数据分析系统

4.1 数据采集与存储机制

要实现智能广告管理,必须建立完善的数据追踪系统。我们需要记录广告的展示、点击、转化等关键指标:

class Ad_Analytics {
    
    private $db;
    
    public function __construct() {
        global $wpdb;
        $this->db = $wpdb;
        
        // 创建数据追踪表
        $this->create_tracking_tables();
        
        // 注册追踪钩子
        add_action('wp_ajax_nopriv_sam_track_click', array($this, 'track_click'));
        add_action('wp_ajax_sam_track_click', array($this, 'track_click'));
        add_action('wp_ajax_nopriv_sam_track_impression', array($this, 'track_impression'));
        add_action('wp_ajax_sam_track_impression', array($this, 'track_impression'));
    }
    
    private function create_tracking_tables() {
        $charset_collate = $this->db->get_charset_collate();
        
        // 点击记录表
        $clicks_table = $this->db->prefix . 'sam_ad_clicks';
        $sql = "CREATE TABLE IF NOT EXISTS $clicks_table (
            id bigint(20) NOT NULL AUTO_INCREMENT,
            ad_id mediumint(9) NOT NULL,
            user_id bigint(20),
            session_id varchar(100),
            ip_address varchar(45),
            user_agent text,
            referrer varchar(500),
            page_url varchar(500),
            click_time datetime DEFAULT CURRENT_TIMESTAMP,
            device_type varchar(20),
            browser varchar(100),
            os varchar(50),
            country varchar(100),
            city varchar(100),
            conversion_value decimal(10,2) DEFAULT 0,
            conversion_time datetime,
            PRIMARY KEY (id),
            KEY ad_id (ad_id),
            KEY click_time (click_time)
        ) $charset_collate;";
        
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
        
        // 展示记录表
        $impressions_table = $this->db->prefix . 'sam_ad_impressions';
        $sql2 = "CREATE TABLE IF NOT EXISTS $impressions_table (
            id bigint(20) NOT NULL AUTO_INCREMENT,
            ad_id mediumint(9) NOT NULL,
            position_key varchar(100),
            user_id bigint(20),
            session_id varchar(100),
            ip_address varchar(45),
            impression_time datetime DEFAULT CURRENT_TIMESTAMP,
            device_type varchar(20),
            page_type varchar(50),
            is_unique tinyint(1) DEFAULT 1,
            PRIMARY KEY (id),
            KEY ad_id (ad_id),
            KEY impression_time (impression_time)
        ) $charset_collate;";
        
        dbDelta($sql2);
    }
    
    public function track_click() {
        // 验证nonce
        check_ajax_referer('sam_tracking_nonce', 'security');
        
        $ad_id = intval($_POST['ad_id']);
        $session_id = sanitize_text_field($_POST['session_id']);
        
        // 收集用户信息
        $user_info = $this->collect_user_info();
        
        // 记录点击
        $this->db->insert(
            $this->db->prefix . 'sam_ad_clicks',
            array(
                'ad_id' => $ad_id,
                'user_id' => get_current_user_id(),
                'session_id' => $session_id,
                'ip_address' => $user_info['ip'],
                'user_agent' => $user_info['user_agent'],
                'referrer' => $user_info['referrer'],
                'page_url' => $user_info['page_url'],
                'device_type' => $user_info['device_type'],
                'browser' => $user_info['browser'],
                'os' => $user_info['os'],
                'country' => $user_info['country'],
                'city' => $user_info['city']
            )
        );
        
        // 更新广告点击计数
        $this->update_ad_click_count($ad_id);
        
        wp_die();
    }
    
    private function collect_user_info() {
        $info = array();
        
        // IP地址
        $info['ip'] = $this->get_user_ip();
        
        // User Agent
        $info['user_agent'] = $_SERVER['HTTP_USER_AGENT'] ?? '';
        
        // Referrer
        $info['referrer'] = $_SERVER['HTTP_REFERER'] ?? '';
        
        // 当前页面URL
        $info['page_url'] = home_url(add_query_arg(array()));
        
        // 设备类型
        $info['device_type'] = wp_is_mobile() ? 'mobile' : 'desktop';
        
        // 浏览器和操作系统信息
        $browser_info = $this->parse_user_agent($info['user_agent']);
        $info['browser'] = $browser_info['browser'];
        $info['os'] = $browser_info['os'];
        
        // 地理位置(可以使用第三方API或本地数据库)
        $info['country'] = $this->get_country_from_ip($info['ip']);
        $info['city'] = $this->get_city_from_ip($info['ip']);
        
        return $info;
    }
}

4.2 数据统计与可视化展示

创建直观的数据统计界面,帮助管理员了解广告效果:

class Ad_Statistics {
    
    public function display_statistics_page() {
        ?>
        <div class="wrap sam-statistics">
            <h1><?php _e('广告数据统计', 'smart-ad-manager'); ?></h1>
            
            <div class="sam-stat-filters">
                <form method="get" action="">
                    <input type="hidden" name="page" value="sam-analytics">
                    
                    <label for="date_range"><?php _e('时间范围:', 'smart-ad-manager'); ?></label>
                    <select name="date_range" id="date_range">
                        <option value="today"><?php _e('今天', 'smart-ad-manager'); ?></option>
                        <option value="yesterday"><?php _e('昨天', 'smart-ad-manager'); ?></option>
                        <option value="last7days"><?php _e('最近7天', 'smart-ad-manager'); ?></option>
                        <option value="last30days"><?php _e('最近30天', 'smart-ad-manager'); ?></option>
                        <option value="custom"><?php _e('自定义', 'smart-ad-manager'); ?></option>
                    </select>
                    
                    <div id="custom-date-range" style="display:none;">
                        <input type="date" name="start_date" value="<?php echo date('Y-m-d', strtotime('-7 days')); ?>">
                        <input type="date" name="end_date" value="<?php echo date('Y-m-d'); ?>">
                    </div>
                    
                    <label for="ad_id"><?php _e('广告:', 'smart-ad-manager'); ?></label>
                    <select name="ad_id" id="ad_id">
                        <option value=""><?php _e('所有广告', 'smart-ad-manager'); ?></option>
                        <?php $this->render_ad_options(); ?>
                    </select>
                    
                    <button type="submit" class="button button-primary"><?php _e('筛选', 'smart-ad-manager'); ?></button>
                </form>
            </div>
            
            <div class="sam-stat-overview">
                <?php $this->display_overview_stats(); ?>
            </div>
            
            <div class="sam-stat-charts">
                <div class="chart-container">
                    <h3><?php _e('点击率趋势', 'smart-ad-manager'); ?></h3>
                    <canvas id="ctr-chart" width="400" height="200"></canvas>
                </div>
                
                <div class="chart-container">
                    <h3><?php _e('设备分布', 'smart-ad-manager'); ?></h3>
                    <canvas id="device-chart" width="400" height="200"></canvas>
                </div>
            </div>
            
            <div class="sam-stat-details">
                <h3><?php _e('详细数据', 'smart-ad-manager'); ?></h3>
                <?php $this->display_detailed_stats_table(); ?>
            </div>
        </div>
        
        <script>
        jQuery(document).ready(function($) {
            // 初始化图表
            var ctrChart = new Chart($('#ctr-chart'), {
                type: 'line',
                data: {
                    labels: <?php echo json_encode($this->get_chart_labels()); ?>,
                    datasets: [{
                        label: '点击率(%)',
                        data: <?php echo json_encode($this->get_ctr_data()); ?>,
                        borderColor: 'rgb(75, 192, 192)',
                        tension: 0.1
                    }]
                }
            });
            
            var deviceChart = new Chart($('#device-chart'), {
                type: 'doughnut',
                data: {
                    labels: ['桌面端', '移动端', '平板'],
                    datasets: [{
                        data: <?php echo json_encode($this->get_device_distribution()); ?>,
                        backgroundColor: [
                            'rgb(255, 99, 132)',
                            'rgb(54, 162, 235)',
                            'rgb(255, 205, 86)'
                        ]
                    }]
                }
            });
        });
        </script>
        <?php
    }
    
    private function get_overview_stats($start_date = null, $end_date = null) {
        global $wpdb;
        
        $clicks_table = $wpdb->prefix . 'sam_ad_clicks';
        $impressions_table = $wpdb->prefix . 'sam_ad_impressions';
        
        $where_clause = '';
        if ($start_date && $end_date) {
            $where_clause = $wpdb->prepare(
                "WHERE click_time >= %s AND click_time <= %s",
                $start_date . ' 00:00:00',
                $end_date . ' 23:59:59'
            );
        }
        
        // 总点击量
        $total_clicks = $wpdb->get_var(
            "SELECT COUNT(*) FROM $clicks_table $where_clause"
        );
        
        // 总展示量
        $total_impressions = $wpdb->get_var(
            "SELECT COUNT(*) FROM $impressions_table " . 
            str_replace('click_time', 'impression_time', $where_clause)
        );
        
        // 点击率
        $ctr = $total_impressions > 0 ? 
               round(($total_clicks / $total_impressions) * 100, 2) : 0;
        
        // 独立访客数
        $unique_visitors = $wpdb->get_var(
            "SELECT COUNT(DISTINCT session_id) FROM $impressions_table " .
            str_replace('click_time', 'impression_time', $where_clause)
        );
        
        return array(
            'total_clicks' => $total_clicks,
            'total_impressions' => $total_impressions,
            'ctr' => $ctr,
            'unique_visitors' => $unique_visitors
        );
    }
}

第五章:高级功能实现与优化

5.1 A/B测试功能

A/B测试是优化广告效果的重要手段。我们将实现一个简单的A/B测试系统:

class Ad_AB_Testing {
    
    public function init() {
        add_action('sam_ad_selection', array($this, 'apply_ab_testing'), 10, 3);
        add_action('wp_ajax_sam_create_ab_test', array($this, 'create_ab_test'));
    }
    
    public function apply_ab_testing($ads, $position_key, $context) {
        // 检查该广告位是否有正在进行的A/B测试
        $active_tests = $this->get_active_tests($position_key);
        
        if (empty($active_tests)) {
            return $ads;
        }
        
        foreach ($active_tests as $test) {
            // 根据测试分组分配用户
            $user_group = $this->assign_user_to_group($test);
            
            if ($user_group === 'control') {
                // 控制组:显示原始广告
                continue;
            }
            
            // 实验组:显示测试广告
            $variant_ads = $this->get_test_variants($test->id);
            if (!empty($variant_ads)) {
                // 替换或添加测试广告
                $ads = $this->merge_test_ads($ads, $variant_ads, $test);
            }
        }
        
        return $ads;
    }
    
    private function assign_user_to_group($test) {
        $session_id = $this->get_session_id();
        
        // 检查用户是否已经分配了组别
        $existing_group = $this->get_user_test_group($test->id, $session_id);
        if ($existing_group) {
            return $existing_group;
        }
        
        // 根据测试配置分配组别
        $groups = array('control', 'variant_a', 'variant_b');
        $weights = array(
            'control' => $test->control_percentage,
            'variant_a' => $test->variant_a_percentage,
            'variant_b' => $test->variant_b_percentage
        );
        
        $group = $this->weighted_random_selection($weights);
        
        // 记录用户分组
        $this->record_user_group($test->id, $session_id, $group);
        
        return $group;
    }
    
    public function create_ab_test() {
        check_ajax_referer('sam_admin_nonce', 'nonce');
        
        $test_data = array(
            'name' => sanitize_text_field($_POST['test_name']),
            'position_key' => sanitize_text_field($_POST['position_key']),
            'control_ad_id' => intval($_POST['control_ad_id']),
            'variant_a_ad_id' => intval($_POST['variant_a_ad_id']),
            'variant_b_ad_id' => intval($_POST['variant_b_ad_id']),
            'control_percentage' => intval($_POST['control_percentage']),
            'variant_a_percentage' => intval($_POST['variant_a_percentage']),
            'variant_b_percentage' => intval($_POST['variant_b_percentage']),
            'start_date' => sanitize_text_field($_POST['start_date']),
            'end_date' => sanitize_text_field($_POST['end_date']),
            'primary_metric' => sanitize_text_field($_POST['primary_metric']),
            'confidence_level' => floatval($_POST['confidence_level'])
        );
        
        global $wpdb;
        $tests_table = $wpdb->prefix . 'sam_ab_tests';
        
        $wpdb->insert($tests_table, $test_data);
        
        wp_send_json_success(array(
            'message' => __('A/B测试创建成功', 'smart-ad-manager'),
            'test_id' => $wpdb->insert_id
        ));
    }
    
    public function evaluate_test_results($test_id) {
        global $wpdb;
        
        $test = $wpdb->get_row($wpdb->prepare(
            "SELECT * FROM {$wpdb->prefix}sam_ab_tests WHERE id = %d",
            $test_id
        ));
        
        if (!$test) {
            return false;
        }
        
        // 收集各组数据
        $groups = array('control', 'variant_a', 'variant_b');
        $results = array();
        
        foreach ($groups as $group) {
            $ad_id_field = $group . '_ad_id';
            $ad_id = $test->$ad_id_field;
            
            if (!$ad_id) {
                continue;
            }
            
            $results[$group] = array(
                'impressions' => $this->get_ad_impressions($ad_id, $test->start_date, $test->end_date),
                'clicks' => $this->get_ad_clicks($ad_id, $test->start_date, $test->end_date),
                'conversions' => $this->get_ad_conversions($ad_id, $test->start_date, $test->end_date)
            );
            
            // 计算指标
            if ($results[$group]['impressions'] > 0) {
                $results[$group]['ctr'] = ($results[$group]['clicks'] / $results[$group]['impressions']) * 100;
            } else {
                $results[$group]['ctr'] = 0;
            }
        }
        
        // 统计显著性检验
        $significance_results = $this->calculate_statistical_significance($results);
        
        // 判断测试结果
        $conclusion = $this->draw_test_conclusion($significance_results, $test->confidence_level);
        
        // 更新测试状态
        $this->update_test_status($test_id, 'completed', $conclusion);
        
        return array(
            'results' => $results,
            'significance' => $significance_results,
            'conclusion' => $conclusion
        );
    }
}

5.2 智能优化算法

基于收集的数据,实现广告投放的智能优化:

class Ad_Optimizer {
    
    private $learning_rate = 0.1;
    private $exploration_rate = 0.2;
    
    public function optimize_ad_selection($ads, $context) {
        if (empty($ads)) {
            return $ads;
        }
        
        // 计算每个广告的预期价值
        $ad_values = array();
        foreach ($ads as $ad) {
            $ad_values[$ad->id] = $this->calculate_expected_value($ad, $context);
        }
        
        // 探索-利用平衡
        if (mt_rand(0, 100) / 100 < $this->exploration_rate) {
            // 探索:随机选择一个广告
            $selected_key = array_rand($ads);
        } else {
            // 利用:选择价值最高的广告
            arsort($ad_values);
            $selected_key = array_key_first($ad_values);
        }
        
        // 重新排序广告,将最优广告放在前面
        $optimized_ads = array();
        $optimized_ads[] = $ads[$selected_key];
        
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5124.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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