文章目录[隐藏]
WordPress文创插件开发:柔性产品生命周期分析模块教程
引言:文创产品与生命周期管理
在当今数字化文创产业中,产品生命周期管理变得日益重要。文创产品(如数字艺术品、文创衍生品、文化IP产品等)通常具有非标准化的特性,其生命周期受到市场需求、文化趋势、季节因素等多重影响。本教程将指导您开发一个WordPress插件,专门用于分析和管理文创产品的柔性生命周期。
通过这个插件,文创企业可以:
- 追踪产品从概念到退市的完整周期
- 分析不同文创产品的市场表现
- 预测产品生命周期阶段并制定相应策略
- 可视化展示产品生命周期数据
环境准备与插件基础结构
首先,我们需要创建插件的基本文件结构:
<?php
/**
* Plugin Name: 文创产品生命周期分析
* Plugin URI: https://yourwebsite.com/
* Description: 用于分析和管理文创产品柔性生命周期的WordPress插件
* Version: 1.0.0
* Author: 您的名称
* License: GPL v2 or later
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 定义插件常量
define('CPLA_VERSION', '1.0.0');
define('CPLA_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('CPLA_PLUGIN_URL', plugin_dir_url(__FILE__));
// 初始化插件
require_once CPLA_PLUGIN_DIR . 'includes/class-core.php';
// 插件激活时的操作
register_activation_hook(__FILE__, 'cpla_activate_plugin');
function cpla_activate_plugin() {
require_once CPLA_PLUGIN_DIR . 'includes/class-activator.php';
CPLA_Activator::activate();
}
// 插件停用时的操作
register_deactivation_hook(__FILE__, 'cpla_deactivate_plugin');
function cpla_deactivate_plugin() {
require_once CPLA_PLUGIN_DIR . 'includes/class-deactivator.php';
CPLA_Deactivator::deactivate();
}
?>
数据库设计与产品数据模型
文创产品生命周期分析需要存储产品信息、销售数据和生命周期阶段。以下是数据库表的设计:
<?php
// 文件路径:includes/class-activator.php
class CPLA_Activator {
public static function activate() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
// 文创产品表
$table_products = $wpdb->prefix . 'cpla_products';
$sql_products = "CREATE TABLE IF NOT EXISTS $table_products (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
product_type varchar(100) NOT NULL COMMENT '产品类型:数字艺术、实体衍生品、IP授权等',
launch_date date NOT NULL COMMENT '上市日期',
status varchar(50) DEFAULT 'active' COMMENT '产品状态',
lifecycle_stage varchar(50) DEFAULT 'introduction' COMMENT '生命周期阶段',
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) $charset_collate;";
// 产品销售数据表
$table_sales = $wpdb->prefix . 'cpla_sales_data';
$sql_sales = "CREATE TABLE IF NOT EXISTS $table_sales (
id mediumint(9) NOT NULL AUTO_INCREMENT,
product_id mediumint(9) NOT NULL,
sales_date date NOT NULL,
sales_volume int(11) DEFAULT 0 COMMENT '销售量',
revenue decimal(10,2) DEFAULT 0.00 COMMENT '销售额',
platform varchar(100) COMMENT '销售平台',
region varchar(100) COMMENT '销售区域',
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
FOREIGN KEY (product_id) REFERENCES $table_products(id) ON DELETE CASCADE
) $charset_collate;";
// 生命周期阶段定义表
$table_stages = $wpdb->prefix . 'cpla_lifecycle_stages';
$sql_stages = "CREATE TABLE IF NOT EXISTS $table_stages (
id mediumint(9) NOT NULL AUTO_INCREMENT,
stage_name varchar(100) NOT NULL COMMENT '阶段名称',
stage_order int(11) NOT NULL COMMENT '阶段顺序',
min_duration int(11) DEFAULT 0 COMMENT '最小持续时间(天)',
max_duration int(11) DEFAULT NULL COMMENT '最大持续时间(天)',
description text COMMENT '阶段描述',
color_code varchar(7) DEFAULT '#3498db' COMMENT '阶段颜色标识',
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql_products);
dbDelta($sql_sales);
dbDelta($sql_stages);
// 插入默认的生命周期阶段数据
self::insert_default_stages();
}
private static function insert_default_stages() {
global $wpdb;
$table_stages = $wpdb->prefix . 'cpla_lifecycle_stages';
$default_stages = array(
array('stage_name' => '概念期', 'stage_order' => 1, 'min_duration' => 30, 'color_code' => '#95a5a6'),
array('stage_name' => '开发期', 'stage_order' => 2, 'min_duration' => 60, 'color_code' => '#3498db'),
array('stage_name' => '引入期', 'stage_order' => 3, 'min_duration' => 30, 'color_code' => '#2ecc71'),
array('stage_name' => '成长期', 'stage_order' => 4, 'min_duration' => 90, 'color_code' => '#f1c40f'),
array('stage_name' => '成熟期', 'stage_order' => 5, 'min_duration' => 180, 'color_code' => '#e67e22'),
array('stage_name' => '衰退期', 'stage_order' => 6, 'min_duration' => 60, 'color_code' => '#e74c3c'),
array('stage_name' => '复兴期', 'stage_order' => 7, 'min_duration' => 0, 'color_code' => '#9b59b6'),
array('stage_name' => '退市期', 'stage_order' => 8, 'min_duration' => 30, 'color_code' => '#34495e')
);
foreach ($default_stages as $stage) {
$wpdb->insert($table_stages, $stage);
}
}
}
?>
核心功能:生命周期分析算法
柔性产品生命周期分析的核心是根据销售数据和产品特征动态判断产品所处的生命周期阶段:
<?php
// 文件路径:includes/class-lifecycle-analyzer.php
class CPLA_Lifecycle_Analyzer {
/**
* 分析产品当前的生命周期阶段
* @param int $product_id 产品ID
* @return array 包含阶段信息和置信度的数组
*/
public static function analyze_product_stage($product_id) {
global $wpdb;
// 获取产品基本信息
$products_table = $wpdb->prefix . 'cpla_products';
$product = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM $products_table WHERE id = %d", $product_id
));
if (!$product) {
return array('error' => '产品不存在');
}
// 获取销售数据
$sales_table = $wpdb->prefix . 'cpla_sales_data';
$sales_data = $wpdb->get_results($wpdb->prepare(
"SELECT sales_date, sales_volume, revenue
FROM $sales_table
WHERE product_id = %d
ORDER BY sales_date ASC", $product_id
));
// 计算关键指标
$metrics = self::calculate_sales_metrics($sales_data);
// 分析生命周期阶段
$stage_analysis = self::determine_lifecycle_stage($metrics, $product);
return $stage_analysis;
}
/**
* 计算销售指标
* @param array $sales_data 销售数据数组
* @return array 计算后的指标
*/
private static function calculate_sales_metrics($sales_data) {
if (empty($sales_data)) {
return array(
'total_sales' => 0,
'total_revenue' => 0,
'avg_daily_sales' => 0,
'sales_trend' => 0,
'peak_sales' => 0,
'recent_growth' => 0
);
}
$total_sales = 0;
$total_revenue = 0;
$sales_by_date = array();
foreach ($sales_data as $sale) {
$total_sales += $sale->sales_volume;
$total_revenue += floatval($sale->revenue);
$sales_by_date[$sale->sales_date] = $sale->sales_volume;
}
// 计算销售趋势(最近30天 vs 前30天)
$dates = array_keys($sales_by_date);
sort($dates);
$recent_growth = 0;
if (count($dates) > 60) {
$recent_period = array_slice($sales_by_date, -30);
$previous_period = array_slice($sales_by_date, -60, 30);
$recent_avg = array_sum($recent_period) / count($recent_period);
$previous_avg = array_sum($previous_period) / count($previous_period);
if ($previous_avg > 0) {
$recent_growth = (($recent_avg - $previous_avg) / $previous_avg) * 100;
}
}
return array(
'total_sales' => $total_sales,
'total_revenue' => $total_revenue,
'avg_daily_sales' => $total_sales / count($sales_data),
'sales_trend' => self::calculate_trend($sales_by_date),
'peak_sales' => max(array_values($sales_by_date)),
'recent_growth' => $recent_growth,
'data_points' => count($sales_data)
);
}
/**
* 根据指标确定生命周期阶段
* @param array $metrics 销售指标
* @param object $product 产品对象
* @return array 阶段分析结果
*/
private static function determine_lifecycle_stage($metrics, $product) {
$days_since_launch = self::days_since_date($product->launch_date);
// 柔性生命周期阶段判断逻辑
if ($days_since_launch < 30 && $metrics['total_sales'] < 100) {
$stage = '引入期';
$confidence = 0.85;
} elseif ($metrics['recent_growth'] > 20 && $metrics['total_sales'] > 100) {
$stage = '成长期';
$confidence = 0.75;
} elseif (abs($metrics['recent_growth']) < 10 && $metrics['total_sales'] > 500) {
$stage = '成熟期';
$confidence = 0.80;
} elseif ($metrics['recent_growth'] < -15 && $metrics['total_sales'] > 300) {
$stage = '衰退期';
$confidence = 0.70;
} elseif ($metrics['recent_growth'] > 15 && $metrics['total_sales'] > 800) {
$stage = '复兴期';
$confidence = 0.65;
} else {
$stage = '成熟期';
$confidence = 0.60;
}
// 考虑文创产品的特殊性:季节性和文化事件影响
$seasonal_factor = self::calculate_seasonal_factor();
if ($seasonal_factor > 1.5 && $stage == '成熟期') {
$stage = '复兴期';
$confidence *= 0.9;
}
return array(
'stage' => $stage,
'confidence' => round($confidence, 2),
'metrics' => $metrics,
'days_since_launch' => $days_since_launch,
'recommendations' => self::generate_recommendations($stage, $metrics)
);
}
/**
* 计算季节性因子(示例:考虑节假日对文创产品的影响)
* @return float 季节性因子
*/
private static function calculate_seasonal_factor() {
$month = date('n');
// 假设文创产品在节假日月份表现更好
$seasonal_months = [12, 1, 2, 5, 10]; // 12月圣诞,1-2月春节,5月劳动节,10月国庆
return in_array($month, $seasonal_months) ? 1.8 : 1.0;
}
/**
* 生成阶段建议
* @param string $stage 生命周期阶段
* @param array $metrics 销售指标
* @return array 建议列表
*/
private static function generate_recommendations($stage, $metrics) {
$recommendations = array();
switch ($stage) {
case '引入期':
$recommendations[] = '加大市场宣传力度,提高产品知名度';
$recommendations[] = '收集早期用户反馈,优化产品设计';
$recommendations[] = '考虑限时优惠活动,刺激首次购买';
break;
case '成长期':
$recommendations[] = '扩大生产/供应规模,满足增长需求';
$recommendations[] = '开发衍生产品或系列扩展';
$recommendations[] = '加强渠道合作,拓展销售网络';
break;
case '成熟期':
$recommendations[] = '优化成本结构,提高利润率';
$recommendations[] = '开展跨界合作,寻找新的增长点';
$recommendations[] = '维护核心用户群体,提高复购率';
break;
case '衰退期':
$recommendations[] = '考虑产品更新或重新定位';
$recommendations[] = '清理库存,减少损失';
$recommendations[] = '分析衰退原因,为新产品开发积累经验';
break;
case '复兴期':
$recommendations[] = '利用文化热点或季节因素进行再推广';
$recommendations[] = '推出纪念版或特别版本';
$recommendations[] = '探索新的市场或用户群体';
break;
}
// 基于具体指标的建议
if ($metrics['recent_growth'] < -20) {
$recommendations[] = '销售下滑严重,建议立即进行市场调研';
}
if ($metrics['avg_daily_sales'] < 5 && $metrics['data_points'] > 30) {
$recommendations[] = '日均销量较低,考虑调整定价或促销策略';
}
return $recommendations;
}
/**
* 计算日期距离今天的天数
* @param string $date 日期字符串
* @return int 天数差
*/
private static function days_since_date($date) {
$launch_date = new DateTime($date);
$today = new DateTime();
$interval = $today->diff($launch_date);
return $interval->days;
}
/**
* 计算销售趋势(简单线性回归)
* @param array $sales_by_date 按日期索引的销售数据
* @return float 趋势斜率
*/
private static function calculate_trend($sales_by_date) {
if (count($sales_by_date) < 2) {
return 0;
}
$dates = array_keys($sales_by_date);
sort($dates);
// 将日期转换为数值(从0开始的天数)
$x_values = array();
$y_values = array();
$start_date = new DateTime($dates[0]);
foreach ($dates as $index => $date) {
$current_date = new DateTime($date);
$days_diff = $start_date->diff($current_date)->days;
$x_values[] = $days_diff;
$y_values[] = $sales_by_date[$date];
}
// 简单线性回归计算斜率
$n = count($x_values);
$sum_x = array_sum($x_values);
$sum_y = array_sum($y_values);
$sum_xy = 0;
$sum_x2 = 0;
for ($i = 0; $i < $n; $i++) {
$sum_xy += $x_values[$i] * $y_values[$i];
$sum_x2 += $x_values[$i] * $x_values[$i];
}
$slope = ($n * $sum_xy - $sum_x * $sum_y) / ($n * $sum_x2 - $sum_x * $sum_x);
return $slope;
}
}
?>
数据可视化与报表生成
为了让用户直观理解产品生命周期,我们需要创建可视化组件:
<?php
// 文件路径:includes/class-visualization.php
class CPLA_Visualization {
/**
* 生成产品生命周期图表
* @param int $product_id 产品ID
* @return string 图表HTML和JavaScript
*/
public static function generate_lifecycle_chart($product_id) {
global $wpdb;
// 获取销售数据
$sales_table = $wpdb->prefix . 'cpla_sales_data';
$sales_data = $wpdb->get_results($wpdb->prepare(
"SELECT sales_date, sales_volume, revenue
FROM $sales_table
WHERE product_id = %d
ORDER BY sales_date ASC", $product_id
));
// 准备图表数据
$labels = array();
$sales_volumes = array();
$revenues = array();
foreach ($sales_data as $data) {
$labels[] = date('m/d', strtotime($data->sales_date));
$sales_volumes[] = $data->sales_volume;
$revenues[] = floatval($data->revenue);
}
// 获取生命周期阶段分析
$analysis = CPLA_Lifecycle_Analyzer::analyze_product_stage($product_id);
$current_stage = isset($analysis['stage']) ? $analysis['stage'] : '未知';
$confidence = isset($analysis['confidence']) ? ($analysis['confidence'] * 100) . '%' : 'N/A';
// 生成图表HTML和JavaScript
$chart_id = 'cpla_chart_' . $product_id . '_' . rand(1000, 9999);
ob_start();
?>
<div class="cpla-lifecycle-chart">
<div class="chart-header">
<h3>产品生命周期分析图</h3>
<div class="stage-indicator">
<span class="current-stage">当前阶段: <strong><?php echo esc_html($current_stage); ?></strong></span>
<span class="confidence">置信度: <?php echo esc_html($confidence); ?></span>
</div>
</div>
<div class="chart-container">
<canvas id="<?php echo esc_attr($chart_id); ?>" width="800" height="400"></canvas>
</div>
<div class="chart-legend">
<div class="legend-item">
<span class="legend-color" style="background-color: #3498db;"></span>
<span class="legend-text">销售量</span>
</div>
<div class="legend-item">
<span class="legend-color" style="background-color: #2ecc71;"></span>
<span class="legend-text">销售额</span>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
var ctx = document.getElementById('<?php echo esc_js($chart_id); ?>').getContext('2d');
// 准备数据
var chartData = {
labels: <?php echo json_encode($labels); ?>,
datasets: [
{
label: '销售量',
data: <?php echo json_encode($sales_volumes); ?>,
borderColor: '#3498db',
backgroundColor: 'rgba(52, 152, 219, 0.1)',
borderWidth: 2,
fill: true,
yAxisID: 'y'
},
{
label: '销售额',
data: <?php echo json_encode($revenues); ?>,
borderColor: '#2ecc71',
backgroundColor: 'rgba(46, 204, 113, 0.1)',
borderWidth: 2,
fill: true,
yAxisID: 'y1'
}
]
};
// 配置选项
var chartOptions = {
responsive: true,
maintainAspectRatio: false,
interaction: {
mode: 'index',
intersect: false
},
plugins: {
tooltip: {
mode: 'index',
intersect: false,
callbacks: {
label: function(context) {
var label = context.dataset.label || '';
if (label) {
label += ': ';
}
if (context.datasetIndex === 0) {
label += context.parsed.y + ' 件';
} else {
label += '¥' + context.parsed.y.toFixed(2);
}
return label;
}
}
},
legend: {
position: 'top',
}
},
scales: {
x: {
title: {
display: true,
text: '日期'
},
grid: {
display: true
}
},
y: {
type: 'linear',
display: true,
position: 'left',
title: {
display: true,
text: '销售量 (件)'
},
grid: {
drawOnChartArea: true
}
},
y1: {
type: 'linear',
display: true,
position: 'right',
title: {
display: true,
text: '销售额 (元)'
},
grid: {
drawOnChartArea: false
},
ticks: {
callback: function(value) {
return '¥' + value;
}
}
}
}
};
// 创建图表
var lifecycleChart = new Chart(ctx, {
type: 'line',
data: chartData,
options: chartOptions
});
// 添加生命周期阶段区域标记
<?php if (!empty($analysis['metrics']['data_points']) && $analysis['metrics']['data_points'] > 0): ?>
// 这里可以添加阶段区域标记的逻辑
// 例如,根据分析结果在图表上标记不同阶段
<?php endif; ?>
});
</script>
<style>
.cpla-lifecycle-chart {
background: #fff;
border-radius: 8px;
padding: 20px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
margin: 20px 0;
}
.chart-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
padding-bottom: 15px;
border-bottom: 1px solid #eee;
}
.chart-header h3 {
margin: 0;
color: #333;
}
.stage-indicator {
display: flex;
gap: 20px;
}
.current-stage, .confidence {
padding: 5px 15px;
background: #f8f9fa;
border-radius: 4px;
font-size: 14px;
}
.current-stage strong {
color: #e74c3c;
}
.chart-container {
position: relative;
height: 400px;
margin: 20px 0;
}
.chart-legend {
display: flex;
justify-content: center;
gap: 30px;
margin-top: 20px;
}
.legend-item {
display: flex;
align-items: center;
gap: 8px;
}
.legend-color {
width: 20px;
height: 20px;
border-radius: 3px;
}
.legend-text {
font-size: 14px;
color: #666;
}
</style>
<?php
return ob_get_clean();
}
/**
* 生成生命周期阶段分布图
* @param array $products 产品数组
* @return string 分布图HTML
*/
public static function generate_stage_distribution_chart($products) {
// 统计各阶段产品数量
$stage_counts = array();
foreach ($products as $product) {
$stage = $product->lifecycle_stage;
if (!isset($stage_counts[$stage])) {
$stage_counts[$stage] = 0;
}
$stage_counts[$stage]++;
}
$chart_id = 'cpla_distribution_' . rand(1000, 9999);
ob_start();
?>
<div class="cpla-distribution-chart">
<h3>产品生命周期阶段分布</h3>
<div class="chart-container">
<canvas id="<?php echo esc_attr($chart_id); ?>"></canvas>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
var ctx = document.getElementById('<?php echo esc_js($chart_id); ?>').getContext('2d');
var stageData = {
labels: <?php echo json_encode(array_keys($stage_counts)); ?>,
datasets: [{
data: <?php echo json_encode(array_values($stage_counts)); ?>,
backgroundColor: [
'#95a5a6', // 概念期
'#3498db', // 开发期
'#2ecc71', // 引入期
'#f1c40f', // 成长期
'#e67e22', // 成熟期
'#e74c3c', // 衰退期
'#9b59b6', // 复兴期
'#34495e' // 退市期
],
borderWidth: 1
}]
};
var distributionChart = new Chart(ctx, {
type: 'pie',
data: stageData,
options: {
responsive: true,
plugins: {
legend: {
position: 'right',
},
tooltip: {
callbacks: {
label: function(context) {
var label = context.label || '';
var value = context.raw || 0;
var total = context.dataset.data.reduce((a, b) => a + b, 0);
var percentage = Math.round((value / total) * 100);
return label + ': ' + value + ' 个产品 (' + percentage + '%)';
}
}
}
}
}
});
});
</script>
<?php
return ob_get_clean();
}
}
?>
管理界面与用户交互
创建WordPress管理界面,让用户可以方便地管理产品和查看分析结果:
<?php
// 文件路径:admin/class-admin.php
class CPLA_Admin {
private $plugin_name;
private $version;
public function __construct() {
$this->plugin_name = 'cpla';
$this->version = CPLA_VERSION;
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',
'cpla-dashboard',
array($this, 'display_dashboard_page'),
'dashicons-chart-line',
30
);
add_submenu_page(
'cpla-dashboard',
'产品管理',
'产品管理',
'manage_options',
'cpla-products',
array($this, 'display_products_page')
);
add_submenu_page(
'cpla-dashboard',
'销售数据',
'销售数据',
'manage_options',
'cpla-sales',
array($this, 'display_sales_page')
);
add_submenu_page(
'cpla-dashboard',
'分析报告',
'分析报告',
'manage_options',
'cpla-reports',
array($this, 'display_reports_page')
);
add_submenu_page(
'cpla-dashboard',
'设置',
'设置',
'manage_options',
'cpla-settings',
array($this, 'display_settings_page')
);
}
/**
* 显示仪表板页面
*/
public function display_dashboard_page() {
global $wpdb;
// 获取统计数据
$products_table = $wpdb->prefix . 'cpla_products';
$sales_table = $wpdb->prefix . 'cpla_sales_data';
$total_products = $wpdb->get_var("SELECT COUNT(*) FROM $products_table");
$active_products = $wpdb->get_var("SELECT COUNT(*) FROM $products_table WHERE status = 'active'");
$total_sales = $wpdb->get_var("SELECT SUM(sales_volume) FROM $sales_table");
$total_revenue = $wpdb->get_var("SELECT SUM(revenue) FROM $sales_table");
// 获取产品列表用于分析
$products = $wpdb->get_results("SELECT * FROM $products_table ORDER BY created_at DESC LIMIT 10");
?>
<div class="wrap cpla-dashboard">
<h1><?php echo esc_html(get_admin_page_title()); ?></h1>
<!-- 统计卡片 -->
<div class="cpla-stats-cards">
<div class="stats-card">
<div class="stats-icon" style="background-color: #3498db;">
<span class="dashicons dashicons-products"></span>
</div>
<div class="stats-content">
<h3><?php echo esc_html($total_products); ?></h3>
<p>总产品数</p>
</div>
</div>
<div class="stats-card">
<div class="stats-icon" style="background-color: #2ecc71;">
<span class="dashicons dashicons-yes"></span>
</div>
<div class="stats-content">
<h3><?php echo esc_html($active_products); ?></h3>
<p>活跃产品</p>
</div>
</div>
<div class="stats-card">
<div class="stats-icon" style="background-color: #e67e22;">
<span class="dashicons dashicons-cart"></span>
</div>
<div class="stats-content">
<h3><?php echo esc_html($total_sales ?: 0); ?></h3>
<p>总销售量</p>
</div>
</div>
<div class="stats-card">
<div class="stats-icon" style="background-color: #9b59b6;">
<span class="dashicons dashicons-money"></span>
</div>
<div class="stats-content">
<h3>¥<?php echo esc_html(number_format($total_revenue ?: 0, 2)); ?></h3>
<p>总销售额</p>
</div>
</div>
</div>
<!-- 主要分析区域 -->
<div class="cpla-main-content">
<div class="cpla-section">
<h2>产品生命周期分析</h2>
<?php
if (!empty($products)) {
foreach ($products as $product) {
echo '<div class="product-analysis-item">';
echo '<h3>' . esc_html($product->name) . '</h3>';
// 分析产品生命周期
$analysis = CPLA_Lifecycle_Analyzer::analyze_product_stage($product->id);
if (!isset($analysis['error'])) {
echo '<div class="analysis-result">';
echo '<p><strong>当前阶段:</strong> ' . esc_html($analysis['stage']) . '</p>';
echo '<p><strong>置信度:</strong> ' . esc_html($analysis['confidence'] * 100) . '%</p>';
echo '<p><strong>上市天数:</strong> ' . esc_html($analysis['days_since_launch']) . ' 天</p>';
// 显示建议
if (!empty($analysis['recommendations'])) {
echo '<div class="recommendations">';
echo '<strong>建议:</strong>';
echo '<ul>';
foreach ($analysis['recommendations'] as $recommendation) {
echo '<li>' . esc_html($recommendation) . '</li>';
}
echo '</ul>';
echo '</div>';
}
echo '</div>';
// 显示图表
echo CPLA_Visualization::generate_lifecycle_chart($product->id);
}
echo '</div>';
}
} else {
echo '<p>暂无产品数据,请先添加产品。</p>';
}
?>
</div>
<!-- 阶段分布图 -->
<div class="cpla-section">
<h2>产品阶段分布</h2>
<?php
$all_products = $wpdb->get_results("SELECT * FROM $products_table");
if (!empty($all_products)) {
echo CPLA_Visualization::generate_stage_distribution_chart($all_products);
}
?>
</div>
</div>
</div>
<style>
.cpla-dashboard {
max-width: 1200px;
}
.cpla-stats-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin: 20px 0;
}
.stats-card {
background: #fff;
border-radius: 8px;
padding: 20px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
display: flex;
align-items: center;
gap: 15px;
}
.stats-icon {
width: 60px;
height: 60px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
color: white;
}
.stats-icon .dashicons {
font-size: 30px;
width: 30px;
height: 30px;
}
.stats-content h3 {
margin: 0 0 5px 0;
font-size: 24px;
color: #333;
}
.stats-content p {
margin: 0;
color: #666;
font-size: 14px;
}
.cpla-main-content {
display: grid;
gap: 30px;
margin-top: 30px;
}
.cpla-section {
background: #fff;
border-radius: 8px;
padding: 25px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.cpla-section h2 {
margin-top: 0;
padding-bottom: 15px;
border-bottom: 1px solid #eee;
color: #333;
}
.product-analysis-item {


