文章目录[隐藏]
WordPress插件开发教程:实现网站广告位智能管理与投放
引言:为什么需要广告位智能管理插件
在当今的数字营销时代,网站广告已成为许多网站盈利的重要方式。然而,对于大多数WordPress网站管理员来说,广告管理常常是一个令人头疼的问题。手动插入广告代码不仅效率低下,而且难以实现精准投放、效果追踪和优化调整。传统的广告管理方式存在诸多局限性:广告位置固定无法根据用户行为调整、缺乏数据统计功能、无法实现A/B测试、难以针对不同设备展示不同广告等。
正是这些痛点催生了智能广告管理系统的需求。通过开发一个专业的WordPress插件,我们可以实现广告位的自动化、智能化管理,让广告投放变得更加高效和精准。本教程将带领您从零开始,开发一个功能完整的WordPress广告位智能管理插件,同时展示如何通过WordPress代码二次开发实现常用互联网小工具功能。
第一章:WordPress插件开发基础与环境搭建
1.1 WordPress插件架构概述
WordPress插件本质上是一组PHP文件,遵循特定的结构和规范,用于扩展WordPress核心功能。一个标准的WordPress插件至少包含一个主PHP文件,该文件头部包含特定的插件信息注释。插件可以包含CSS、JavaScript、图片资源以及其他PHP文件。
插件开发的核心原则包括:遵循WordPress编码标准、确保插件安全性和稳定性、提供清晰的用户界面、保持与WordPress核心和其他插件的兼容性。我们的广告管理插件将采用模块化设计,将不同功能分离到不同的类和文件中,便于维护和扩展。
1.2 开发环境配置
在开始开发之前,我们需要搭建合适的开发环境:
- 本地服务器环境:推荐使用XAMPP、MAMP或Local by Flywheel,它们提供了集成的Apache、MySQL和PHP环境。
- WordPress安装:下载最新版本的WordPress,安装在本地服务器上。建议创建一个专门用于开发的测试站点。
- 代码编辑器:选择功能强大的代码编辑器,如Visual Studio Code、PHPStorm或Sublime Text。这些编辑器提供了代码高亮、智能提示和调试功能。
-
调试工具:在wp-config.php中启用WordPress调试模式:
define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false); - 版本控制:使用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];
