文章目录[隐藏]
网络传媒柔性内容多渠道效果分析WordPress插件教程
引言:柔性内容多渠道分析的重要性
在当今数字化媒体环境中,网络传媒机构面临着内容分发渠道多样化、受众碎片化的挑战。柔性内容——即能够适应不同平台格式和用户偏好的可调整内容——已成为提高传播效果的关键策略。然而,要真正优化内容策略,我们需要数据驱动的洞察力来了解不同渠道的表现差异。
本教程将指导您创建一个功能完整的WordPress插件,用于分析柔性内容在多个渠道(如网站、社交媒体、邮件营销等)的表现效果,并通过可视化仪表板展示关键指标。
插件功能规划
我们的插件将具备以下核心功能:
- 多渠道数据采集与整合
- 内容效果指标计算与分析
- 可视化数据仪表板
- 自定义报告生成
- 渠道效果对比分析
环境准备与插件基础结构
首先,我们需要创建插件的基本文件结构。在WordPress的wp-content/plugins/目录下创建新文件夹flexible-content-analytics,并创建以下文件:
<?php
/**
* Plugin Name: 柔性内容多渠道效果分析
* Plugin URI: https://yourwebsite.com/
* Description: 分析柔性内容在多个渠道的表现效果
* Version: 1.0.0
* Author: 您的名称
* License: GPL v2 or later
* Text Domain: flexible-content-analytics
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 定义插件常量
define('FCA_PLUGIN_PATH', plugin_dir_path(__FILE__));
define('FCA_PLUGIN_URL', plugin_dir_url(__FILE__));
define('FCA_VERSION', '1.0.0');
// 初始化插件
require_once FCA_PLUGIN_PATH . 'includes/class-core.php';
require_once FCA_PLUGIN_PATH . 'includes/class-database.php';
require_once FCA_PLUGIN_PATH . 'includes/class-analytics.php';
require_once FCA_PLUGIN_PATH . 'includes/class-dashboard.php';
// 激活和停用钩子
register_activation_hook(__FILE__, array('FCA_Database', 'create_tables'));
register_deactivation_hook(__FILE__, array('FCA_Database', 'cleanup'));
// 初始化主类
function fca_init() {
$plugin = FCA_Core::get_instance();
return $plugin;
}
add_action('plugins_loaded', 'fca_init');
数据库设计与实现
接下来,我们创建数据库表来存储多渠道分析数据。在includes/class-database.php中:
<?php
/**
* 数据库处理类
* 负责创建和管理插件所需的数据库表
*/
class FCA_Database {
/**
* 创建插件所需的数据库表
*/
public static function create_tables() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
$table_name = $wpdb->prefix . 'fca_content_performance';
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id bigint(20) NOT NULL AUTO_INCREMENT,
content_id bigint(20) NOT NULL,
channel varchar(50) NOT NULL,
publish_date datetime NOT NULL,
views int(11) DEFAULT 0,
engagements int(11) DEFAULT 0,
conversions int(11) DEFAULT 0,
avg_time_spent float DEFAULT 0,
bounce_rate float DEFAULT 0,
social_shares int(11) DEFAULT 0,
collected_date date NOT NULL,
PRIMARY KEY (id),
KEY content_id (content_id),
KEY channel (channel),
KEY collected_date (collected_date)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
// 创建渠道定义表
$channels_table = $wpdb->prefix . 'fca_channels';
$sql2 = "CREATE TABLE IF NOT EXISTS $channels_table (
id bigint(20) NOT NULL AUTO_INCREMENT,
channel_name varchar(100) NOT NULL,
channel_type varchar(50) NOT NULL,
is_active tinyint(1) DEFAULT 1,
api_config text,
PRIMARY KEY (id)
) $charset_collate;";
dbDelta($sql2);
// 插入默认渠道数据
self::insert_default_channels();
}
/**
* 插入默认渠道数据
*/
private static function insert_default_channels() {
global $wpdb;
$channels = array(
array('website', '自有平台', 1, ''),
array('facebook', '社交媒体', 1, ''),
array('twitter', '社交媒体', 1, ''),
array('linkedin', '社交媒体', 1, ''),
array('email', '邮件营销', 1, ''),
array('wechat', '社交媒体', 1, ''),
array('weibo', '社交媒体', 1, '')
);
$table_name = $wpdb->prefix . 'fca_channels';
foreach ($channels as $channel) {
$wpdb->replace(
$table_name,
array(
'channel_name' => $channel[0],
'channel_type' => $channel[1],
'is_active' => $channel[2],
'api_config' => $channel[3]
)
);
}
}
/**
* 清理插件数据(停用时)
*/
public static function cleanup() {
// 可根据需要决定是否删除数据表
// 实际应用中通常保留数据
}
}
数据分析核心功能
现在创建数据分析类,在includes/class-analytics.php中:
<?php
/**
* 数据分析类
* 负责计算和分析多渠道内容效果
*/
class FCA_Analytics {
private $db;
public function __construct() {
global $wpdb;
$this->db = $wpdb;
}
/**
* 计算内容在指定渠道的效果得分
* @param int $content_id 内容ID
* @param string $channel 渠道名称
* @param string $period 时间周期(7d, 30d, 90d)
* @return array 效果指标
*/
public function calculate_channel_performance($content_id, $channel, $period = '30d') {
$table_name = $this->db->prefix . 'fca_content_performance';
// 根据周期计算日期范围
$date_condition = $this->get_date_condition($period);
$query = $this->db->prepare(
"SELECT
SUM(views) as total_views,
SUM(engagements) as total_engagements,
SUM(conversions) as total_conversions,
AVG(avg_time_spent) as avg_time,
AVG(bounce_rate) as avg_bounce_rate,
SUM(social_shares) as total_shares
FROM $table_name
WHERE content_id = %d
AND channel = %s
AND $date_condition",
$content_id,
$channel
);
$results = $this->db->get_row($query, ARRAY_A);
if (!$results) {
return array(
'total_views' => 0,
'total_engagements' => 0,
'total_conversions' => 0,
'avg_time' => 0,
'avg_bounce_rate' => 0,
'total_shares' => 0,
'performance_score' => 0
);
}
// 计算综合效果得分(自定义算法)
$performance_score = $this->calculate_performance_score($results);
$results['performance_score'] = $performance_score;
return $results;
}
/**
* 计算综合效果得分
* @param array $metrics 各项指标
* @return float 综合得分(0-100)
*/
private function calculate_performance_score($metrics) {
// 权重配置(可根据实际需求调整)
$weights = array(
'views' => 0.2,
'engagements' => 0.25,
'conversions' => 0.3,
'time_spent' => 0.15,
'shares' => 0.1
);
// 标准化各项指标(这里使用简单标准化,实际应用可能需要更复杂的归一化)
$max_values = $this->get_max_metrics_values();
$normalized = array();
$normalized['views'] = min($metrics['total_views'] / max($max_values['views'], 1) * 100, 100);
$normalized['engagements'] = min($metrics['total_engagements'] / max($max_values['engagements'], 1) * 100, 100);
$normalized['conversions'] = min($metrics['total_conversions'] / max($max_values['conversions'], 1) * 100, 100);
$normalized['time_spent'] = min($metrics['avg_time'] / max($max_values['time_spent'], 1) * 100, 100);
$normalized['shares'] = min($metrics['total_shares'] / max($max_values['shares'], 1) * 100, 100);
// 计算加权得分
$score = 0;
foreach ($weights as $metric => $weight) {
$score += $normalized[$metric] * $weight;
}
// 考虑跳出率的负面影响
$bounce_penalty = $metrics['avg_bounce_rate'] * 0.5; // 跳出率惩罚系数
$score = max($score - $bounce_penalty, 0);
return round($score, 2);
}
/**
* 获取所有渠道对比分析
* @param int $content_id 内容ID
* @param string $period 时间周期
* @return array 各渠道表现对比
*/
public function compare_channels_performance($content_id, $period = '30d') {
$channels_table = $this->db->prefix . 'fca_channels';
$performance_table = $this->db->prefix . 'fca_content_performance';
$active_channels = $this->db->get_results(
"SELECT channel_name FROM $channels_table WHERE is_active = 1",
ARRAY_A
);
$comparison = array();
foreach ($active_channels as $channel) {
$channel_name = $channel['channel_name'];
$performance = $this->calculate_channel_performance($content_id, $channel_name, $period);
$comparison[$channel_name] = array(
'performance_score' => $performance['performance_score'],
'views' => $performance['total_views'],
'engagements' => $performance['total_engagements'],
'conversions' => $performance['total_conversions'],
'shares' => $performance['total_shares']
);
}
// 按效果得分排序
uasort($comparison, function($a, $b) {
return $b['performance_score'] <=> $a['performance_score'];
});
return $comparison;
}
/**
* 根据周期获取SQL日期条件
*/
private function get_date_condition($period) {
$days = 30; // 默认30天
if (strpos($period, 'd') !== false) {
$days = intval($period);
} elseif (strpos($period, 'm') !== false) {
$days = intval($period) * 30;
}
$date = date('Y-m-d', strtotime("-$days days"));
return "collected_date >= '$date'";
}
/**
* 获取最大指标值用于标准化
*/
private function get_max_metrics_values() {
// 这里简化处理,实际应用中应从历史数据计算
return array(
'views' => 10000,
'engagements' => 5000,
'conversions' => 1000,
'time_spent' => 600, // 秒
'shares' => 500
);
}
}
可视化仪表板实现
创建仪表板类,在includes/class-dashboard.php中:
<?php
/**
* 仪表板显示类
* 负责生成分析结果的可视化界面
*/
class FCA_Dashboard {
public function __construct() {
add_action('admin_menu', array($this, 'add_admin_menu'));
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
}
/**
* 添加管理菜单
*/
public function add_admin_menu() {
add_menu_page(
'柔性内容分析',
'内容分析',
'manage_options',
'flexible-content-analytics',
array($this, 'render_dashboard'),
'dashicons-chart-line',
30
);
add_submenu_page(
'flexible-content-analytics',
'渠道对比',
'渠道对比',
'manage_options',
'fca-channel-comparison',
array($this, 'render_channel_comparison')
);
add_submenu_page(
'flexible-content-analytics',
'内容报告',
'内容报告',
'manage_options',
'fca-content-reports',
array($this, 'render_content_reports')
);
}
/**
* 渲染主仪表板
*/
public function render_dashboard() {
$analytics = new FCA_Analytics();
// 获取最近发布的内容
$recent_posts = get_posts(array(
'numberposts' => 5,
'post_type' => 'post',
'post_status' => 'publish'
));
echo '<div class="wrap">';
echo '<h1>柔性内容多渠道效果分析</h1>';
echo '<div class="fca-dashboard">';
// 总体概览
echo '<div class="fca-overview">';
echo '<h2>内容表现概览</h2>';
foreach ($recent_posts as $post) {
$comparison = $analytics->compare_channels_performance($post->ID, '7d');
echo '<div class="fca-content-card">';
echo '<h3>' . esc_html($post->post_title) . '</h3>';
if (!empty($comparison)) {
echo '<div class="fca-channels-summary">';
$top_channel = array_key_first($comparison);
$top_score = $comparison[$top_channel]['performance_score'];
echo '<div class="fca-top-channel">';
echo '<strong>最佳渠道:</strong> ' . esc_html($top_channel) .
' (得分: ' . esc_html($top_score) . ')';
echo '</div>';
// 简单条形图表示
echo '<div class="fca-channel-bars">';
foreach ($comparison as $channel => $data) {
$width = min($data['performance_score'] * 2, 100);
echo '<div class="fca-channel-bar">';
echo '<span class="fca-channel-name">' . esc_html($channel) . '</span>';
echo '<div class="fca-bar-container">';
echo '<div class="fca-bar" style="width: ' . esc_attr($width) . '%;"></div>';
echo '<span class="fca-bar-score">' . esc_html($data['performance_score']) . '</span>';
echo '</div>';
echo '</div>';
}
echo '</div>';
echo '</div>';
} else {
echo '<p>暂无数据</p>';
}
echo '</div>';
}
echo '</div>';
echo '</div>';
echo '</div>';
}
/**
* 渲染渠道对比页面
*/
public function render_channel_comparison() {
if (!isset($_GET['content_id']) || empty($_GET['content_id'])) {
echo '<div class="wrap">';
echo '<h1>选择要分析的内容</h1>';
// 显示内容选择列表
$posts = get_posts(array(
'numberposts' => 20,
'post_type' => 'post',
'post_status' => 'publish'
));
echo '<ul>';
foreach ($posts as $post) {
$url = admin_url('admin.php?page=fca-channel-comparison&content_id=' . $post->ID);
echo '<li><a href="' . esc_url($url) . '">' . esc_html($post->post_title) . '</a></li>';
}
echo '</ul>';
echo '</div>';
return;
}
$content_id = intval($_GET['content_id']);
$post = get_post($content_id);
if (!$post) {
echo '<div class="wrap"><p>内容不存在</p></div>';
return;
}
$analytics = new FCA_Analytics();
$comparison = $analytics->compare_channels_performance($content_id, '30d');
echo '<div class="wrap">';
echo '<h1>渠道效果对比: ' . esc_html($post->post_title) . '</h1>';
echo '<div class="fca-comparison-table">';
echo '<table class="wp-list-table widefat fixed striped">';
echo '<thead>';
echo '<tr>';
echo '<th>渠道</th>';
echo '<th>效果得分</th>';
echo '<th>浏览量</th>';
echo '<th>互动数</th>';
echo '<th>转化数</th>';
echo '<th>分享数</th>';
echo '</tr>';
echo '</thead>';
echo '<tbody>';
foreach ($comparison as $channel => $data) {
echo '<tr>';
echo '<td>' . esc_html($channel) . '</td>';
echo '<td>' . esc_html($data['performance_score']) . '</td>';
echo '<td>' . esc_html($data['views']) . '</td>';
echo '<td>' . esc_html($data['engagements']) . '</td>';
echo '<td>' . esc_html($data['conversions']) . '</td>';
echo '<td>' . esc_html($data['shares']) . '</td>';
echo '</tr>';
}
echo '</tbody>';
echo '</table>';
echo '</div>';
// 添加时间周期选择器
echo '<div class="fca-period-selector">';
echo '<h3>选择分析周期</h3>';
echo '<select id="fca-period-select">';
echo '<option value="7d">最近7天</option>';
echo '<option value="30d" selected>最近30天</option>';
echo '<option value="90d">最近90天</option>';
echo '</select>';
echo '<button id="fca-update-chart" class="button button-primary">更新图表</button>';
echo '</div>';
// 图表容器
echo '<div class="fca-chart-container">';
echo '<canvas id="fca-channel-comparison-chart" width="800" height="400"></canvas>';
echo '</div>';
echo '</div>';
// 内联JavaScript用于图表渲染
$this->render_chart_js($comparison);
}
/**
* 渲染图表JavaScript
*/
private function render_chart_js($comparison_data) {
$labels = array_keys($comparison_data);
$scores = array_column($comparison_data, 'performance_score');
$views = array_column($comparison_data, 'views');
?>
<script>
jQuery(document).ready(function($) {
var ctx = document.getElementById('fca-channel-comparison-chart').getContext('2d');
var chartData = {
labels: <?php echo json_encode($labels); ?>,
datasets: [{
label: '效果得分',
data: <?php echo json_encode($scores); ?>,
backgroundColor: 'rgba(54, 162, 235, 0.5)',
borderColor: 'rgba(54, 162, 235, 1)',
borderWidth: 1,
yAxisID: 'y'
}, {
label: '浏览量',
data: <?php echo json_encode($views); ?>,
backgroundColor: 'rgba(255, 99, 132, 0.5)',
borderColor: 'rgba(255, 99, 132, 1)',
borderWidth: 1,
yAxisID: 'y1'
}]
};
var chart = new Chart(ctx, {
type: 'bar',
data: chartData,
options: {
responsive: true,
scales: {
y: {
type: 'linear',
display: true,
position: 'left',
title: {
display: true,
text: '效果得分'
}
},
y1: {
type: 'linear',
display: true,
position: 'right',
title: {
display: true,
text: '浏览量'
},
grid: {
drawOnChartArea: false
}
}
}
}
});
// 更新图表按钮事件
$('#fca-update-chart').on('click', function() {
var period = $('#fca-period-select').val();
var contentId = <?php echo intval($_GET['content_id']); ?>;
$.ajax({
url: ajaxurl,
type: 'POST',
data: {
action: 'fca_update_chart',
content_id: contentId,
period: period,
nonce: '<?php echo wp_create_nonce('fca_ajax_nonce'); ?>'
},
success: function(response) {
if (response.success) {
chart.data.labels = response.data.labels;
chart.data.datasets[0].data = response.data.scores;
chart.data.datasets[1].data = response.data.views;
chart.update();
}
}
});
});
});
</script>
<?php
}
/**
* 渲染内容报告页面
*/
public function render_content_reports() {
echo '<div class="wrap">';
echo '<h1>内容效果报告</h1>';
// 报告生成表单
echo '<div class="fca-report-form">';
echo '<h2>生成自定义报告</h2>';
echo '<form method="post" action="' . admin_url('admin-post.php') . '">';
echo '<input type="hidden" name="action" value="fca_generate_report">';
// 内容选择
echo '<div class="fca-form-group">';
echo '<label for="fca-content-select">选择内容:</label>';
echo '<select id="fca-content-select" name="content_ids[]" multiple style="width: 300px; height: 150px;">';
$posts = get_posts(array(
'numberposts' => -1,
'post_type' => 'post',
'post_status' => 'publish'
));
foreach ($posts as $post) {
echo '<option value="' . esc_attr($post->ID) . '">' . esc_html($post->post_title) . '</option>';
}
echo '</select>';
echo '</div>';
// 渠道选择
echo '<div class="fca-form-group">';
echo '<label>选择渠道:</label><br>';
$channels = array('website', 'facebook', 'twitter', 'linkedin', 'email', 'wechat', 'weibo');
foreach ($channels as $channel) {
echo '<label style="margin-right: 15px;">';
echo '<input type="checkbox" name="channels[]" value="' . esc_attr($channel) . '" checked> ';
echo esc_html($channel);
echo '</label>';
}
echo '</div>';
// 时间范围
echo '<div class="fca-form-group">';
echo '<label for="fca-date-from">时间范围:</label>';
echo '<input type="date" id="fca-date-from" name="date_from" value="' . date('Y-m-d', strtotime('-30 days')) . '">';
echo ' 至 ';
echo '<input type="date" id="fca-date-to" name="date_to" value="' . date('Y-m-d') . '">';
echo '</div>';
// 报告格式
echo '<div class="fca-form-group">';
echo '<label for="fca-report-format">报告格式:</label>';
echo '<select id="fca-report-format" name="report_format">';
echo '<option value="html">HTML网页</option>';
echo '<option value="csv">CSV文件</option>';
echo '<option value="pdf">PDF文档</option>';
echo '</select>';
echo '</div>';
echo '<p>';
echo '<input type="submit" name="generate_report" class="button button-primary" value="生成报告">';
echo '</p>';
echo '</form>';
echo '</div>';
// 历史报告列表
$this->render_report_history();
echo '</div>';
}
/**
* 渲染历史报告列表
*/
private function render_report_history() {
// 这里可以添加从数据库获取历史报告的逻辑
echo '<div class="fca-report-history">';
echo '<h2>历史报告</h2>';
echo '<p>最近生成的报告将显示在这里。</p>';
echo '</div>';
}
/**
* 加载管理端脚本和样式
*/
public function enqueue_admin_scripts($hook) {
if (strpos($hook, 'flexible-content-analytics') === false) {
return;
}
// 加载Chart.js库
wp_enqueue_script(
'chart-js',
'https://cdn.jsdelivr.net/npm/chart.js',
array(),
'3.7.0',
true
);
// 加载自定义样式
wp_enqueue_style(
'fca-admin-style',
FCA_PLUGIN_URL . 'assets/css/admin-style.css',
array(),
FCA_VERSION
);
// 加载自定义脚本
wp_enqueue_script(
'fca-admin-script',
FCA_PLUGIN_URL . 'assets/js/admin-script.js',
array('jquery', 'chart-js'),
FCA_VERSION,
true
);
// 本地化脚本
wp_localize_script('fca-admin-script', 'fca_ajax', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('fca_ajax_nonce')
));
}
}
## 数据采集与API集成
创建数据采集模块,在`includes/class-data-collector.php`中:
<?php
/**
- 数据采集类
- 负责从不同渠道收集内容表现数据
*/
class FCA_Data_Collector {
private $analytics;
public function __construct() {
$this->analytics = new FCA_Analytics();
add_action('fca_daily_data_collection', array($this, 'collect_daily_data'));
}
/**
* 每日数据收集任务
*/
public function collect_daily_data() {
$this->collect_website_data();
$this->collect_social_media_data();
$this->collect_email_data();
}
/**
* 收集网站数据(使用Google Analytics API示例)
*/
private function collect_website_data() {
global $wpdb;
// 这里使用模拟数据,实际应调用Google Analytics API
$posts = get_posts(array(
'numberposts' => 50,
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
'after' => date('Y-m-d', strtotime('-7 days'))
)
));
foreach ($posts as $post) {
// 模拟数据 - 实际应用中应从API获取真实数据
$views = rand(50, 5000);
$engagements = rand(10, 1000);
$conversions = rand(1, 100);
$avg_time = rand(30, 600);
$bounce_rate = rand(20, 80);
$this->save_performance_data(
$post->ID,
'website',
$views,
$engagements,
$conversions,
$avg_time,
$bounce_rate,
0 // 网站数据不包含分享数
);
}
}
/**
* 收集社交媒体数据
*/
private function collect_social_media_data() {
$channels = array('facebook', 'twitter', 'linkedin', 'wechat', 'weibo');
foreach ($channels as $channel) {
// 这里应调用各社交平台的API
// 以下为模拟数据
$posts = get_posts(array(
'numberposts' => 20,
'post_type' => 'post',
'post_status' => 'publish'
));
foreach ($posts as $post) {
$shares = rand(0, 500);
$engagements = rand(0, 1000);
$this->save_performance_data(
$post->ID,
$channel,
0, // 社交媒体不直接提供浏览量
$engagements,
0, // 转化数
0, // 平均时间
0, // 跳出率
$shares
);
}
}
}
/**
* 收集邮件营销数据
*/
private function collect_email_data() {
// 模拟邮件营销数据
$posts = get_posts(array(
'numberposts' => 10,
'post_type' => 'post',
'post_status' => 'publish'
));
foreach ($posts as $post) {
$opens = rand(100, 5000);
$clicks = rand(10, 500);
$conversions = rand(1, 50);
$this->save_performance_data(
$post->ID,
'email',
$opens, // 邮件打开数视为浏览量
$clicks, // 点击数为互动数
$conversions,
0, // 平均时间
0, // 跳出率
0 // 分享数
);
}
}
/**
* 保存性能数据到数据库
*/
private function save_performance_data($content_id, $channel, $views, $engagements,
$conversions, $avg_time, $bounce_rate, $shares) {
global $wpdb;
$table_name = $wpdb->prefix . 'fca_content_performance';
$wpdb->insert(
$table_name,
array(
'content_id' => $content_id,
'channel' => $channel,
'publish_date' => get_the_date('Y-m-d H:i:s', $content_id),
'views' => $views,
'engagements' => $engagements,
'conversions' => $conversions,
'avg_time_spent' => $avg_time,
'bounce_rate' => $bounce_rate,
'social_shares' => $shares,
'collected_date' => date('Y-m-d')
),
array('%d', '%s', '%s', '%d', '%d', '%d', '%f', '%f', '%d', '%s')
);
}
/**
* 手动触发数据收集
*/
public function manual_collect() {
$this->collect_daily_data();
return true;
}
}
## 插件核心类与AJAX处理
最后,创建核心类来整合所有功能,在`includes/class-core.php`中:
<?php
/**
- 插件核心类
- 负责初始化和协调各个模块
*/
class FCA_Core {
private static $instance = null;
private $dashboard;
private $analytics;
private $data_collector;
public static function get_instance() {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct() {
$this->init_hooks();
$this->init_components();
}
/**
* 初始化WordPress钩子
*/
private function init_hooks() {
// 注册AJAX处理
add_action('wp_ajax_fca_update_chart', array($this, 'ajax_update_chart'));
add_action('wp_ajax_fca_generate_report', array($this, 'ajax_generate_report'));
// 注册管理页面
add_action('admin_init', array($this, 'register_settings'));
// 添加文章编辑页面的元框
add_action('add_meta_boxes', array($this, 'add_content_meta_box'));
// 计划每日数据收集任务
if (!wp_next_scheduled('fca_daily_data_collection')) {
wp_schedule_event(time(), 'daily', 'fca_daily_data_collection');
}
}
/**
* 初始化组件
*/
private function init_components() {
$this->dashboard = new FCA_Dashboard();
$this->analytics = new FCA_Analytics();
$this->data_collector = new FCA_Data_Collector();
}
/**
* AJAX更新图表数据
*/
public function ajax_update_chart() {
check_ajax_referer('fca_ajax_nonce', 'nonce');
$content_id = intval($_POST['content_id']);
$period = sanitize_text_field($_POST['period']);
$comparison = $this->analytics->compare_channels_performance($content_id, $period);
$labels = array_keys($comparison);
$scores = array_column($comparison, 'performance_score');
$views = array_column($comparison, 'views');
wp_send_json_success(array(
'labels' => $labels,
'scores' => $scores,
'views' => $views
));
}
/**
* AJAX生成报告
*/
public function ajax_generate_report() {
check_ajax_referer('fca_ajax_nonce', 'nonce');
$content_ids = array_map('intval', $_POST['content_ids']);
$channels = array_map('sanitize_text_field', $_POST['channels']);
$date_from = sanitize_text_field($_POST['date_from']);
$date_to = sanitize_text_field($_POST['date_to']);
$format = sanitize_text_field($_POST['format']);
// 生成报告数据
$report_data = $this->generate_report_data($content_ids, $channels, $date_from, $date_to);
// 根据格式返回结果
if ($format === 'csv') {
$this->generate_csv_report($report_data);
} else {
wp_send_json_success(array(
'html' => $this->generate_html_report($report_data)
));
}
}
/**
* 添加文章编辑页面的元框
*/
public function add_content_meta_box() {
add_meta_box(
'fca_content_analytics',
'内容效果分析',
array($this, 'render_content_meta_box'),
'post',
'side',
'high'
);
}
/**
* 渲染文章编辑页面的元框
*/
public function render_content_meta_box($post) {
$performance = $this->analytics->calculate_channel_performance($post->
