文章目录
-
- 在当今的数字营销时代,网站广告已成为许多网站盈利的重要方式。然而,对于大多数WordPress网站管理员来说,广告管理常常是一个令人头疼的问题。手动插入广告代码不仅效率低下,而且难以实现精准投放、效果追踪和优化调整。传统的广告管理方式存在诸多局限性:广告位置固定无法根据用户行为调整、缺乏数据统计功能、无法实现A/B测试、难以针对不同设备展示不同广告等。 正是这些痛点催生了智能广告管理系统的需求。通过开发一个专业的WordPress插件,我们可以实现广告位的自动化、智能化管理,让广告投放变得更加高效和精准。本教程将带领您从零开始,开发一个功能完整的WordPress广告位智能管理插件,同时展示如何通过WordPress代码二次开发实现常用互联网小工具功能。
-
- WordPress插件本质上是一组PHP文件,遵循特定的结构和规范,用于扩展WordPress核心功能。一个标准的WordPress插件至少包含一个主PHP文件,该文件头部包含特定的插件信息注释。插件可以包含CSS、JavaScript、图片资源以及其他PHP文件。 插件开发的核心原则包括:遵循WordPress编码标准、确保插件安全性和稳定性、提供清晰的用户界面、保持与WordPress核心和其他插件的兼容性。我们的广告管理插件将采用模块化设计,将不同功能分离到不同的类和文件中,便于维护和扩展。
- 在开始开发之前,我们需要搭建合适的开发环境: 本地服务器环境:推荐使用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进行版本控制,便于团队协作和代码管理。
- 首先,在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();
-
- 广告数据需要存储在数据库中,以便持久化和高效查询。我们将创建自定义数据库表来存储广告信息: // 在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(); } }
- 创建一个用户友好的后台界面是插件成功的关键。我们将使用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') )); } } }
- 智能广告投放的核心是根据多种条件匹配最合适的广告。我们将实现一个智能匹配算法: 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; } }
-
- 短代码是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; } }
- 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); ?>>
-
- 要实现智能广告管理,必须建立完善的数据追踪系统。我们需要记录广告的展示、点击、转化等关键指标: 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; } }
- 创建直观的数据统计界面,帮助管理员了解广告效果: 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 ); } }
-
- 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 ); } }
- 基于收集的数据,实现广告投放的智能优化: 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];
在当今的数字营销时代,网站广告已成为许多网站盈利的重要方式。然而,对于大多数WordPress网站管理员来说,广告管理常常是一个令人头疼的问题。手动插入广告代码不仅效率低下,而且难以实现精准投放、效果追踪和优化调整。传统的广告管理方式存在诸多局限性:广告位置固定无法根据用户行为调整、缺乏数据统计功能、无法实现A/B测试、难以针对不同设备展示不同广告等。
正是这些痛点催生了智能广告管理系统的需求。通过开发一个专业的WordPress插件,我们可以实现广告位的自动化、智能化管理,让广告投放变得更加高效和精准。本教程将带领您从零开始,开发一个功能完整的WordPress广告位智能管理插件,同时展示如何通过WordPress代码二次开发实现常用互联网小工具功能。
WordPress插件本质上是一组PHP文件,遵循特定的结构和规范,用于扩展WordPress核心功能。一个标准的WordPress插件至少包含一个主PHP文件,该文件头部包含特定的插件信息注释。插件可以包含CSS、JavaScript、图片资源以及其他PHP文件。
插件开发的核心原则包括:遵循WordPress编码标准、确保插件安全性和稳定性、提供清晰的用户界面、保持与WordPress核心和其他插件的兼容性。我们的广告管理插件将采用模块化设计,将不同功能分离到不同的类和文件中,便于维护和扩展。
在开始开发之前,我们需要搭建合适的开发环境:
- 本地服务器环境:推荐使用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进行版本控制,便于团队协作和代码管理。
首先,在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();
广告数据需要存储在数据库中,以便持久化和高效查询。我们将创建自定义数据库表来存储广告信息:
// 在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();
}
}
创建一个用户友好的后台界面是插件成功的关键。我们将使用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')
));
}
}
}
智能广告投放的核心是根据多种条件匹配最合适的广告。我们将实现一个智能匹配算法:
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;
}
}
短代码是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;
}
}
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); ?>>
要实现智能广告管理,必须建立完善的数据追踪系统。我们需要记录广告的展示、点击、转化等关键指标:
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;
}
}
创建直观的数据统计界面,帮助管理员了解广告效果:
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
);
}
}
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
);
}
}
基于收集的数据,实现广告投放的智能优化:
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];


