文章目录
-
- 在当今数字化媒体环境中,网络传媒机构每天产生海量数据——从用户访问行为、内容互动指标到社交媒体传播效果。如何高效分析这些数据,并将其转化为可操作的见解,成为媒体成功的关键。本教程将详细介绍如何通过WordPress插件实现网络传媒数据的柔性分析,帮助您构建灵活、可扩展的数据分析系统。
-
- 首先确保您的WordPress网站运行在PHP 7.4或更高版本,并已启用MySQL或MariaDB数据库。 <?php // 检查PHP版本是否符合要求 if (version_compare(PHP_VERSION, '7.4.0') < 0) { die('需要PHP 7.4.0或更高版本,当前版本: ' . PHP_VERSION); } // 检查必要的WordPress函数是否存在 if (!function_exists('wp_remote_get')) { die('WordPress环境配置不完整'); } // 检查数据库连接 global $wpdb; if (!$wpdb->check_connection()) { die('数据库连接失败'); } ?>
- 我们推荐以下插件组合实现数据柔性分析: Google Analytics Dashboard for WP (GADWP) - 网站流量分析 MonsterInsights - 高级分析集成 WP Statistics - 本地化数据统计 Data Tables Generator by Supsystic - 数据可视化 Custom Development Plugin - 自定义数据分析插件
-
- <?php /** * 插件名称: Media Data Flex Analyzer * 描述: 网络传媒数据柔性分析工具 * 版本: 1.0.0 * 作者: 网络传媒技术团队 */ // 防止直接访问 if (!defined('ABSPATH')) { exit; } // 定义插件常量 define('MDFA_VERSION', '1.0.0'); define('MDFA_PLUGIN_DIR', plugin_dir_path(__FILE__)); define('MDFA_PLUGIN_URL', plugin_dir_url(__FILE__)); // 主插件类 class MediaDataFlexAnalyzer { private static $instance = null; // 单例模式 public static function get_instance() { if (null === self::$instance) { self::$instance = new self(); } return self::$instance; } // 构造函数 private function __construct() { $this->init_hooks(); } // 初始化钩子 private function init_hooks() { add_action('admin_menu', array($this, 'add_admin_menu')); add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts')); add_action('wp_dashboard_setup', array($this, 'add_dashboard_widget')); } // 添加管理菜单 public function add_admin_menu() { add_menu_page( '传媒数据分析', // 页面标题 '数据柔性分析', // 菜单标题 'manage_options', // 权限 'media-data-analyzer', // 菜单slug array($this, 'render_analyzer_page'), // 回调函数 'dashicons-chart-line', // 图标 30 // 位置 ); } // 渲染分析页面 public function render_analyzer_page() { ?> <div class="wrap"> <h1>网络传媒数据柔性分析面板</h1> <div id="mdfa-dashboard"> <!-- 分析面板内容将通过JavaScript动态加载 --> <div class="mdfa-loading">加载数据分析面板...</div> </div> </div> <?php } // 加载管理端脚本和样式 public function enqueue_admin_scripts($hook) { if ('toplevel_page_media-data-analyzer' !== $hook) { return; } wp_enqueue_style( 'mdfa-admin-style', MDFA_PLUGIN_URL . 'assets/css/admin.css', array(), MDFA_VERSION ); wp_enqueue_script( 'mdfa-admin-script', MDFA_PLUGIN_URL . 'assets/js/admin.js', array('jquery', 'chartjs'), MDFA_VERSION, true ); // 传递数据到JavaScript wp_localize_script('mdfa-admin-script', 'mdfa_data', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('mdfa_analysis_nonce') )); } // 添加仪表板小工具 public function add_dashboard_widget() { wp_add_dashboard_widget( 'mdfa_dashboard_widget', '传媒数据概览', array($this, 'render_dashboard_widget') ); } // 渲染仪表板小工具 public function render_dashboard_widget() { $today_visitors = $this->get_today_visitors(); $popular_content = $this->get_popular_content(); echo '<div class="mdfa-dashboard-widget">'; echo '<h3>今日数据概览</h3>'; echo '<p>访问量: <strong>' . esc_html($today_visitors) . '</strong></p>'; echo '<h4>热门内容</h4>'; echo '<ul>'; foreach ($popular_content as $content) { echo '<li>' . esc_html($content['title']) . ' (' . esc_html($content['views']) . '次浏览)</li>'; } echo '</ul>'; echo '</div>'; } // 获取今日访问量 private function get_today_visitors() { global $wpdb; $table_name = $wpdb->prefix . 'mdfa_visitor_stats'; // 如果表不存在,返回0 if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) { return 0; } $today = date('Y-m-d'); $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT visitor_id) FROM $table_name WHERE DATE(visit_date) = %s", $today ) ); return $count ? $count : 0; } // 获取热门内容 private function get_popular_content() { global $wpdb; $table_name = $wpdb->prefix . 'mdfa_content_stats'; // 如果表不存在,返回空数组 if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) { return array(); } $results = $wpdb->get_results( "SELECT content_id, content_title, view_count FROM $table_name ORDER BY view_count DESC LIMIT 5", ARRAY_A ); return $results ? $results : array(); } } // 初始化插件 MediaDataFlexAnalyzer::get_instance(); ?>
- <?php // 数据收集类 class MDFA_Data_Collector { // 跟踪页面访问 public static function track_page_view($post_id) { if (is_admin() || !is_single()) { return; } global $wpdb; $table_name = $wpdb->prefix . 'mdfa_content_stats'; // 确保表存在 self::create_tables_if_not_exist(); // 获取或创建访客ID $visitor_id = self::get_visitor_id(); // 记录访问 $wpdb->insert( $table_name, array( 'content_id' => $post_id, 'content_title' => get_the_title($post_id), 'visitor_id' => $visitor_id, 'view_date' => current_time('mysql'), 'view_count' => 1 ), array('%d', '%s', '%s', '%s', '%d') ); // 同时更新访客统计表 self::update_visitor_stats($visitor_id); } // 获取或创建访客ID private static function get_visitor_id() { $visitor_id = isset($_COOKIE['mdfa_visitor_id']) ? sanitize_text_field($_COOKIE['mdfa_visitor_id']) : wp_generate_uuid4(); // 设置30天有效的cookie setcookie('mdfa_visitor_id', $visitor_id, time() + (30 * DAY_IN_SECONDS), '/'); return $visitor_id; } // 更新访客统计 private static function update_visitor_stats($visitor_id) { global $wpdb; $table_name = $wpdb->prefix . 'mdfa_visitor_stats'; $wpdb->insert( $table_name, array( 'visitor_id' => $visitor_id, 'visit_date' => current_time('mysql'), 'ip_address' => self::get_client_ip(), 'user_agent' => isset($_SERVER['HTTP_USER_AGENT']) ? substr($_SERVER['HTTP_USER_AGENT'], 0, 255) : '' ), array('%s', '%s', '%s', '%s') ); } // 获取客户端IP private static function get_client_ip() { $ip_keys = array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR'); foreach ($ip_keys as $key) { if (array_key_exists($key, $_SERVER) === true) { foreach (explode(',', $_SERVER[$key]) as $ip) { $ip = trim($ip); if (filter_var($ip, FILTER_VALIDATE_IP)) { return $ip; } } } } return '0.0.0.0'; } // 创建数据表 private static function create_tables_if_not_exist() { global $wpdb; $charset_collate = $wpdb->get_charset_collate(); // 内容统计表 $content_stats_table = $wpdb->prefix . 'mdfa_content_stats'; $sql = "CREATE TABLE IF NOT EXISTS $content_stats_table ( id bigint(20) NOT NULL AUTO_INCREMENT, content_id bigint(20) NOT NULL, content_title varchar(255) NOT NULL, visitor_id varchar(100) NOT NULL, view_date datetime DEFAULT CURRENT_TIMESTAMP, view_count int(11) DEFAULT 1, PRIMARY KEY (id), KEY content_id (content_id), KEY view_date (view_date) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); // 访客统计表 $visitor_stats_table = $wpdb->prefix . 'mdfa_visitor_stats'; $sql = "CREATE TABLE IF NOT EXISTS $visitor_stats_table ( id bigint(20) NOT NULL AUTO_INCREMENT, visitor_id varchar(100) NOT NULL, visit_date datetime DEFAULT CURRENT_TIMESTAMP, ip_address varchar(45), user_agent varchar(255), PRIMARY KEY (id), KEY visitor_id (visitor_id), KEY visit_date (visit_date) ) $charset_collate;"; dbDelta($sql); } } // 挂钩到WordPress add_action('wp', function() { if (is_single()) { MDFA_Data_Collector::track_page_view(get_the_ID()); } }); ?>
-
- <?php // 数据分析API端点 class MDFA_Analytics_API { // 注册REST API路由 public static function register_routes() { register_rest_route('mdfa/v1', '/content-stats', array( 'methods' => 'GET', 'callback' => array(__CLASS__, 'get_content_stats'), 'permission_callback' => array(__CLASS__, 'check_permissions') )); register_rest_route('mdfa/v1', '/visitor-trends', array( 'methods' => 'GET', 'callback' => array(__CLASS__, 'get_visitor_trends'), 'permission_callback' => array(__CLASS__, 'check_permissions') )); register_rest_route('mdfa/v1', '/real-time-data', array( 'methods' => 'GET', 'callback' => array(__CLASS__, 'get_real_time_data'), 'permission_callback' => array(__CLASS__, 'check_permissions') )); } // 权限检查 public static function check_permissions($request) { return current_user_can('manage_options'); } // 获取内容统计数据 public static function get_content_stats($request) { global $wpdb; $table_name = $wpdb->prefix . 'mdfa_content_stats'; // 获取时间范围参数 $days = $request->get_param('days') ? intval($request->get_param('days')) : 7; $start_date = date('Y-m-d', strtotime("-$days days")); $results = $wpdb->get_results( $wpdb->prepare( "SELECT content_id, content_title, COUNT(DISTINCT visitor_id) as unique_visitors, SUM(view_count) as total_views, DATE(view_date) as view_day FROM $table_name WHERE DATE(view_date) >= %s GROUP BY content_id, DATE(view_date) ORDER BY total_views DESC", $start_date ), ARRAY_A ); return rest_ensure_response($results); } // 获取访客趋势 public static function get_visitor_trends($request) { global $wpdb; $table_name = $wpdb->prefix . 'mdfa_visitor_stats'; $days = $request->get_param('days') ? intval($request->get_param('days')) : 30; $start_date = date('Y-m-d', strtotime("-$days days")); $results = $wpdb->get_results( $wpdb->prepare( "SELECT DATE(visit_date) as visit_day, COUNT(DISTINCT visitor_id) as daily_visitors, COUNT(*) as total_visits, COUNT(DISTINCT ip_address) as unique_ips FROM $table_name WHERE DATE(visit_date) >= %s GROUP BY DATE(visit_date) ORDER BY visit_day ASC", $start_date ), ARRAY_A ); return rest_ensure_response($results); } // 获取实时数据 public static function get_real_time_data($request) { global $wpdb; $content_table = $wpdb->prefix . 'mdfa_content_stats'; $visitor_table = $wpdb->prefix . 'mdfa_visitor_stats'; $current_hour = date('Y-m-d H:00:00', strtotime('-1 hour')); // 过去一小时的活跃访客 $active_visitors = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT visitor_id) FROM $visitor_table WHERE visit_date >= %s", $current_hour ) ); // 当前最受欢迎的内容 $popular_now = $wpdb->get_results( $wpdb->prepare( "SELECT content_title, COUNT(*) as views FROM $content_table WHERE view_date >= %s GROUP BY content_id ORDER BY views DESC LIMIT 5", $current_hour ), ARRAY_A ); $response = array( 'active_visitors' => intval($active_visitors), 'popular_now' => $popular_now, 'timestamp' => current_time('mysql') ); return rest_ensure_response($response); } } // 注册REST API路由 add_action('rest_api_init', array('MDFA_Analytics_API', 'register_routes')); ?>
- // assets/js/admin.js jQuery(document).ready(function($) { // 初始化数据分析面板 function initAnalyticsDashboard() { // 加载访客趋势图表 loadVisitorTrendsChart(); // 加载内容表现表格 loadContentPerformanceTable(); // 加载实时数据 loadRealTimeData(); // 设置自动刷新 setInterval(loadRealTimeData, 60000); // 每分钟刷新一次 } // 加载访客趋势图表 function loadVisitorTrendsChart() { $.ajax({ url: mdfa_data.ajax_url, method: 'GET', data: { action: 'mdfa_get_visitor_trends', days: 30, nonce: mdfa_data.nonce }, success: function(response) { if (response.success) { renderVisitorChart(response.data); } } }); } // 渲染访客图表 function renderVisitorChart(data) { const ctx = document.getElementById('visitorTrendsChart').getContext('2d'); (item => item.visit_day); const visitors = data.map(item => item.daily_visitors); new Chart(ctx, { type: 'line', data: { labels: labels, datasets: [{ label: '每日独立访客', data: visitors, borderColor: 'rgb(75, 192, 192)', backgroundColor: 'rgba(75, 192, 192, 0.2)', tension: 0.4, fill: true }] }, options: { responsive: true, plugins: { title: { display: true, text: '30天访客趋势分析' }, tooltip: { mode: 'index', intersect: false } }, scales: { x: { display: true, title: { display: true, text: '日期' } }, y: { display: true, title: { display: true, text: '访客数' }, beginAtZero: true } } } }); } // 加载内容表现表格 function loadContentPerformanceTable() { $.ajax({ url: mdfa_data.ajax_url, method: 'GET', data: { action: 'mdfa_get_content_stats', days: 7, nonce: mdfa_data.nonce }, success: function(response) { if (response.success) { renderContentTable(response.data); } } }); } // 渲染内容表格 function renderContentTable(data) { const table = $('#contentPerformanceTable'); table.empty(); // 创建表头 const thead = $('<thead>').appendTo(table); const headerRow = $('<tr>').appendTo(thead); ['内容标题', '独立访客', '总浏览量', '日期'].forEach(header => { $('<th>').text(header).appendTo(headerRow); }); // 创建表格内容 const tbody = $('<tbody>').appendTo(table); data.forEach(item => { const row = $('<tr>').appendTo(tbody); $('<td>').text(item.content_title).appendTo(row); $('<td>').text(item.unique_visitors).appendTo(row); $('<td>').text(item.total_views).appendTo(row); $('<td>').text(item.view_day).appendTo(row); }); // 初始化DataTables插件 if ($.fn.DataTable) { table.DataTable({ pageLength: 10, order: [[2, 'desc']], // 按总浏览量降序排列 language: { url: '//cdn.datatables.net/plug-ins/1.13.4/i18n/zh-CN.json' } }); } } // 加载实时数据 function loadRealTimeData() { $.ajax({ url: mdfa_data.ajax_url, method: 'GET', data: { action: 'mdfa_get_realtime_data', nonce: mdfa_data.nonce }, success: function(response) { if (response.success) { updateRealtimeDisplay(response.data); } } }); } // 更新实时数据显示 function updateRealtimeDisplay(data) { $('#activeVisitorsCount').text(data.active_visitors); $('#lastUpdateTime').text(data.timestamp); const popularList = $('#realtimePopularList'); popularList.empty(); data.popular_now.forEach(item => { $('<li>') .addClass('list-group-item d-flex justify-content-between align-items-center') .html(` ${item.content_title} <span class="badge bg-primary rounded-pill">${item.views}次浏览</span> `) .appendTo(popularList); }); } // 初始化面板 if ($('#mdfa-dashboard').length) { initAnalyticsDashboard(); } }); ## 高级功能:柔性数据分析模块 ### 1. 自定义指标计算器 <?php// 自定义指标计算类class MDFA_Metrics_Calculator { // 计算内容参与度指标 public static function calculate_engagement_rate($content_id, $period_days = 7) { global $wpdb; $stats_table = $wpdb->prefix . 'mdfa_content_stats'; $start_date = date('Y-m-d', strtotime("-$period_days days")); // 获取基础数据 $data = $wpdb->get_row( $wpdb->prepare( "SELECT COUNT(DISTINCT visitor_id) as unique_visitors, SUM(view_count) as total_views, COUNT(DISTINCT DATE(view_date)) as active_days FROM $stats_table WHERE content_id = %d AND DATE(view_date) >= %s", $content_id, $start_date ), ARRAY_A ); if (!$data) { return array( 'engagement_rate' => 0, 'metrics' => array() ); } // 计算参与度指标 $unique_visitors = intval($data['unique_visitors']); $total_views = intval($data['total_views']); $active_days = intval($data['active_days']); // 平均访问深度(每次访问的平均浏览量) $avg_views_per_visitor = $unique_visitors > 0 ? round($total_views / $unique_visitors, 2) : 0; // 内容活跃度(活跃天数/总天数) $activity_rate = round(($active_days / $period_days) * 100, 1); // 综合参与度评分(加权计算) $engagement_score = self::calculate_weighted_score(array( 'unique_visitors' => $unique_visitors, 'avg_views_per_visitor' => $avg_views_per_visitor, 'activity_rate' => $activity_rate )); return array( 'engagement_rate' => $engagement_score, 'metrics' => array( 'unique_visitors' => $unique_visitors, 'total_views' => $total_views, 'avg_views_per_visitor' => $avg_views_per_visitor, 'active_days' => $active_days, 'activity_rate' => $activity_rate . '%' ) ); } // 加权评分计算 private static function calculate_weighted_score($metrics) { // 定义权重 $weights = array( 'unique_visitors' => 0.4, // 独立访客权重40% 'avg_views_per_visitor' => 0.3, // 平均访问深度权重30% 'activity_rate' => 0.3 // 活跃度权重30% ); // 归一化处理 $normalized = array(); // 独立访客归一化(假设最大值为1000) $normalized['unique_visitors'] = min($metrics['unique_visitors'] / 1000, 1); // 平均访问深度归一化(假设最大值为5) $normalized['avg_views_per_visitor'] = min($metrics['avg_views_per_visitor'] / 5, 1); // 活跃率已经是百分比,直接转换为小数 $normalized['activity_rate'] = $metrics['activity_rate'] / 100; // 计算加权总分 $total_score = 0; foreach ($weights as $metric => $weight) { $total_score += $normalized[$metric] * $weight; } // 转换为百分制 return round($total_score * 100, 1); } // 预测内容表现 public static function predict_performance($content_id, $historical_days = 30) { global $wpdb; $stats_table = $wpdb->prefix . 'mdfa_content_stats'; $start_date = date('Y-m-d', strtotime("-$historical_days days")); // 获取历史数据 $history = $wpdb->get_results( $wpdb->prepare( "SELECT DATE(view_date) as date, COUNT(DISTINCT visitor_id) as daily_visitors FROM $stats_table WHERE content_id = %d AND DATE(view_date) >= %s GROUP BY DATE(view_date) ORDER BY date ASC", $content_id, $start_date ), ARRAY_A ); if (count($history) < 7) { return array( 'prediction' => '数据不足,无法预测', 'confidence' => 0 ); } // 提取时间序列数据 $dates = array_column($history, 'date'); $visitors = array_column($history, 'daily_visitors'); // 简单线性回归预测(实际应用中可使用更复杂的算法) $prediction = self::linear_regression_predict($visitors); return array( 'prediction' => round($prediction['next_day'], 1), 'trend' => $prediction['trend'] > 0 ? '上升' : '下降', 'confidence' => round($prediction['r_squared'] * 100, 1) . '%', 'historical_data' => $history ); } // 简单线性回归预测 private static function linear_regression_predict($data) { $n = count($data); $x_sum = 0; $y_sum = 0; $xy_sum = 0; $x2_sum = 0; for ($i = 0; $i < $n; $i++) { $x = $i + 1; $y = $data[$i]; $x_sum += $x; $y_sum += $y; $xy_sum += $x * $y; $x2_sum += $x * $x; } // 计算斜率和截距 $slope = ($n * $xy_sum - $x_sum * $y_sum) / ($n * $x2_sum - $x_sum * $x_sum); $intercept = ($y_sum - $slope * $x_sum) / $n; // 预测下一天 $next_day = $slope * ($n + 1) + $intercept; // 计算R平方(拟合优度) $y_mean = $y_sum / $n; $ss_total = 0; $ss_residual = 0; for ($i = 0; $i < $n; $i++) { $x = $i + 1; $y = $data[$i]; $y_pred = $slope * $x + $intercept; $ss_total += pow($y - $y_mean, 2); $ss_residual += pow($y - $y_pred, 2); } $r_squared = 1 - ($ss_residual / $ss_total); return array( 'next_day' => max(0, $next_day), // 确保非负 'trend' => $slope, 'r_squared' => $r_squared ); } }?> ### 2. 数据导出与集成模块 <?php// 数据导出类class MDFA_Data_Exporter { // 导出CSV格式数据 public static function export_to_csv($data_type, $start_date, $end_date) { global $wpdb; switch ($data_type) { case 'content_stats': $table = $wpdb->prefix . 'mdfa_content_stats'; $query = self::build_content_stats_query($table, $start_date, $end_date); break; case 'visitor_stats': $table = $wpdb->prefix . 'mdfa_visitor_stats'; $query = self::build_visitor_stats_query($table, $start_date, $end_date); break; default: return false; } $results = $wpdb->get_results($query, ARRAY_A); if (empty($results)) { return false; } // 生成CSV内容 $csv_content = self::array_to_csv($results); // 设置HTTP头,触发文件下载 header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename="mdfa_export_' . $data_type . '_' . date('Ymd') . '.csv"'); echo $csv_content; exit; } // 构建内容统计查询 private static function build_content_stats_query($table, $start_date, $end_date) { global $wpdb; return $wpdb->prepare( "SELECT content_id, content_title, visitor_id, view_date, view_count FROM $table WHERE DATE(view_date) BETWEEN %s AND %s ORDER BY view_date DESC", $start_date, $end_date ); } // 构建访客统计查询 private static function build_visitor_stats_query($table, $start_date, $end_date) { global $wpdb; return $wpdb->prepare( "SELECT visitor_id, visit_date, ip_address, user_agent FROM $table WHERE DATE(visit_date) BETWEEN %s AND %s ORDER BY visit_date DESC", $start_date, $end_date ); } // 数组转换为CSV格式 private static function array_to_csv($array) { if (empty($array)) { return ''; } ob_start(); // 输出CSV头部 $headers = array_keys($array[0]); echo implode(',', $headers) . "n"; // 输出数据行 foreach ($array as $row) { $escaped_row = array_map(function($value) { // 转义特殊字符 $value = str_replace('"', '""', $value); return '"' . $value . '"'; }, $row); echo implode(',', $escaped_row) . "n"; } return ob_get_clean(); } // 集成到Google Analytics public static function integrate_with_google_analytics($data, $ga_tracking_id) { // 使用Measurement Protocol API发送数据 $ga_url = 'https://www.google-analytics.com/collect'; $payload = array( 'v' => '1', // API版本 'tid' => $ga_tracking_id, // 跟踪ID 'cid' => $data['client_id'], // 客户端ID 't' => 'event', // 事件类型 'ec' => 'media_content', // 事件类别 'ea' => $data['action'], // 事件动作 'el' => $data['label'], // 事件标签 'ev' => $data['value'] // 事件值 ); // 发送请求 $response = wp_remote_post($ga_url, array( 'body' => $payload, 'timeout' => 5 )); return !is_wp_error($response); } // 生成数据报告 public static function generate_report($report_type, $parameters) { $report_data = array(); switch ($report_type) { case 'daily_summary': $report_data = self::generate_daily_summary($parameters); break; case 'content_performance': $report_data = self::generate_content_performance_report($parameters); break; case 'visitor_analysis': $report_data = self::generate_visitor_analysis_report($parameters); break; } // 格式化报告 return self::format_report($report_data, $report_type); } // 生成每日摘要报告 private static function generate_daily_summary($params) { global $wpdb; $date = isset($params['date']) ? $params['date'] : date('Y-m-d'); $content_table = $wpdb->prefix . 'mdfa_content_stats'; $visitor_table = $wpdb->prefix . 'mdfa_visitor_stats'; // 获取每日统计数据 $stats = $wpdb->get_row( $wpdb->prepare( "SELECT (SELECT COUNT(DISTINCT visitor_id) FROM $visitor_table WHERE DATE(visit_date) = %s) as total_visitors, (SELECT COUNT(*) FROM $content_table WHERE DATE(view_date) = %s) as total_views, (SELECT COUNT(DISTINCT content_id) FROM $content_table WHERE DATE(view_date) = %s) as active_content, (SELECT content_title FROM $content_table WHERE DATE(view_date) = %s GROUP BY content_id ORDER BY COUNT(*) DESC LIMIT 1) as top_content", $date, $date, $date, $date ), ARRAY_A ); return array( 'date' => $date, 'stats' => $stats ); } // 格式化报告 private static function format_report($data, $type) { $formats = array( 'daily_summary' => self::format_daily_summary($data), 'content_performance' => self::format_content_performance($data), 'visitor_analysis' => self::format_visitor_analysis($data) );
在当今数字化媒体环境中,网络传媒机构每天产生海量数据——从用户访问行为、内容互动指标到社交媒体传播效果。如何高效分析这些数据,并将其转化为可操作的见解,成为媒体成功的关键。本教程将详细介绍如何通过WordPress插件实现网络传媒数据的柔性分析,帮助您构建灵活、可扩展的数据分析系统。
首先确保您的WordPress网站运行在PHP 7.4或更高版本,并已启用MySQL或MariaDB数据库。
<?php
// 检查PHP版本是否符合要求
if (version_compare(PHP_VERSION, '7.4.0') < 0) {
die('需要PHP 7.4.0或更高版本,当前版本: ' . PHP_VERSION);
}
// 检查必要的WordPress函数是否存在
if (!function_exists('wp_remote_get')) {
die('WordPress环境配置不完整');
}
// 检查数据库连接
global $wpdb;
if (!$wpdb->check_connection()) {
die('数据库连接失败');
}
?>
我们推荐以下插件组合实现数据柔性分析:
- Google Analytics Dashboard for WP (GADWP) - 网站流量分析
- MonsterInsights - 高级分析集成
- WP Statistics - 本地化数据统计
- Data Tables Generator by Supsystic - 数据可视化
- Custom Development Plugin - 自定义数据分析插件
<?php
/**
* 插件名称: Media Data Flex Analyzer
* 描述: 网络传媒数据柔性分析工具
* 版本: 1.0.0
* 作者: 网络传媒技术团队
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 定义插件常量
define('MDFA_VERSION', '1.0.0');
define('MDFA_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('MDFA_PLUGIN_URL', plugin_dir_url(__FILE__));
// 主插件类
class MediaDataFlexAnalyzer {
private static $instance = null;
// 单例模式
public static function get_instance() {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
// 构造函数
private function __construct() {
$this->init_hooks();
}
// 初始化钩子
private function init_hooks() {
add_action('admin_menu', array($this, 'add_admin_menu'));
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
add_action('wp_dashboard_setup', array($this, 'add_dashboard_widget'));
}
// 添加管理菜单
public function add_admin_menu() {
add_menu_page(
'传媒数据分析', // 页面标题
'数据柔性分析', // 菜单标题
'manage_options', // 权限
'media-data-analyzer', // 菜单slug
array($this, 'render_analyzer_page'), // 回调函数
'dashicons-chart-line', // 图标
30 // 位置
);
}
// 渲染分析页面
public function render_analyzer_page() {
?>
<div class="wrap">
<h1>网络传媒数据柔性分析面板</h1>
<div id="mdfa-dashboard">
<!-- 分析面板内容将通过JavaScript动态加载 -->
<div class="mdfa-loading">加载数据分析面板...</div>
</div>
</div>
<?php
}
// 加载管理端脚本和样式
public function enqueue_admin_scripts($hook) {
if ('toplevel_page_media-data-analyzer' !== $hook) {
return;
}
wp_enqueue_style(
'mdfa-admin-style',
MDFA_PLUGIN_URL . 'assets/css/admin.css',
array(),
MDFA_VERSION
);
wp_enqueue_script(
'mdfa-admin-script',
MDFA_PLUGIN_URL . 'assets/js/admin.js',
array('jquery', 'chartjs'),
MDFA_VERSION,
true
);
// 传递数据到JavaScript
wp_localize_script('mdfa-admin-script', 'mdfa_data', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('mdfa_analysis_nonce')
));
}
// 添加仪表板小工具
public function add_dashboard_widget() {
wp_add_dashboard_widget(
'mdfa_dashboard_widget',
'传媒数据概览',
array($this, 'render_dashboard_widget')
);
}
// 渲染仪表板小工具
public function render_dashboard_widget() {
$today_visitors = $this->get_today_visitors();
$popular_content = $this->get_popular_content();
echo '<div class="mdfa-dashboard-widget">';
echo '<h3>今日数据概览</h3>';
echo '<p>访问量: <strong>' . esc_html($today_visitors) . '</strong></p>';
echo '<h4>热门内容</h4>';
echo '<ul>';
foreach ($popular_content as $content) {
echo '<li>' . esc_html($content['title']) . ' (' . esc_html($content['views']) . '次浏览)</li>';
}
echo '</ul>';
echo '</div>';
}
// 获取今日访问量
private function get_today_visitors() {
global $wpdb;
$table_name = $wpdb->prefix . 'mdfa_visitor_stats';
// 如果表不存在,返回0
if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
return 0;
}
$today = date('Y-m-d');
$count = $wpdb->get_var(
$wpdb->prepare(
"SELECT COUNT(DISTINCT visitor_id) FROM $table_name WHERE DATE(visit_date) = %s",
$today
)
);
return $count ? $count : 0;
}
// 获取热门内容
private function get_popular_content() {
global $wpdb;
$table_name = $wpdb->prefix . 'mdfa_content_stats';
// 如果表不存在,返回空数组
if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
return array();
}
$results = $wpdb->get_results(
"SELECT content_id, content_title, view_count
FROM $table_name
ORDER BY view_count DESC
LIMIT 5",
ARRAY_A
);
return $results ? $results : array();
}
}
// 初始化插件
MediaDataFlexAnalyzer::get_instance();
?>
<?php
/**
* 插件名称: Media Data Flex Analyzer
* 描述: 网络传媒数据柔性分析工具
* 版本: 1.0.0
* 作者: 网络传媒技术团队
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 定义插件常量
define('MDFA_VERSION', '1.0.0');
define('MDFA_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('MDFA_PLUGIN_URL', plugin_dir_url(__FILE__));
// 主插件类
class MediaDataFlexAnalyzer {
private static $instance = null;
// 单例模式
public static function get_instance() {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
// 构造函数
private function __construct() {
$this->init_hooks();
}
// 初始化钩子
private function init_hooks() {
add_action('admin_menu', array($this, 'add_admin_menu'));
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
add_action('wp_dashboard_setup', array($this, 'add_dashboard_widget'));
}
// 添加管理菜单
public function add_admin_menu() {
add_menu_page(
'传媒数据分析', // 页面标题
'数据柔性分析', // 菜单标题
'manage_options', // 权限
'media-data-analyzer', // 菜单slug
array($this, 'render_analyzer_page'), // 回调函数
'dashicons-chart-line', // 图标
30 // 位置
);
}
// 渲染分析页面
public function render_analyzer_page() {
?>
<div class="wrap">
<h1>网络传媒数据柔性分析面板</h1>
<div id="mdfa-dashboard">
<!-- 分析面板内容将通过JavaScript动态加载 -->
<div class="mdfa-loading">加载数据分析面板...</div>
</div>
</div>
<?php
}
// 加载管理端脚本和样式
public function enqueue_admin_scripts($hook) {
if ('toplevel_page_media-data-analyzer' !== $hook) {
return;
}
wp_enqueue_style(
'mdfa-admin-style',
MDFA_PLUGIN_URL . 'assets/css/admin.css',
array(),
MDFA_VERSION
);
wp_enqueue_script(
'mdfa-admin-script',
MDFA_PLUGIN_URL . 'assets/js/admin.js',
array('jquery', 'chartjs'),
MDFA_VERSION,
true
);
// 传递数据到JavaScript
wp_localize_script('mdfa-admin-script', 'mdfa_data', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('mdfa_analysis_nonce')
));
}
// 添加仪表板小工具
public function add_dashboard_widget() {
wp_add_dashboard_widget(
'mdfa_dashboard_widget',
'传媒数据概览',
array($this, 'render_dashboard_widget')
);
}
// 渲染仪表板小工具
public function render_dashboard_widget() {
$today_visitors = $this->get_today_visitors();
$popular_content = $this->get_popular_content();
echo '<div class="mdfa-dashboard-widget">';
echo '<h3>今日数据概览</h3>';
echo '<p>访问量: <strong>' . esc_html($today_visitors) . '</strong></p>';
echo '<h4>热门内容</h4>';
echo '<ul>';
foreach ($popular_content as $content) {
echo '<li>' . esc_html($content['title']) . ' (' . esc_html($content['views']) . '次浏览)</li>';
}
echo '</ul>';
echo '</div>';
}
// 获取今日访问量
private function get_today_visitors() {
global $wpdb;
$table_name = $wpdb->prefix . 'mdfa_visitor_stats';
// 如果表不存在,返回0
if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
return 0;
}
$today = date('Y-m-d');
$count = $wpdb->get_var(
$wpdb->prepare(
"SELECT COUNT(DISTINCT visitor_id) FROM $table_name WHERE DATE(visit_date) = %s",
$today
)
);
return $count ? $count : 0;
}
// 获取热门内容
private function get_popular_content() {
global $wpdb;
$table_name = $wpdb->prefix . 'mdfa_content_stats';
// 如果表不存在,返回空数组
if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
return array();
}
$results = $wpdb->get_results(
"SELECT content_id, content_title, view_count
FROM $table_name
ORDER BY view_count DESC
LIMIT 5",
ARRAY_A
);
return $results ? $results : array();
}
}
// 初始化插件
MediaDataFlexAnalyzer::get_instance();
?>
<?php
// 数据收集类
class MDFA_Data_Collector {
// 跟踪页面访问
public static function track_page_view($post_id) {
if (is_admin() || !is_single()) {
return;
}
global $wpdb;
$table_name = $wpdb->prefix . 'mdfa_content_stats';
// 确保表存在
self::create_tables_if_not_exist();
// 获取或创建访客ID
$visitor_id = self::get_visitor_id();
// 记录访问
$wpdb->insert(
$table_name,
array(
'content_id' => $post_id,
'content_title' => get_the_title($post_id),
'visitor_id' => $visitor_id,
'view_date' => current_time('mysql'),
'view_count' => 1
),
array('%d', '%s', '%s', '%s', '%d')
);
// 同时更新访客统计表
self::update_visitor_stats($visitor_id);
}
// 获取或创建访客ID
private static function get_visitor_id() {
$visitor_id = isset($_COOKIE['mdfa_visitor_id']) ?
sanitize_text_field($_COOKIE['mdfa_visitor_id']) :
wp_generate_uuid4();
// 设置30天有效的cookie
setcookie('mdfa_visitor_id', $visitor_id, time() + (30 * DAY_IN_SECONDS), '/');
return $visitor_id;
}
// 更新访客统计
private static function update_visitor_stats($visitor_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'mdfa_visitor_stats';
$wpdb->insert(
$table_name,
array(
'visitor_id' => $visitor_id,
'visit_date' => current_time('mysql'),
'ip_address' => self::get_client_ip(),
'user_agent' => isset($_SERVER['HTTP_USER_AGENT']) ?
substr($_SERVER['HTTP_USER_AGENT'], 0, 255) : ''
),
array('%s', '%s', '%s', '%s')
);
}
// 获取客户端IP
private static function get_client_ip() {
$ip_keys = array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR');
foreach ($ip_keys as $key) {
if (array_key_exists($key, $_SERVER) === true) {
foreach (explode(',', $_SERVER[$key]) as $ip) {
$ip = trim($ip);
if (filter_var($ip, FILTER_VALIDATE_IP)) {
return $ip;
}
}
}
}
return '0.0.0.0';
}
// 创建数据表
private static function create_tables_if_not_exist() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
// 内容统计表
$content_stats_table = $wpdb->prefix . 'mdfa_content_stats';
$sql = "CREATE TABLE IF NOT EXISTS $content_stats_table (
id bigint(20) NOT NULL AUTO_INCREMENT,
content_id bigint(20) NOT NULL,
content_title varchar(255) NOT NULL,
visitor_id varchar(100) NOT NULL,
view_date datetime DEFAULT CURRENT_TIMESTAMP,
view_count int(11) DEFAULT 1,
PRIMARY KEY (id),
KEY content_id (content_id),
KEY view_date (view_date)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
// 访客统计表
$visitor_stats_table = $wpdb->prefix . 'mdfa_visitor_stats';
$sql = "CREATE TABLE IF NOT EXISTS $visitor_stats_table (
id bigint(20) NOT NULL AUTO_INCREMENT,
visitor_id varchar(100) NOT NULL,
visit_date datetime DEFAULT CURRENT_TIMESTAMP,
ip_address varchar(45),
user_agent varchar(255),
PRIMARY KEY (id),
KEY visitor_id (visitor_id),
KEY visit_date (visit_date)
) $charset_collate;";
dbDelta($sql);
}
}
// 挂钩到WordPress
add_action('wp', function() {
if (is_single()) {
MDFA_Data_Collector::track_page_view(get_the_ID());
}
});
?>
<?php
// 数据收集类
class MDFA_Data_Collector {
// 跟踪页面访问
public static function track_page_view($post_id) {
if (is_admin() || !is_single()) {
return;
}
global $wpdb;
$table_name = $wpdb->prefix . 'mdfa_content_stats';
// 确保表存在
self::create_tables_if_not_exist();
// 获取或创建访客ID
$visitor_id = self::get_visitor_id();
// 记录访问
$wpdb->insert(
$table_name,
array(
'content_id' => $post_id,
'content_title' => get_the_title($post_id),
'visitor_id' => $visitor_id,
'view_date' => current_time('mysql'),
'view_count' => 1
),
array('%d', '%s', '%s', '%s', '%d')
);
// 同时更新访客统计表
self::update_visitor_stats($visitor_id);
}
// 获取或创建访客ID
private static function get_visitor_id() {
$visitor_id = isset($_COOKIE['mdfa_visitor_id']) ?
sanitize_text_field($_COOKIE['mdfa_visitor_id']) :
wp_generate_uuid4();
// 设置30天有效的cookie
setcookie('mdfa_visitor_id', $visitor_id, time() + (30 * DAY_IN_SECONDS), '/');
return $visitor_id;
}
// 更新访客统计
private static function update_visitor_stats($visitor_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'mdfa_visitor_stats';
$wpdb->insert(
$table_name,
array(
'visitor_id' => $visitor_id,
'visit_date' => current_time('mysql'),
'ip_address' => self::get_client_ip(),
'user_agent' => isset($_SERVER['HTTP_USER_AGENT']) ?
substr($_SERVER['HTTP_USER_AGENT'], 0, 255) : ''
),
array('%s', '%s', '%s', '%s')
);
}
// 获取客户端IP
private static function get_client_ip() {
$ip_keys = array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR');
foreach ($ip_keys as $key) {
if (array_key_exists($key, $_SERVER) === true) {
foreach (explode(',', $_SERVER[$key]) as $ip) {
$ip = trim($ip);
if (filter_var($ip, FILTER_VALIDATE_IP)) {
return $ip;
}
}
}
}
return '0.0.0.0';
}
// 创建数据表
private static function create_tables_if_not_exist() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
// 内容统计表
$content_stats_table = $wpdb->prefix . 'mdfa_content_stats';
$sql = "CREATE TABLE IF NOT EXISTS $content_stats_table (
id bigint(20) NOT NULL AUTO_INCREMENT,
content_id bigint(20) NOT NULL,
content_title varchar(255) NOT NULL,
visitor_id varchar(100) NOT NULL,
view_date datetime DEFAULT CURRENT_TIMESTAMP,
view_count int(11) DEFAULT 1,
PRIMARY KEY (id),
KEY content_id (content_id),
KEY view_date (view_date)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
// 访客统计表
$visitor_stats_table = $wpdb->prefix . 'mdfa_visitor_stats';
$sql = "CREATE TABLE IF NOT EXISTS $visitor_stats_table (
id bigint(20) NOT NULL AUTO_INCREMENT,
visitor_id varchar(100) NOT NULL,
visit_date datetime DEFAULT CURRENT_TIMESTAMP,
ip_address varchar(45),
user_agent varchar(255),
PRIMARY KEY (id),
KEY visitor_id (visitor_id),
KEY visit_date (visit_date)
) $charset_collate;";
dbDelta($sql);
}
}
// 挂钩到WordPress
add_action('wp', function() {
if (is_single()) {
MDFA_Data_Collector::track_page_view(get_the_ID());
}
});
?>
<?php
// 数据分析API端点
class MDFA_Analytics_API {
// 注册REST API路由
public static function register_routes() {
register_rest_route('mdfa/v1', '/content-stats', array(
'methods' => 'GET',
'callback' => array(__CLASS__, 'get_content_stats'),
'permission_callback' => array(__CLASS__, 'check_permissions')
));
register_rest_route('mdfa/v1', '/visitor-trends', array(
'methods' => 'GET',
'callback' => array(__CLASS__, 'get_visitor_trends'),
'permission_callback' => array(__CLASS__, 'check_permissions')
));
register_rest_route('mdfa/v1', '/real-time-data', array(
'methods' => 'GET',
'callback' => array(__CLASS__, 'get_real_time_data'),
'permission_callback' => array(__CLASS__, 'check_permissions')
));
}
// 权限检查
public static function check_permissions($request) {
return current_user_can('manage_options');
}
// 获取内容统计数据
public static function get_content_stats($request) {
global $wpdb;
$table_name = $wpdb->prefix . 'mdfa_content_stats';
// 获取时间范围参数
$days = $request->get_param('days') ? intval($request->get_param('days')) : 7;
$start_date = date('Y-m-d', strtotime("-$days days"));
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT
content_id,
content_title,
COUNT(DISTINCT visitor_id) as unique_visitors,
SUM(view_count) as total_views,
DATE(view_date) as view_day
FROM $table_name
WHERE DATE(view_date) >= %s
GROUP BY content_id, DATE(view_date)
ORDER BY total_views DESC",
$start_date
),
ARRAY_A
);
return rest_ensure_response($results);
}
// 获取访客趋势
public static function get_visitor_trends($request) {
global $wpdb;
$table_name = $wpdb->prefix . 'mdfa_visitor_stats';
$days = $request->get_param('days') ? intval($request->get_param('days')) : 30;
$start_date = date('Y-m-d', strtotime("-$days days"));
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT
DATE(visit_date) as visit_day,
COUNT(DISTINCT visitor_id) as daily_visitors,
COUNT(*) as total_visits,
COUNT(DISTINCT ip_address) as unique_ips
FROM $table_name
WHERE DATE(visit_date) >= %s
GROUP BY DATE(visit_date)
ORDER BY visit_day ASC",
$start_date
),
ARRAY_A
);
return rest_ensure_response($results);
}
// 获取实时数据
public static function get_real_time_data($request) {
global $wpdb;
$content_table = $wpdb->prefix . 'mdfa_content_stats';
$visitor_table = $wpdb->prefix . 'mdfa_visitor_stats';
$current_hour = date('Y-m-d H:00:00', strtotime('-1 hour'));
// 过去一小时的活跃访客
$active_visitors = $wpdb->get_var(
$wpdb->prepare(
"SELECT COUNT(DISTINCT visitor_id)
FROM $visitor_table
WHERE visit_date >= %s",
$current_hour
)
);
// 当前最受欢迎的内容
$popular_now = $wpdb->get_results(
$wpdb->prepare(
"SELECT content_title, COUNT(*) as views
FROM $content_table
WHERE view_date >= %s
GROUP BY content_id
ORDER BY views DESC
LIMIT 5",
$current_hour
),
ARRAY_A
);
$response = array(
'active_visitors' => intval($active_visitors),
'popular_now' => $popular_now,
'timestamp' => current_time('mysql')
);
return rest_ensure_response($response);
}
}
// 注册REST API路由
add_action('rest_api_init', array('MDFA_Analytics_API', 'register_routes'));
?>
<?php
// 数据分析API端点
class MDFA_Analytics_API {
// 注册REST API路由
public static function register_routes() {
register_rest_route('mdfa/v1', '/content-stats', array(
'methods' => 'GET',
'callback' => array(__CLASS__, 'get_content_stats'),
'permission_callback' => array(__CLASS__, 'check_permissions')
));
register_rest_route('mdfa/v1', '/visitor-trends', array(
'methods' => 'GET',
'callback' => array(__CLASS__, 'get_visitor_trends'),
'permission_callback' => array(__CLASS__, 'check_permissions')
));
register_rest_route('mdfa/v1', '/real-time-data', array(
'methods' => 'GET',
'callback' => array(__CLASS__, 'get_real_time_data'),
'permission_callback' => array(__CLASS__, 'check_permissions')
));
}
// 权限检查
public static function check_permissions($request) {
return current_user_can('manage_options');
}
// 获取内容统计数据
public static function get_content_stats($request) {
global $wpdb;
$table_name = $wpdb->prefix . 'mdfa_content_stats';
// 获取时间范围参数
$days = $request->get_param('days') ? intval($request->get_param('days')) : 7;
$start_date = date('Y-m-d', strtotime("-$days days"));
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT
content_id,
content_title,
COUNT(DISTINCT visitor_id) as unique_visitors,
SUM(view_count) as total_views,
DATE(view_date) as view_day
FROM $table_name
WHERE DATE(view_date) >= %s
GROUP BY content_id, DATE(view_date)
ORDER BY total_views DESC",
$start_date
),
ARRAY_A
);
return rest_ensure_response($results);
}
// 获取访客趋势
public static function get_visitor_trends($request) {
global $wpdb;
$table_name = $wpdb->prefix . 'mdfa_visitor_stats';
$days = $request->get_param('days') ? intval($request->get_param('days')) : 30;
$start_date = date('Y-m-d', strtotime("-$days days"));
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT
DATE(visit_date) as visit_day,
COUNT(DISTINCT visitor_id) as daily_visitors,
COUNT(*) as total_visits,
COUNT(DISTINCT ip_address) as unique_ips
FROM $table_name
WHERE DATE(visit_date) >= %s
GROUP BY DATE(visit_date)
ORDER BY visit_day ASC",
$start_date
),
ARRAY_A
);
return rest_ensure_response($results);
}
// 获取实时数据
public static function get_real_time_data($request) {
global $wpdb;
$content_table = $wpdb->prefix . 'mdfa_content_stats';
$visitor_table = $wpdb->prefix . 'mdfa_visitor_stats';
$current_hour = date('Y-m-d H:00:00', strtotime('-1 hour'));
// 过去一小时的活跃访客
$active_visitors = $wpdb->get_var(
$wpdb->prepare(
"SELECT COUNT(DISTINCT visitor_id)
FROM $visitor_table
WHERE visit_date >= %s",
$current_hour
)
);
// 当前最受欢迎的内容
$popular_now = $wpdb->get_results(
$wpdb->prepare(
"SELECT content_title, COUNT(*) as views
FROM $content_table
WHERE view_date >= %s
GROUP BY content_id
ORDER BY views DESC
LIMIT 5",
$current_hour
),
ARRAY_A
);
$response = array(
'active_visitors' => intval($active_visitors),
'popular_now' => $popular_now,
'timestamp' => current_time('mysql')
);
return rest_ensure_response($response);
}
}
// 注册REST API路由
add_action('rest_api_init', array('MDFA_Analytics_API', 'register_routes'));
?>
// assets/js/admin.js
jQuery(document).ready(function($) {
// 初始化数据分析面板
function initAnalyticsDashboard() {
// 加载访客趋势图表
loadVisitorTrendsChart();
// 加载内容表现表格
loadContentPerformanceTable();
// 加载实时数据
loadRealTimeData();
// 设置自动刷新
setInterval(loadRealTimeData, 60000); // 每分钟刷新一次
}
// 加载访客趋势图表
function loadVisitorTrendsChart() {
$.ajax({
url: mdfa_data.ajax_url,
method: 'GET',
data: {
action: 'mdfa_get_visitor_trends',
days: 30,
nonce: mdfa_data.nonce
},
success: function(response) {
if (response.success) {
renderVisitorChart(response.data);
}
}
});
}
// 渲染访客图表
function renderVisitorChart(data) {
const ctx = document.getElementById('visitorTrendsChart').getContext('2d');
// assets/js/admin.js
jQuery(document).ready(function($) {
// 初始化数据分析面板
function initAnalyticsDashboard() {
// 加载访客趋势图表
loadVisitorTrendsChart();
// 加载内容表现表格
loadContentPerformanceTable();
// 加载实时数据
loadRealTimeData();
// 设置自动刷新
setInterval(loadRealTimeData, 60000); // 每分钟刷新一次
}
// 加载访客趋势图表
function loadVisitorTrendsChart() {
$.ajax({
url: mdfa_data.ajax_url,
method: 'GET',
data: {
action: 'mdfa_get_visitor_trends',
days: 30,
nonce: mdfa_data.nonce
},
success: function(response) {
if (response.success) {
renderVisitorChart(response.data);
}
}
});
}
// 渲染访客图表
function renderVisitorChart(data) {
const ctx = document.getElementById('visitorTrendsChart').getContext('2d');
(item => item.visit_day);
const visitors = data.map(item => item.daily_visitors);
new Chart(ctx, {
type: 'line',
data: {
labels: labels,
datasets: [{
label: '每日独立访客',
data: visitors,
borderColor: 'rgb(75, 192, 192)',
backgroundColor: 'rgba(75, 192, 192, 0.2)',
tension: 0.4,
fill: true
}]
},
options: {
responsive: true,
plugins: {
title: {
display: true,
text: '30天访客趋势分析'
},
tooltip: {
mode: 'index',
intersect: false
}
},
scales: {
x: {
display: true,
title: {
display: true,
text: '日期'
}
},
y: {
display: true,
title: {
display: true,
text: '访客数'
},
beginAtZero: true
}
}
}
});
}
// 加载内容表现表格
function loadContentPerformanceTable() {
$.ajax({
url: mdfa_data.ajax_url,
method: 'GET',
data: {
action: 'mdfa_get_content_stats',
days: 7,
nonce: mdfa_data.nonce
},
success: function(response) {
if (response.success) {
renderContentTable(response.data);
}
}
});
}
// 渲染内容表格
function renderContentTable(data) {
const table = $('#contentPerformanceTable');
table.empty();
// 创建表头
const thead = $('<thead>').appendTo(table);
const headerRow = $('<tr>').appendTo(thead);
['内容标题', '独立访客', '总浏览量', '日期'].forEach(header => {
$('<th>').text(header).appendTo(headerRow);
});
// 创建表格内容
const tbody = $('<tbody>').appendTo(table);
data.forEach(item => {
const row = $('<tr>').appendTo(tbody);
$('<td>').text(item.content_title).appendTo(row);
$('<td>').text(item.unique_visitors).appendTo(row);
$('<td>').text(item.total_views).appendTo(row);
$('<td>').text(item.view_day).appendTo(row);
});
// 初始化DataTables插件
if ($.fn.DataTable) {
table.DataTable({
pageLength: 10,
order: [[2, 'desc']], // 按总浏览量降序排列
language: {
url: '//cdn.datatables.net/plug-ins/1.13.4/i18n/zh-CN.json'
}
});
}
}
// 加载实时数据
function loadRealTimeData() {
$.ajax({
url: mdfa_data.ajax_url,
method: 'GET',
data: {
action: 'mdfa_get_realtime_data',
nonce: mdfa_data.nonce
},
success: function(response) {
if (response.success) {
updateRealtimeDisplay(response.data);
}
}
});
}
// 更新实时数据显示
function updateRealtimeDisplay(data) {
$('#activeVisitorsCount').text(data.active_visitors);
$('#lastUpdateTime').text(data.timestamp);
const popularList = $('#realtimePopularList');
popularList.empty();
data.popular_now.forEach(item => {
$('<li>')
.addClass('list-group-item d-flex justify-content-between align-items-center')
.html(`
${item.content_title}
<span class="badge bg-primary rounded-pill">${item.views}次浏览</span>
`)
.appendTo(popularList);
});
}
// 初始化面板
if ($('#mdfa-dashboard').length) {
initAnalyticsDashboard();
}
});
## 高级功能:柔性数据分析模块
### 1. 自定义指标计算器
<?php
// 自定义指标计算类
class MDFA_Metrics_Calculator {
// 计算内容参与度指标
public static function calculate_engagement_rate($content_id, $period_days = 7) {
global $wpdb;
$stats_table = $wpdb->prefix . 'mdfa_content_stats';
$start_date = date('Y-m-d', strtotime("-$period_days days"));
// 获取基础数据
$data = $wpdb->get_row(
$wpdb->prepare(
"SELECT
COUNT(DISTINCT visitor_id) as unique_visitors,
SUM(view_count) as total_views,
COUNT(DISTINCT DATE(view_date)) as active_days
FROM $stats_table
WHERE content_id = %d
AND DATE(view_date) >= %s",
$content_id,
$start_date
),
ARRAY_A
);
if (!$data) {
return array(
'engagement_rate' => 0,
'metrics' => array()
);
}
// 计算参与度指标
$unique_visitors = intval($data['unique_visitors']);
$total_views = intval($data['total_views']);
$active_days = intval($data['active_days']);
// 平均访问深度(每次访问的平均浏览量)
$avg_views_per_visitor = $unique_visitors > 0 ?
round($total_views / $unique_visitors, 2) : 0;
// 内容活跃度(活跃天数/总天数)
$activity_rate = round(($active_days / $period_days) * 100, 1);
// 综合参与度评分(加权计算)
$engagement_score = self::calculate_weighted_score(array(
'unique_visitors' => $unique_visitors,
'avg_views_per_visitor' => $avg_views_per_visitor,
'activity_rate' => $activity_rate
));
return array(
'engagement_rate' => $engagement_score,
'metrics' => array(
'unique_visitors' => $unique_visitors,
'total_views' => $total_views,
'avg_views_per_visitor' => $avg_views_per_visitor,
'active_days' => $active_days,
'activity_rate' => $activity_rate . '%'
)
);
}
// 加权评分计算
private static function calculate_weighted_score($metrics) {
// 定义权重
$weights = array(
'unique_visitors' => 0.4, // 独立访客权重40%
'avg_views_per_visitor' => 0.3, // 平均访问深度权重30%
'activity_rate' => 0.3 // 活跃度权重30%
);
// 归一化处理
$normalized = array();
// 独立访客归一化(假设最大值为1000)
$normalized['unique_visitors'] = min($metrics['unique_visitors'] / 1000, 1);
// 平均访问深度归一化(假设最大值为5)
$normalized['avg_views_per_visitor'] = min($metrics['avg_views_per_visitor'] / 5, 1);
// 活跃率已经是百分比,直接转换为小数
$normalized['activity_rate'] = $metrics['activity_rate'] / 100;
// 计算加权总分
$total_score = 0;
foreach ($weights as $metric => $weight) {
$total_score += $normalized[$metric] * $weight;
}
// 转换为百分制
return round($total_score * 100, 1);
}
// 预测内容表现
public static function predict_performance($content_id, $historical_days = 30) {
global $wpdb;
$stats_table = $wpdb->prefix . 'mdfa_content_stats';
$start_date = date('Y-m-d', strtotime("-$historical_days days"));
// 获取历史数据
$history = $wpdb->get_results(
$wpdb->prepare(
"SELECT
DATE(view_date) as date,
COUNT(DISTINCT visitor_id) as daily_visitors
FROM $stats_table
WHERE content_id = %d
AND DATE(view_date) >= %s
GROUP BY DATE(view_date)
ORDER BY date ASC",
$content_id,
$start_date
),
ARRAY_A
);
if (count($history) < 7) {
return array(
'prediction' => '数据不足,无法预测',
'confidence' => 0
);
}
// 提取时间序列数据
$dates = array_column($history, 'date');
$visitors = array_column($history, 'daily_visitors');
// 简单线性回归预测(实际应用中可使用更复杂的算法)
$prediction = self::linear_regression_predict($visitors);
return array(
'prediction' => round($prediction['next_day'], 1),
'trend' => $prediction['trend'] > 0 ? '上升' : '下降',
'confidence' => round($prediction['r_squared'] * 100, 1) . '%',
'historical_data' => $history
);
}
// 简单线性回归预测
private static function linear_regression_predict($data) {
$n = count($data);
$x_sum = 0;
$y_sum = 0;
$xy_sum = 0;
$x2_sum = 0;
for ($i = 0; $i < $n; $i++) {
$x = $i + 1;
$y = $data[$i];
$x_sum += $x;
$y_sum += $y;
$xy_sum += $x * $y;
$x2_sum += $x * $x;
}
// 计算斜率和截距
$slope = ($n * $xy_sum - $x_sum * $y_sum) / ($n * $x2_sum - $x_sum * $x_sum);
$intercept = ($y_sum - $slope * $x_sum) / $n;
// 预测下一天
$next_day = $slope * ($n + 1) + $intercept;
// 计算R平方(拟合优度)
$y_mean = $y_sum / $n;
$ss_total = 0;
$ss_residual = 0;
for ($i = 0; $i < $n; $i++) {
$x = $i + 1;
$y = $data[$i];
$y_pred = $slope * $x + $intercept;
$ss_total += pow($y - $y_mean, 2);
$ss_residual += pow($y - $y_pred, 2);
}
$r_squared = 1 - ($ss_residual / $ss_total);
return array(
'next_day' => max(0, $next_day), // 确保非负
'trend' => $slope,
'r_squared' => $r_squared
);
}
}
?>
### 2. 数据导出与集成模块
<?php
// 数据导出类
class MDFA_Data_Exporter {
// 导出CSV格式数据
public static function export_to_csv($data_type, $start_date, $end_date) {
global $wpdb;
switch ($data_type) {
case 'content_stats':
$table = $wpdb->prefix . 'mdfa_content_stats';
$query = self::build_content_stats_query($table, $start_date, $end_date);
break;
case 'visitor_stats':
$table = $wpdb->prefix . 'mdfa_visitor_stats';
$query = self::build_visitor_stats_query($table, $start_date, $end_date);
break;
default:
return false;
}
$results = $wpdb->get_results($query, ARRAY_A);
if (empty($results)) {
return false;
}
// 生成CSV内容
$csv_content = self::array_to_csv($results);
// 设置HTTP头,触发文件下载
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="mdfa_export_' . $data_type . '_' . date('Ymd') . '.csv"');
echo $csv_content;
exit;
}
// 构建内容统计查询
private static function build_content_stats_query($table, $start_date, $end_date) {
global $wpdb;
return $wpdb->prepare(
"SELECT
content_id,
content_title,
visitor_id,
view_date,
view_count
FROM $table
WHERE DATE(view_date) BETWEEN %s AND %s
ORDER BY view_date DESC",
$start_date,
$end_date
);
}
// 构建访客统计查询
private static function build_visitor_stats_query($table, $start_date, $end_date) {
global $wpdb;
return $wpdb->prepare(
"SELECT
visitor_id,
visit_date,
ip_address,
user_agent
FROM $table
WHERE DATE(visit_date) BETWEEN %s AND %s
ORDER BY visit_date DESC",
$start_date,
$end_date
);
}
// 数组转换为CSV格式
private static function array_to_csv($array) {
if (empty($array)) {
return '';
}
ob_start();
// 输出CSV头部
$headers = array_keys($array[0]);
echo implode(',', $headers) . "n";
// 输出数据行
foreach ($array as $row) {
$escaped_row = array_map(function($value) {
// 转义特殊字符
$value = str_replace('"', '""', $value);
return '"' . $value . '"';
}, $row);
echo implode(',', $escaped_row) . "n";
}
return ob_get_clean();
}
// 集成到Google Analytics
public static function integrate_with_google_analytics($data, $ga_tracking_id) {
// 使用Measurement Protocol API发送数据
$ga_url = 'https://www.google-analytics.com/collect';
$payload = array(
'v' => '1', // API版本
'tid' => $ga_tracking_id, // 跟踪ID
'cid' => $data['client_id'], // 客户端ID
't' => 'event', // 事件类型
'ec' => 'media_content', // 事件类别
'ea' => $data['action'], // 事件动作
'el' => $data['label'], // 事件标签
'ev' => $data['value'] // 事件值
);
// 发送请求
$response = wp_remote_post($ga_url, array(
'body' => $payload,
'timeout' => 5
));
return !is_wp_error($response);
}
// 生成数据报告
public static function generate_report($report_type, $parameters) {
$report_data = array();
switch ($report_type) {
case 'daily_summary':
$report_data = self::generate_daily_summary($parameters);
break;
case 'content_performance':
$report_data = self::generate_content_performance_report($parameters);
break;
case 'visitor_analysis':
$report_data = self::generate_visitor_analysis_report($parameters);
break;
}
// 格式化报告
return self::format_report($report_data, $report_type);
}
// 生成每日摘要报告
private static function generate_daily_summary($params) {
global $wpdb;
$date = isset($params['date']) ? $params['date'] : date('Y-m-d');
$content_table = $wpdb->prefix . 'mdfa_content_stats';
$visitor_table = $wpdb->prefix . 'mdfa_visitor_stats';
// 获取每日统计数据
$stats = $wpdb->get_row(
$wpdb->prepare(
"SELECT
(SELECT COUNT(DISTINCT visitor_id)
FROM $visitor_table
WHERE DATE(visit_date) = %s) as total_visitors,
(SELECT COUNT(*)
FROM $content_table
WHERE DATE(view_date) = %s) as total_views,
(SELECT COUNT(DISTINCT content_id)
FROM $content_table
WHERE DATE(view_date) = %s) as active_content,
(SELECT content_title
FROM $content_table
WHERE DATE(view_date) = %s
GROUP BY content_id
ORDER BY COUNT(*) DESC
LIMIT 1) as top_content",
$date, $date, $date, $date
),
ARRAY_A
);
return array(
'date' => $date,
'stats' => $stats
);
}
// 格式化报告
private static function format_report($data, $type) {
$formats = array(
'daily_summary' => self::format_daily_summary($data),
'content_performance' => self::format_content_performance($data),
'visitor_analysis' => self::format_visitor_analysis($data)
);


