文章目录
-
- 在文创产业快速发展的今天,文创产品从概念构思到市场退出的完整生命周期管理变得日益复杂。传统的产品管理方法往往难以适应文创产品快速迭代、个性化定制和灵活调整的需求。本文将介绍如何通过WordPress插件实现柔性产品生命周期管理,帮助文创企业高效管理产品从创意到退市的每一个阶段。
-
- <?php /** * Plugin Name: 文创产品生命周期管理器 * Plugin URI: https://yourwebsite.com/ * Description: 用于管理文创产品从概念到退市的完整生命周期 * Version: 1.0.0 * Author: 你的名字 * License: GPL v2 or later */ // 防止直接访问 if (!defined('ABSPATH')) { exit; } // 定义插件常量 define('CPLM_VERSION', '1.0.0'); define('CPLM_PLUGIN_DIR', plugin_dir_path(__FILE__)); define('CPLM_PLUGIN_URL', plugin_dir_url(__FILE__)); // 初始化插件 add_action('plugins_loaded', 'cplm_init'); function cplm_init() { // 检查必要组件 if (!class_exists('ACF')) { add_action('admin_notices', 'cplm_acf_notice'); return; } // 加载核心功能 require_once CPLM_PLUGIN_DIR . 'includes/class-product-lifecycle.php'; require_once CPLM_PLUGIN_DIR . 'includes/class-product-stages.php'; require_once CPLM_PLUGIN_DIR . 'includes/class-analytics.php'; // 初始化主类 $cplm_main = new Product_Lifecycle_Manager(); $cplm_main->init(); } function cplm_acf_notice() { ?> <div class="notice notice-error"> <p>文创产品生命周期管理器需要Advanced Custom Fields插件。请先安装并激活ACF插件。</p> </div> <?php } ?>
- <?php /** * 产品生命周期阶段管理类 */ class Product_Stages_Manager { private $stages = array(); public function __construct() { $this->define_stages(); } /** * 定义文创产品的生命周期阶段 */ private function define_stages() { $this->stages = array( 'concept' => array( 'name' => '概念阶段', 'description' => '创意构思和市场调研', 'color' => '#3498db', 'order' => 1, 'fields' => array('idea_description', 'target_audience', 'feasibility_analysis') ), 'design' => array( 'name' => '设计开发', 'description' => '产品设计和原型制作', 'color' => '#2ecc71', 'order' => 2, 'fields' => array('design_files', 'prototype_images', 'material_list') ), 'production' => array( 'name' => '生产制造', 'description' => '小批量试产和量产', 'color' => '#f39c12', 'order' => 3, 'fields' => array('production_cost', 'quality_control', 'supplier_info') ), 'marketing' => array( 'name' => '营销推广', 'description' => '市场推广和销售', 'color' => '#9b59b6', 'order' => 4, 'fields' => array('marketing_plan', 'sales_channels', 'promotion_budget') ), 'maintenance' => array( 'name' => '运营维护', 'description' => '产品维护和用户反馈', 'color' => '#34495e', 'order' => 5, 'fields' => array('customer_feedback', 'update_plans', 'support_requests') ), 'retirement' => array( 'name' => '退市处理', 'description' => '产品退市和库存处理', 'color' => '#e74c3c', 'order' => 6, 'fields' => array('retirement_reason', 'inventory_disposal', 'replacement_product') ) ); } /** * 获取所有阶段 */ public function get_stages() { return $this->stages; } /** * 获取特定阶段 */ public function get_stage($stage_id) { return isset($this->stages[$stage_id]) ? $this->stages[$stage_id] : false; } /** * 获取下一阶段 */ public function get_next_stage($current_stage) { $stages = $this->stages; $current_order = $stages[$current_stage]['order']; foreach ($stages as $stage_id => $stage) { if ($stage['order'] == $current_order + 1) { return $stage_id; } } return false; } } ?>
-
- <?php /** * 产品生命周期管理主类 */ class Product_Lifecycle_Manager { private $stages_manager; public function init() { $this->stages_manager = new Product_Stages_Manager(); // 注册自定义文章类型 add_action('init', array($this, 'register_post_types')); // 添加管理页面 add_action('admin_menu', array($this, 'add_admin_pages')); // 注册自定义字段 add_action('acf/init', array($this, 'register_custom_fields')); // 添加短代码 add_shortcode('product_lifecycle', array($this, 'lifecycle_shortcode')); } /** * 注册文创产品自定义文章类型 */ public function register_post_types() { $labels = array( 'name' => '文创产品', 'singular_name' => '文创产品', 'menu_name' => '文创产品', 'add_new' => '添加新产品', 'add_new_item' => '添加新文创产品', 'edit_item' => '编辑文创产品', 'new_item' => '新文创产品', 'view_item' => '查看文创产品', 'search_items' => '搜索文创产品', 'not_found' => '未找到文创产品', 'not_found_in_trash' => '回收站中无文创产品' ); $args = array( 'labels' => $labels, 'public' => true, 'has_archive' => true, 'menu_icon' => 'dashicons-art', 'supports' => array('title', 'editor', 'thumbnail', 'excerpt'), 'rewrite' => array('slug' => 'cultural-products'), 'show_in_rest' => true, 'taxonomies' => array('product_category') ); register_post_type('cultural_product', $args); // 注册产品分类 register_taxonomy( 'product_category', 'cultural_product', array( 'label' => '产品分类', 'rewrite' => array('slug' => 'product-category'), 'hierarchical' => true, 'show_admin_column' => true ) ); } /** * 注册产品生命周期字段 */ public function register_custom_fields() { if (!function_exists('acf_add_local_field_group')) return; $stages = $this->stages_manager->get_stages(); $fields = array(); // 添加当前阶段选择字段 $fields[] = array( 'key' => 'field_current_stage', 'label' => '当前阶段', 'name' => 'current_stage', 'type' => 'select', 'choices' => array(), 'default_value' => 'concept' ); // 为每个阶段生成选项 foreach ($stages as $stage_id => $stage) { $fields[0]['choices'][$stage_id] = $stage['name']; } // 添加阶段时间线字段 $fields[] = array( 'key' => 'field_stage_timeline', 'label' => '阶段时间线', 'name' => 'stage_timeline', 'type' => 'repeater', 'sub_fields' => array( array( 'key' => 'field_stage_id', 'label' => '阶段', 'name' => 'stage', 'type' => 'select', 'choices' => $fields[0]['choices'] ), array( 'key' => 'field_start_date', 'label' => '开始日期', 'name' => 'start_date', 'type' => 'date_picker' ), array( 'key' => 'field_end_date', 'label' => '结束日期', 'name' => 'end_date', 'type' => 'date_picker' ), array( 'key' => 'field_stage_notes', 'label' => '阶段备注', 'name' => 'notes', 'type' => 'textarea' ) ) ); // 添加产品数据字段 $fields[] = array( 'key' => 'field_product_data', 'label' => '产品数据', 'name' => 'product_data', 'type' => 'group', 'sub_fields' => array( array( 'key' => 'field_development_cost', 'label' => '开发成本', 'name' => 'development_cost', 'type' => 'number' ), array( 'key' => 'field_production_cost', 'label' => '生产成本', 'name' => 'production_cost', 'type' => 'number' ), array( 'key' => 'field_expected_sales', 'label' => '预期销量', 'name' => 'expected_sales', 'type' => 'number' ), array( 'key' => 'field_actual_sales', 'label' => '实际销量', 'name' => 'actual_sales', 'type' => 'number' ) ) ); acf_add_local_field_group(array( 'key' => 'group_product_lifecycle', 'title' => '产品生命周期管理', 'fields' => $fields, 'location' => array( array( array( 'param' => 'post_type', 'operator' => '==', 'value' => 'cultural_product', ), ), ), )); } } ?>
- <?php /** * 产品生命周期可视化短代码 */ public function lifecycle_shortcode($atts) { $atts = shortcode_atts(array( 'product_id' => get_the_ID(), 'show_timeline' => true, 'show_metrics' => true ), $atts); $product_id = intval($atts['product_id']); $output = ''; // 获取产品信息 $current_stage = get_field('current_stage', $product_id); $stage_timeline = get_field('stage_timeline', $product_id); $product_data = get_field('product_data', $product_id); // 获取阶段管理器 $stages_manager = new Product_Stages_Manager(); $stages = $stages_manager->get_stages(); // 构建生命周期可视化 $output .= '<div class="product-lifecycle-container">'; $output .= '<h3>产品生命周期进度</h3>'; // 阶段进度条 $output .= '<div class="lifecycle-progress-bar">'; $total_stages = count($stages); $current_order = $stages[$current_stage]['order']; $progress_percentage = ($current_order / $total_stages) * 100; $output .= '<div class="progress-track">'; foreach ($stages as $stage_id => $stage) { $is_active = $stage['order'] <= $current_order; $is_current = $stage_id === $current_stage; $output .= '<div class="progress-stage ' . ($is_active ? 'active' : '') . ' ' . ($is_current ? 'current' : '') . '" style="border-color: ' . $stage['color'] . '">'; $output .= '<span class="stage-icon" style="background-color: ' . $stage['color'] . '"></span>'; $output .= '<span class="stage-name">' . $stage['name'] . '</span>'; $output .= '</div>'; } $output .= '</div>'; $output .= '<div class="progress-bar">'; $output .= '<div class="progress-fill" style="width: ' . $progress_percentage . '%; background: linear-gradient(90deg, '; // 创建渐变颜色 $color_count = 0; foreach ($stages as $stage_id => $stage) { if ($stage['order'] <= $current_order) { if ($color_count > 0) $output .= ', '; $output .= $stage['color'] . ' ' . (($stage['order'] - 1) / $total_stages * 100) . '%'; $color_count++; } } $output .= ')"></div>'; $output .= '</div>'; $output .= '</div>'; // 显示当前阶段详情 if (isset($stages[$current_stage])) { $current_stage_info = $stages[$current_stage]; $output .= '<div class="current-stage-info" style="border-left: 4px solid ' . $current_stage_info['color'] . '">'; $output .= '<h4>当前阶段: ' . $current_stage_info['name'] . '</h4>'; $output .= '<p>' . $current_stage_info['description'] . '</p>'; // 显示阶段时间线 if ($stage_timeline) { $output .= '<div class="stage-timeline">'; foreach ($stage_timeline as $timeline_item) { if ($timeline_item['stage'] == $current_stage) { $output .= '<p><strong>开始时间:</strong> ' . $timeline_item['start_date'] . '</p>'; if ($timeline_item['end_date']) { $output .= '<p><strong>结束时间:</strong> ' . $timeline_item['end_date'] . '</p>'; } if ($timeline_item['notes']) { $output .= '<p><strong>备注:</strong> ' . $timeline_item['notes'] . '</p>'; } } } $output .= '</div>'; } $output .= '</div>'; } // 显示产品指标 if ($atts['show_metrics'] && $product_data) { $output .= '<div class="product-metrics">'; $output .= '<h4>产品指标</h4>'; $output .= '<div class="metrics-grid">'; $metrics = array( 'development_cost' => '开发成本', 'production_cost' => '生产成本', 'expected_sales' => '预期销量', 'actual_sales' => '实际销量' ); foreach ($metrics as $key => $label) { if (isset($product_data[$key]) && $product_data[$key] !== '') { $value = $product_data[$key]; $output .= '<div class="metric-item">'; $output .= '<span class="metric-label">' . $label . '</span>'; $output .= '<span class="metric-value">' . $value . '</span>'; $output .= '</div>'; } } // 计算投资回报率(简化版) if (isset($product_data['development_cost']) && isset($product_data['production_cost']) && isset($product_data['actual_sales'])) { $total_cost = floatval($product_data['development_cost']) + floatval($product_data['production_cost']); $revenue = floatval($product_data['actual_sales']) * 100; // 假设单价100元 if ($total_cost > 0) { $roi = (($revenue - $total_cost) / $total_cost) * 100; $output .= '<div class="metric-item">'; $output .= '<span class="metric-label">投资回报率</span>'; $output .= '<span class="metric-value">' . number_format($roi, 2) . '%</span>'; $output .= '</div>'; } } $output .= '</div>'; $output .= '</div>'; } $output .= '</div>'; // 添加CSS样式 $output .= '<style> .product-lifecycle-container { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 20px; background: #f8f9fa; border-radius: 8px; margin: 20px 0; } .lifecycle-progress-bar { margin: 30px 0; } .progress-track { display: flex; justify-content: space-between; .progress-stage { flex: 1; text-align: center; padding: 10px 5px; position: relative; border-top: 3px solid #ddd; transition: all 0.3s ease; } .progress-stage.active { border-color: #4CAF50; } .progress-stage.current { border-color: #2196F3; font-weight: bold; } .stage-icon { display: block; width: 20px; height: 20px; border-radius: 50%; margin: 0 auto 5px; background-color: #ddd; } .progress-bar { height: 8px; background-color: #e0e0e0; border-radius: 4px; overflow: hidden; } .progress-fill { height: 100%; transition: width 0.5s ease; } .current-stage-info { background: white; padding: 15px; border-radius: 5px; margin: 20px 0; box-shadow: 0 2px 4px rgba(0,0,0,0.1); } .product-metrics { background: white; padding: 15px; border-radius: 5px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); } .metrics-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-top: 15px; } .metric-item { padding: 10px; background: #f5f5f5; border-radius: 4px; } .metric-label { display: block; font-size: 12px; color: #666; margin-bottom: 5px; } .metric-value { display: block; font-size: 18px; font-weight: bold; color: #333; } </style>'; return $output; } ## 高级功能实现 ### 4.1 数据分析与报告 <?php/** 产品数据分析类 */ class Product_Analytics { /** * 获取产品生命周期统计数据 */ public static function get_lifecycle_stats($product_id = null) { global $wpdb; $stats = array(); // 获取所有文创产品 $args = array( 'post_type' => 'cultural_product', 'posts_per_page' => -1, 'post_status' => 'publish' ); if ($product_id) { $args['p'] = $product_id; } $products = get_posts($args); // 初始化统计数据 $stage_counts = array( 'concept' => 0, 'design' => 0, 'production' => 0, 'marketing' => 0, 'maintenance' => 0, 'retirement' => 0 ); $total_development_cost = 0; $total_production_cost = 0; $total_expected_sales = 0; $total_actual_sales = 0; $product_count = 0; foreach ($products as $product) { $current_stage = get_field('current_stage', $product->ID); $product_data = get_field('product_data', $product->ID); // 统计各阶段产品数量 if (isset($stage_counts[$current_stage])) { $stage_counts[$current_stage]++; } // 累加财务数据 if ($product_data) { if (isset($product_data['development_cost'])) { $total_development_cost += floatval($product_data['development_cost']); } if (isset($product_data['production_cost'])) { $total_production_cost += floatval($product_data['production_cost']); } if (isset($product_data['expected_sales'])) { $total_expected_sales += floatval($product_data['expected_sales']); } if (isset($product_data['actual_sales'])) { $total_actual_sales += floatval($product_data['actual_sales']); } } $product_count++; } // 计算平均数据 $stats['stage_distribution'] = $stage_counts; $stats['total_products'] = $product_count; $stats['avg_development_cost'] = $product_count > 0 ? $total_development_cost / $product_count : 0; $stats['avg_production_cost'] = $product_count > 0 ? $total_production_cost / $product_count : 0; $stats['sales_achievement_rate'] = $total_expected_sales > 0 ? ($total_actual_sales / $total_expected_sales) * 100 : 0; return $stats; } /** * 生成生命周期报告 */ public static function generate_lifecycle_report($product_id = null) { $stats = self::get_lifecycle_stats($product_id); $report = array( 'summary' => array( 'total_products' => $stats['total_products'], 'most_common_stage' => array_search(max($stats['stage_distribution']), $stats['stage_distribution']), 'avg_total_cost' => $stats['avg_development_cost'] + $stats['avg_production_cost'], 'sales_achievement_rate' => round($stats['sales_achievement_rate'], 2) ), 'stage_analysis' => $stats['stage_distribution'], 'financial_metrics' => array( 'avg_development_cost' => round($stats['avg_development_cost'], 2), 'avg_production_cost' => round($stats['avg_production_cost'], 2), 'total_investment' => round($stats['avg_development_cost'] + $stats['avg_production_cost'], 2) ), 'recommendations' => array() ); // 基于数据分析生成建议 if ($stats['stage_distribution']['concept'] > $stats['total_products'] * 0.4) { $report['recommendations'][] = '概念阶段产品过多,建议加快产品开发进度'; } if ($stats['sales_achievement_rate'] < 80) { $report['recommendations'][] = '销售达成率较低,建议重新评估市场策略'; } return $report; } /** * 显示分析报告短代码 */ public static function analytics_report_shortcode($atts) { $atts = shortcode_atts(array( 'type' => 'summary', // summary, detailed, comparison 'product_id' => null ), $atts); $report = self::generate_lifecycle_report($atts['product_id']); ob_start(); ?> <div class="analytics-report"> <h3>文创产品生命周期分析报告</h3> <div class="report-summary"> <h4>概要</h4> <div class="summary-grid"> <div class="summary-item"> <span class="summary-label">产品总数</span> <span class="summary-value"><?php echo $report['summary']['total_products']; ?></span> </div> <div class="summary-item"> <span class="summary-label">主要阶段</span> <span class="summary-value"><?php echo $report['summary']['most_common_stage']; ?></span> </div> <div class="summary-item"> <span class="summary-label">平均总成本</span> <span class="summary-value">¥<?php echo number_format($report['summary']['avg_total_cost'], 2); ?></span> </div> <div class="summary-item"> <span class="summary-label">销售达成率</span> <span class="summary-value"><?php echo $report['summary']['sales_achievement_rate']; ?>%</span> </div> </div> </div> <div class="stage-analysis"> <h4>阶段分布</h4> <div class="stage-chart"> <?php foreach ($report['stage_analysis'] as $stage => $count): ?> <div class="stage-bar"> <div class="stage-label"><?php echo $stage; ?></div> <div class="stage-bar-container"> <div class="stage-bar-fill" style="width: <?php echo ($count / $report['summary']['total_products']) * 100; ?>%"> <span class="stage-count"><?php echo $count; ?></span> </div> </div> </div> <?php endforeach; ?> </div> </div> <?php if (!empty($report['recommendations'])): ?> <div class="recommendations"> <h4>优化建议</h4> <ul> <?php foreach ($report['recommendations'] as $recommendation): ?> <li><?php echo $recommendation; ?></li> <?php endforeach; ?> </ul> </div> <?php endif; ?> </div> <style> .analytics-report { background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); } .summary-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin: 15px 0; } .summary-item { padding: 15px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 6px; text-align: center; } .summary-label { display: block; font-size: 14px; opacity: 0.9; margin-bottom: 5px; } .summary-value { display: block; font-size: 24px; font-weight: bold; } .stage-chart { margin: 20px 0; } .stage-bar { margin: 10px 0; display: flex; align-items: center; } .stage-label { width: 120px; font-weight: bold; } .stage-bar-container { flex: 1; height: 30px; background: #f0f0f0; border-radius: 4px; overflow: hidden; } .stage-bar-fill { height: 100%; background: linear-gradient(90deg, #4CAF50, #8BC34A); display: flex; align-items: center; justify-content: flex-end; padding-right: 10px; transition: width 1s ease; } .stage-count { color: white; font-weight: bold; text-shadow: 1px 1px 2px rgba(0,0,0,0.3); } .recommendations ul { list-style-type: none; padding-left: 0; } .recommendations li { padding: 10px; margin: 5px 0; background: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px; } </style> <?php return ob_get_clean(); } } // 注册短代码add_shortcode('product_analytics', array('Product_Analytics', 'analytics_report_shortcode'));?> ### 4.2 自动化工作流 <?php/** 自动化工作流管理 */ class Workflow_Automation { /** * 自动推进产品阶段 */ public static function auto_advance_stage() { $products = get_posts(array( 'post_type' => 'cultural_product', 'posts_per_page' => -1, 'post_status' => 'publish' )); $stages_manager = new Product_Stages_Manager(); $advanced_count = 0; foreach ($products as $product) { $current_stage = get_field('current_stage', $product->ID); $stage_timeline = get_field('stage_timeline', $product->ID); // 获取当前阶段的时间信息 $current_stage_data = null; if ($stage_timeline) { foreach ($stage_timeline as $item) { if ($item['stage'] == $current_stage) { $current_stage_data = $item; break; } } } // 检查是否需要推进阶段 if ($current_stage_data && $current_stage_data['end_date']) { $end_date = DateTime::createFromFormat('Ymd', $current_stage_data['end_date']); $today = new DateTime(); // 如果阶段结束日期已过,自动推进到下一阶段 if ($end_date < $today) { $next_stage = $stages_manager->get_next_stage($current_stage); if ($next_stage) { // 更新当前阶段 update_field('current_stage', $next_stage, $product->ID); // 更新阶段时间线 if ($stage_timeline) { $stage_timeline[] = array( 'stage' => $next_stage, 'start_date' => date('Ymd'), 'end_date' => '', 'notes' => '自动推进到下一阶段' ); update_field('stage_timeline', $stage_timeline, $product->ID); } // 发送通知 self::send_stage_advance_notification($product->ID, $current_stage, $next_stage); $advanced_count++; } } } } return $advanced_count; } /** * 发送阶段推进通知 */ private static function send_stage_advance_notification($product_id, $old_stage, $new_stage) { $product = get_post($product_id); $stages_manager = new Product_Stages_Manager(); $old_stage_info = $stages_manager->get_stage($old_stage); $new_stage_info = $stages_manager->get_stage($new_stage); // 获取产品负责人(这里假设使用作者) $author_id = $product->post_author; $author_email = get_the_author_meta('user_email', $author_id); $subject = '产品阶段已自动推进: ' . $product->post_title; $message = " <h3>产品阶段更新通知</h3> <p>您的文创产品 <strong>{$product->post_title}</strong> 已从 <strong>{$old_stage_info['name']}</strong> 阶段自动推进到 <strong>{$new_stage_info['name']}</strong> 阶段。</p> <p><strong>原阶段:</strong> {$old_stage_info['description']}</p> <p><strong>新阶段:</strong> {$new_stage_info['description']}</p> <p><strong>推进时间:</strong> " . date('Y-m-d H:i:s') . "</p> <p>请及时处理新阶段的相关工作。</p> <hr> <p><a href='" . get_edit_post_link($product_id) . "'>点击此处管理产品</a></p> "; // 发送邮件 $headers = array('Content-Type: text/html; charset=UTF-8'); wp_mail($author_email, $subject, $message, $headers); // 添加管理通知 add_action('admin_notices', function() use ($product, $new_stage_info) { ?> <div class="notice notice-info"> <p>产品 <strong><?php echo $product->post_title; ?></strong> 已自动推进到 <strong><?php echo $new_stage_info['name']; ?></strong> 阶段。</p> </div> <?php }); } /** * 定期检查并推进阶段 */ public static function schedule_stage_advancement() { if (!wp_next_scheduled('cplm_auto_advance_stages')) { wp_schedule_event(time(), 'daily', 'cplm_auto_advance_stages'); } add_action('cplm_auto_advance_stages', array(__CLASS__, 'auto_advance_stage')); } } // 初始化自动化工作流add_action('init', array('Workflow_Automation', 'schedule_stage_advancement'));?> ## 插件配置与使用 ### 5.1 管理界面配置 <?php/** 添加管理页面 */ public function add_admin_pages() { // 主管理页面 add_menu_page( '文创产品生命周期管理', '文创产品管理', 'manage_options', 'cultural-product-lifecycle', array($this, 'render_admin_dashboard'), 'dashicons-art', 30 ); // 子页面:分析报告 add_submenu_page( 'cultural-product-lifecycle', '产品分析报告', '分析报告', 'manage_options', 'cplm-analytics', array($this, 'render_analytics_page') ); // 子页面:设置 add_submenu_page( 'cultural-product-lifecycle', '插件设置', '设置', 'manage_options', 'cplm-settings', array($this, 'render_settings_page') ); } /** 渲染管理仪表板 */ public function render_admin_dashboard() { ?> <div class="wrap"> <h1
在文创产业快速发展的今天,文创产品从概念构思到市场退出的完整生命周期管理变得日益复杂。传统的产品管理方法往往难以适应文创产品快速迭代、个性化定制和灵活调整的需求。本文将介绍如何通过WordPress插件实现柔性产品生命周期管理,帮助文创企业高效管理产品从创意到退市的每一个阶段。
- WordPress 5.8或更高版本
- PHP 7.4或更高版本
- MySQL 5.6或更高版本
- 至少256MB内存
在开始之前,请确保已安装以下基础插件:
- Advanced Custom Fields(用于自定义字段)
- WooCommerce(如果需要电商功能)
<?php
/**
* Plugin Name: 文创产品生命周期管理器
* Plugin URI: https://yourwebsite.com/
* Description: 用于管理文创产品从概念到退市的完整生命周期
* Version: 1.0.0
* Author: 你的名字
* License: GPL v2 or later
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 定义插件常量
define('CPLM_VERSION', '1.0.0');
define('CPLM_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('CPLM_PLUGIN_URL', plugin_dir_url(__FILE__));
// 初始化插件
add_action('plugins_loaded', 'cplm_init');
function cplm_init() {
// 检查必要组件
if (!class_exists('ACF')) {
add_action('admin_notices', 'cplm_acf_notice');
return;
}
// 加载核心功能
require_once CPLM_PLUGIN_DIR . 'includes/class-product-lifecycle.php';
require_once CPLM_PLUGIN_DIR . 'includes/class-product-stages.php';
require_once CPLM_PLUGIN_DIR . 'includes/class-analytics.php';
// 初始化主类
$cplm_main = new Product_Lifecycle_Manager();
$cplm_main->init();
}
function cplm_acf_notice() {
?>
<div class="notice notice-error">
<p>文创产品生命周期管理器需要Advanced Custom Fields插件。请先安装并激活ACF插件。</p>
</div>
<?php
}
?>
<?php
/**
* Plugin Name: 文创产品生命周期管理器
* Plugin URI: https://yourwebsite.com/
* Description: 用于管理文创产品从概念到退市的完整生命周期
* Version: 1.0.0
* Author: 你的名字
* License: GPL v2 or later
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 定义插件常量
define('CPLM_VERSION', '1.0.0');
define('CPLM_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('CPLM_PLUGIN_URL', plugin_dir_url(__FILE__));
// 初始化插件
add_action('plugins_loaded', 'cplm_init');
function cplm_init() {
// 检查必要组件
if (!class_exists('ACF')) {
add_action('admin_notices', 'cplm_acf_notice');
return;
}
// 加载核心功能
require_once CPLM_PLUGIN_DIR . 'includes/class-product-lifecycle.php';
require_once CPLM_PLUGIN_DIR . 'includes/class-product-stages.php';
require_once CPLM_PLUGIN_DIR . 'includes/class-analytics.php';
// 初始化主类
$cplm_main = new Product_Lifecycle_Manager();
$cplm_main->init();
}
function cplm_acf_notice() {
?>
<div class="notice notice-error">
<p>文创产品生命周期管理器需要Advanced Custom Fields插件。请先安装并激活ACF插件。</p>
</div>
<?php
}
?>
<?php
/**
* 产品生命周期阶段管理类
*/
class Product_Stages_Manager {
private $stages = array();
public function __construct() {
$this->define_stages();
}
/**
* 定义文创产品的生命周期阶段
*/
private function define_stages() {
$this->stages = array(
'concept' => array(
'name' => '概念阶段',
'description' => '创意构思和市场调研',
'color' => '#3498db',
'order' => 1,
'fields' => array('idea_description', 'target_audience', 'feasibility_analysis')
),
'design' => array(
'name' => '设计开发',
'description' => '产品设计和原型制作',
'color' => '#2ecc71',
'order' => 2,
'fields' => array('design_files', 'prototype_images', 'material_list')
),
'production' => array(
'name' => '生产制造',
'description' => '小批量试产和量产',
'color' => '#f39c12',
'order' => 3,
'fields' => array('production_cost', 'quality_control', 'supplier_info')
),
'marketing' => array(
'name' => '营销推广',
'description' => '市场推广和销售',
'color' => '#9b59b6',
'order' => 4,
'fields' => array('marketing_plan', 'sales_channels', 'promotion_budget')
),
'maintenance' => array(
'name' => '运营维护',
'description' => '产品维护和用户反馈',
'color' => '#34495e',
'order' => 5,
'fields' => array('customer_feedback', 'update_plans', 'support_requests')
),
'retirement' => array(
'name' => '退市处理',
'description' => '产品退市和库存处理',
'color' => '#e74c3c',
'order' => 6,
'fields' => array('retirement_reason', 'inventory_disposal', 'replacement_product')
)
);
}
/**
* 获取所有阶段
*/
public function get_stages() {
return $this->stages;
}
/**
* 获取特定阶段
*/
public function get_stage($stage_id) {
return isset($this->stages[$stage_id]) ? $this->stages[$stage_id] : false;
}
/**
* 获取下一阶段
*/
public function get_next_stage($current_stage) {
$stages = $this->stages;
$current_order = $stages[$current_stage]['order'];
foreach ($stages as $stage_id => $stage) {
if ($stage['order'] == $current_order + 1) {
return $stage_id;
}
}
return false;
}
}
?>
<?php
/**
* 产品生命周期阶段管理类
*/
class Product_Stages_Manager {
private $stages = array();
public function __construct() {
$this->define_stages();
}
/**
* 定义文创产品的生命周期阶段
*/
private function define_stages() {
$this->stages = array(
'concept' => array(
'name' => '概念阶段',
'description' => '创意构思和市场调研',
'color' => '#3498db',
'order' => 1,
'fields' => array('idea_description', 'target_audience', 'feasibility_analysis')
),
'design' => array(
'name' => '设计开发',
'description' => '产品设计和原型制作',
'color' => '#2ecc71',
'order' => 2,
'fields' => array('design_files', 'prototype_images', 'material_list')
),
'production' => array(
'name' => '生产制造',
'description' => '小批量试产和量产',
'color' => '#f39c12',
'order' => 3,
'fields' => array('production_cost', 'quality_control', 'supplier_info')
),
'marketing' => array(
'name' => '营销推广',
'description' => '市场推广和销售',
'color' => '#9b59b6',
'order' => 4,
'fields' => array('marketing_plan', 'sales_channels', 'promotion_budget')
),
'maintenance' => array(
'name' => '运营维护',
'description' => '产品维护和用户反馈',
'color' => '#34495e',
'order' => 5,
'fields' => array('customer_feedback', 'update_plans', 'support_requests')
),
'retirement' => array(
'name' => '退市处理',
'description' => '产品退市和库存处理',
'color' => '#e74c3c',
'order' => 6,
'fields' => array('retirement_reason', 'inventory_disposal', 'replacement_product')
)
);
}
/**
* 获取所有阶段
*/
public function get_stages() {
return $this->stages;
}
/**
* 获取特定阶段
*/
public function get_stage($stage_id) {
return isset($this->stages[$stage_id]) ? $this->stages[$stage_id] : false;
}
/**
* 获取下一阶段
*/
public function get_next_stage($current_stage) {
$stages = $this->stages;
$current_order = $stages[$current_stage]['order'];
foreach ($stages as $stage_id => $stage) {
if ($stage['order'] == $current_order + 1) {
return $stage_id;
}
}
return false;
}
}
?>
<?php
/**
* 产品生命周期管理主类
*/
class Product_Lifecycle_Manager {
private $stages_manager;
public function init() {
$this->stages_manager = new Product_Stages_Manager();
// 注册自定义文章类型
add_action('init', array($this, 'register_post_types'));
// 添加管理页面
add_action('admin_menu', array($this, 'add_admin_pages'));
// 注册自定义字段
add_action('acf/init', array($this, 'register_custom_fields'));
// 添加短代码
add_shortcode('product_lifecycle', array($this, 'lifecycle_shortcode'));
}
/**
* 注册文创产品自定义文章类型
*/
public function register_post_types() {
$labels = array(
'name' => '文创产品',
'singular_name' => '文创产品',
'menu_name' => '文创产品',
'add_new' => '添加新产品',
'add_new_item' => '添加新文创产品',
'edit_item' => '编辑文创产品',
'new_item' => '新文创产品',
'view_item' => '查看文创产品',
'search_items' => '搜索文创产品',
'not_found' => '未找到文创产品',
'not_found_in_trash' => '回收站中无文创产品'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'menu_icon' => 'dashicons-art',
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
'rewrite' => array('slug' => 'cultural-products'),
'show_in_rest' => true,
'taxonomies' => array('product_category')
);
register_post_type('cultural_product', $args);
// 注册产品分类
register_taxonomy(
'product_category',
'cultural_product',
array(
'label' => '产品分类',
'rewrite' => array('slug' => 'product-category'),
'hierarchical' => true,
'show_admin_column' => true
)
);
}
/**
* 注册产品生命周期字段
*/
public function register_custom_fields() {
if (!function_exists('acf_add_local_field_group')) return;
$stages = $this->stages_manager->get_stages();
$fields = array();
// 添加当前阶段选择字段
$fields[] = array(
'key' => 'field_current_stage',
'label' => '当前阶段',
'name' => 'current_stage',
'type' => 'select',
'choices' => array(),
'default_value' => 'concept'
);
// 为每个阶段生成选项
foreach ($stages as $stage_id => $stage) {
$fields[0]['choices'][$stage_id] = $stage['name'];
}
// 添加阶段时间线字段
$fields[] = array(
'key' => 'field_stage_timeline',
'label' => '阶段时间线',
'name' => 'stage_timeline',
'type' => 'repeater',
'sub_fields' => array(
array(
'key' => 'field_stage_id',
'label' => '阶段',
'name' => 'stage',
'type' => 'select',
'choices' => $fields[0]['choices']
),
array(
'key' => 'field_start_date',
'label' => '开始日期',
'name' => 'start_date',
'type' => 'date_picker'
),
array(
'key' => 'field_end_date',
'label' => '结束日期',
'name' => 'end_date',
'type' => 'date_picker'
),
array(
'key' => 'field_stage_notes',
'label' => '阶段备注',
'name' => 'notes',
'type' => 'textarea'
)
)
);
// 添加产品数据字段
$fields[] = array(
'key' => 'field_product_data',
'label' => '产品数据',
'name' => 'product_data',
'type' => 'group',
'sub_fields' => array(
array(
'key' => 'field_development_cost',
'label' => '开发成本',
'name' => 'development_cost',
'type' => 'number'
),
array(
'key' => 'field_production_cost',
'label' => '生产成本',
'name' => 'production_cost',
'type' => 'number'
),
array(
'key' => 'field_expected_sales',
'label' => '预期销量',
'name' => 'expected_sales',
'type' => 'number'
),
array(
'key' => 'field_actual_sales',
'label' => '实际销量',
'name' => 'actual_sales',
'type' => 'number'
)
)
);
acf_add_local_field_group(array(
'key' => 'group_product_lifecycle',
'title' => '产品生命周期管理',
'fields' => $fields,
'location' => array(
array(
array(
'param' => 'post_type',
'operator' => '==',
'value' => 'cultural_product',
),
),
),
));
}
}
?>
<?php
/**
* 产品生命周期管理主类
*/
class Product_Lifecycle_Manager {
private $stages_manager;
public function init() {
$this->stages_manager = new Product_Stages_Manager();
// 注册自定义文章类型
add_action('init', array($this, 'register_post_types'));
// 添加管理页面
add_action('admin_menu', array($this, 'add_admin_pages'));
// 注册自定义字段
add_action('acf/init', array($this, 'register_custom_fields'));
// 添加短代码
add_shortcode('product_lifecycle', array($this, 'lifecycle_shortcode'));
}
/**
* 注册文创产品自定义文章类型
*/
public function register_post_types() {
$labels = array(
'name' => '文创产品',
'singular_name' => '文创产品',
'menu_name' => '文创产品',
'add_new' => '添加新产品',
'add_new_item' => '添加新文创产品',
'edit_item' => '编辑文创产品',
'new_item' => '新文创产品',
'view_item' => '查看文创产品',
'search_items' => '搜索文创产品',
'not_found' => '未找到文创产品',
'not_found_in_trash' => '回收站中无文创产品'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'menu_icon' => 'dashicons-art',
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
'rewrite' => array('slug' => 'cultural-products'),
'show_in_rest' => true,
'taxonomies' => array('product_category')
);
register_post_type('cultural_product', $args);
// 注册产品分类
register_taxonomy(
'product_category',
'cultural_product',
array(
'label' => '产品分类',
'rewrite' => array('slug' => 'product-category'),
'hierarchical' => true,
'show_admin_column' => true
)
);
}
/**
* 注册产品生命周期字段
*/
public function register_custom_fields() {
if (!function_exists('acf_add_local_field_group')) return;
$stages = $this->stages_manager->get_stages();
$fields = array();
// 添加当前阶段选择字段
$fields[] = array(
'key' => 'field_current_stage',
'label' => '当前阶段',
'name' => 'current_stage',
'type' => 'select',
'choices' => array(),
'default_value' => 'concept'
);
// 为每个阶段生成选项
foreach ($stages as $stage_id => $stage) {
$fields[0]['choices'][$stage_id] = $stage['name'];
}
// 添加阶段时间线字段
$fields[] = array(
'key' => 'field_stage_timeline',
'label' => '阶段时间线',
'name' => 'stage_timeline',
'type' => 'repeater',
'sub_fields' => array(
array(
'key' => 'field_stage_id',
'label' => '阶段',
'name' => 'stage',
'type' => 'select',
'choices' => $fields[0]['choices']
),
array(
'key' => 'field_start_date',
'label' => '开始日期',
'name' => 'start_date',
'type' => 'date_picker'
),
array(
'key' => 'field_end_date',
'label' => '结束日期',
'name' => 'end_date',
'type' => 'date_picker'
),
array(
'key' => 'field_stage_notes',
'label' => '阶段备注',
'name' => 'notes',
'type' => 'textarea'
)
)
);
// 添加产品数据字段
$fields[] = array(
'key' => 'field_product_data',
'label' => '产品数据',
'name' => 'product_data',
'type' => 'group',
'sub_fields' => array(
array(
'key' => 'field_development_cost',
'label' => '开发成本',
'name' => 'development_cost',
'type' => 'number'
),
array(
'key' => 'field_production_cost',
'label' => '生产成本',
'name' => 'production_cost',
'type' => 'number'
),
array(
'key' => 'field_expected_sales',
'label' => '预期销量',
'name' => 'expected_sales',
'type' => 'number'
),
array(
'key' => 'field_actual_sales',
'label' => '实际销量',
'name' => 'actual_sales',
'type' => 'number'
)
)
);
acf_add_local_field_group(array(
'key' => 'group_product_lifecycle',
'title' => '产品生命周期管理',
'fields' => $fields,
'location' => array(
array(
array(
'param' => 'post_type',
'operator' => '==',
'value' => 'cultural_product',
),
),
),
));
}
}
?>
<?php
/**
* 产品生命周期可视化短代码
*/
public function lifecycle_shortcode($atts) {
$atts = shortcode_atts(array(
'product_id' => get_the_ID(),
'show_timeline' => true,
'show_metrics' => true
), $atts);
$product_id = intval($atts['product_id']);
$output = '';
// 获取产品信息
$current_stage = get_field('current_stage', $product_id);
$stage_timeline = get_field('stage_timeline', $product_id);
$product_data = get_field('product_data', $product_id);
// 获取阶段管理器
$stages_manager = new Product_Stages_Manager();
$stages = $stages_manager->get_stages();
// 构建生命周期可视化
$output .= '<div class="product-lifecycle-container">';
$output .= '<h3>产品生命周期进度</h3>';
// 阶段进度条
$output .= '<div class="lifecycle-progress-bar">';
$total_stages = count($stages);
$current_order = $stages[$current_stage]['order'];
$progress_percentage = ($current_order / $total_stages) * 100;
$output .= '<div class="progress-track">';
foreach ($stages as $stage_id => $stage) {
$is_active = $stage['order'] <= $current_order;
$is_current = $stage_id === $current_stage;
$output .= '<div class="progress-stage ' . ($is_active ? 'active' : '') . ' ' . ($is_current ? 'current' : '') . '" style="border-color: ' . $stage['color'] . '">';
$output .= '<span class="stage-icon" style="background-color: ' . $stage['color'] . '"></span>';
$output .= '<span class="stage-name">' . $stage['name'] . '</span>';
$output .= '</div>';
}
$output .= '</div>';
$output .= '<div class="progress-bar">';
$output .= '<div class="progress-fill" style="width: ' . $progress_percentage . '%; background: linear-gradient(90deg, ';
// 创建渐变颜色
$color_count = 0;
foreach ($stages as $stage_id => $stage) {
if ($stage['order'] <= $current_order) {
if ($color_count > 0) $output .= ', ';
$output .= $stage['color'] . ' ' . (($stage['order'] - 1) / $total_stages * 100) . '%';
$color_count++;
}
}
$output .= ')"></div>';
$output .= '</div>';
$output .= '</div>';
// 显示当前阶段详情
if (isset($stages[$current_stage])) {
$current_stage_info = $stages[$current_stage];
$output .= '<div class="current-stage-info" style="border-left: 4px solid ' . $current_stage_info['color'] . '">';
$output .= '<h4>当前阶段: ' . $current_stage_info['name'] . '</h4>';
$output .= '<p>' . $current_stage_info['description'] . '</p>';
// 显示阶段时间线
if ($stage_timeline) {
$output .= '<div class="stage-timeline">';
foreach ($stage_timeline as $timeline_item) {
if ($timeline_item['stage'] == $current_stage) {
$output .= '<p><strong>开始时间:</strong> ' . $timeline_item['start_date'] . '</p>';
if ($timeline_item['end_date']) {
$output .= '<p><strong>结束时间:</strong> ' . $timeline_item['end_date'] . '</p>';
}
if ($timeline_item['notes']) {
$output .= '<p><strong>备注:</strong> ' . $timeline_item['notes'] . '</p>';
}
}
}
$output .= '</div>';
}
$output .= '</div>';
}
// 显示产品指标
if ($atts['show_metrics'] && $product_data) {
$output .= '<div class="product-metrics">';
$output .= '<h4>产品指标</h4>';
$output .= '<div class="metrics-grid">';
$metrics = array(
'development_cost' => '开发成本',
'production_cost' => '生产成本',
'expected_sales' => '预期销量',
'actual_sales' => '实际销量'
);
foreach ($metrics as $key => $label) {
if (isset($product_data[$key]) && $product_data[$key] !== '') {
$value = $product_data[$key];
$output .= '<div class="metric-item">';
$output .= '<span class="metric-label">' . $label . '</span>';
$output .= '<span class="metric-value">' . $value . '</span>';
$output .= '</div>';
}
}
// 计算投资回报率(简化版)
if (isset($product_data['development_cost']) && isset($product_data['production_cost']) && isset($product_data['actual_sales'])) {
$total_cost = floatval($product_data['development_cost']) + floatval($product_data['production_cost']);
$revenue = floatval($product_data['actual_sales']) * 100; // 假设单价100元
if ($total_cost > 0) {
$roi = (($revenue - $total_cost) / $total_cost) * 100;
$output .= '<div class="metric-item">';
$output .= '<span class="metric-label">投资回报率</span>';
$output .= '<span class="metric-value">' . number_format($roi, 2) . '%</span>';
$output .= '</div>';
}
}
$output .= '</div>';
$output .= '</div>';
}
$output .= '</div>';
// 添加CSS样式
$output .= '<style>
.product-lifecycle-container {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
padding: 20px;
background: #f8f9fa;
border-radius: 8px;
margin: 20px 0;
}
.lifecycle-progress-bar {
margin: 30px 0;
}
.progress-track {
display: flex;
justify-content: space-between;
.progress-stage {
flex: 1;
text-align: center;
padding: 10px 5px;
position: relative;
border-top: 3px solid #ddd;
transition: all 0.3s ease;
}
.progress-stage.active {
border-color: #4CAF50;
}
.progress-stage.current {
border-color: #2196F3;
font-weight: bold;
}
.stage-icon {
display: block;
width: 20px;
height: 20px;
border-radius: 50%;
margin: 0 auto 5px;
background-color: #ddd;
}
.progress-bar {
height: 8px;
background-color: #e0e0e0;
border-radius: 4px;
overflow: hidden;
}
.progress-fill {
height: 100%;
transition: width 0.5s ease;
}
.current-stage-info {
background: white;
padding: 15px;
border-radius: 5px;
margin: 20px 0;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.product-metrics {
background: white;
padding: 15px;
border-radius: 5px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.metrics-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 15px;
margin-top: 15px;
}
.metric-item {
padding: 10px;
background: #f5f5f5;
border-radius: 4px;
}
.metric-label {
display: block;
font-size: 12px;
color: #666;
margin-bottom: 5px;
}
.metric-value {
display: block;
font-size: 18px;
font-weight: bold;
color: #333;
}
</style>';
return $output;
<?php
/**
* 产品生命周期可视化短代码
*/
public function lifecycle_shortcode($atts) {
$atts = shortcode_atts(array(
'product_id' => get_the_ID(),
'show_timeline' => true,
'show_metrics' => true
), $atts);
$product_id = intval($atts['product_id']);
$output = '';
// 获取产品信息
$current_stage = get_field('current_stage', $product_id);
$stage_timeline = get_field('stage_timeline', $product_id);
$product_data = get_field('product_data', $product_id);
// 获取阶段管理器
$stages_manager = new Product_Stages_Manager();
$stages = $stages_manager->get_stages();
// 构建生命周期可视化
$output .= '<div class="product-lifecycle-container">';
$output .= '<h3>产品生命周期进度</h3>';
// 阶段进度条
$output .= '<div class="lifecycle-progress-bar">';
$total_stages = count($stages);
$current_order = $stages[$current_stage]['order'];
$progress_percentage = ($current_order / $total_stages) * 100;
$output .= '<div class="progress-track">';
foreach ($stages as $stage_id => $stage) {
$is_active = $stage['order'] <= $current_order;
$is_current = $stage_id === $current_stage;
$output .= '<div class="progress-stage ' . ($is_active ? 'active' : '') . ' ' . ($is_current ? 'current' : '') . '" style="border-color: ' . $stage['color'] . '">';
$output .= '<span class="stage-icon" style="background-color: ' . $stage['color'] . '"></span>';
$output .= '<span class="stage-name">' . $stage['name'] . '</span>';
$output .= '</div>';
}
$output .= '</div>';
$output .= '<div class="progress-bar">';
$output .= '<div class="progress-fill" style="width: ' . $progress_percentage . '%; background: linear-gradient(90deg, ';
// 创建渐变颜色
$color_count = 0;
foreach ($stages as $stage_id => $stage) {
if ($stage['order'] <= $current_order) {
if ($color_count > 0) $output .= ', ';
$output .= $stage['color'] . ' ' . (($stage['order'] - 1) / $total_stages * 100) . '%';
$color_count++;
}
}
$output .= ')"></div>';
$output .= '</div>';
$output .= '</div>';
// 显示当前阶段详情
if (isset($stages[$current_stage])) {
$current_stage_info = $stages[$current_stage];
$output .= '<div class="current-stage-info" style="border-left: 4px solid ' . $current_stage_info['color'] . '">';
$output .= '<h4>当前阶段: ' . $current_stage_info['name'] . '</h4>';
$output .= '<p>' . $current_stage_info['description'] . '</p>';
// 显示阶段时间线
if ($stage_timeline) {
$output .= '<div class="stage-timeline">';
foreach ($stage_timeline as $timeline_item) {
if ($timeline_item['stage'] == $current_stage) {
$output .= '<p><strong>开始时间:</strong> ' . $timeline_item['start_date'] . '</p>';
if ($timeline_item['end_date']) {
$output .= '<p><strong>结束时间:</strong> ' . $timeline_item['end_date'] . '</p>';
}
if ($timeline_item['notes']) {
$output .= '<p><strong>备注:</strong> ' . $timeline_item['notes'] . '</p>';
}
}
}
$output .= '</div>';
}
$output .= '</div>';
}
// 显示产品指标
if ($atts['show_metrics'] && $product_data) {
$output .= '<div class="product-metrics">';
$output .= '<h4>产品指标</h4>';
$output .= '<div class="metrics-grid">';
$metrics = array(
'development_cost' => '开发成本',
'production_cost' => '生产成本',
'expected_sales' => '预期销量',
'actual_sales' => '实际销量'
);
foreach ($metrics as $key => $label) {
if (isset($product_data[$key]) && $product_data[$key] !== '') {
$value = $product_data[$key];
$output .= '<div class="metric-item">';
$output .= '<span class="metric-label">' . $label . '</span>';
$output .= '<span class="metric-value">' . $value . '</span>';
$output .= '</div>';
}
}
// 计算投资回报率(简化版)
if (isset($product_data['development_cost']) && isset($product_data['production_cost']) && isset($product_data['actual_sales'])) {
$total_cost = floatval($product_data['development_cost']) + floatval($product_data['production_cost']);
$revenue = floatval($product_data['actual_sales']) * 100; // 假设单价100元
if ($total_cost > 0) {
$roi = (($revenue - $total_cost) / $total_cost) * 100;
$output .= '<div class="metric-item">';
$output .= '<span class="metric-label">投资回报率</span>';
$output .= '<span class="metric-value">' . number_format($roi, 2) . '%</span>';
$output .= '</div>';
}
}
$output .= '</div>';
$output .= '</div>';
}
$output .= '</div>';
// 添加CSS样式
$output .= '<style>
.product-lifecycle-container {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
padding: 20px;
background: #f8f9fa;
border-radius: 8px;
margin: 20px 0;
}
.lifecycle-progress-bar {
margin: 30px 0;
}
.progress-track {
display: flex;
justify-content: space-between;
.progress-stage {
flex: 1;
text-align: center;
padding: 10px 5px;
position: relative;
border-top: 3px solid #ddd;
transition: all 0.3s ease;
}
.progress-stage.active {
border-color: #4CAF50;
}
.progress-stage.current {
border-color: #2196F3;
font-weight: bold;
}
.stage-icon {
display: block;
width: 20px;
height: 20px;
border-radius: 50%;
margin: 0 auto 5px;
background-color: #ddd;
}
.progress-bar {
height: 8px;
background-color: #e0e0e0;
border-radius: 4px;
overflow: hidden;
}
.progress-fill {
height: 100%;
transition: width 0.5s ease;
}
.current-stage-info {
background: white;
padding: 15px;
border-radius: 5px;
margin: 20px 0;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.product-metrics {
background: white;
padding: 15px;
border-radius: 5px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.metrics-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 15px;
margin-top: 15px;
}
.metric-item {
padding: 10px;
background: #f5f5f5;
border-radius: 4px;
}
.metric-label {
display: block;
font-size: 12px;
color: #666;
margin-bottom: 5px;
}
.metric-value {
display: block;
font-size: 18px;
font-weight: bold;
color: #333;
}
</style>';
return $output;
}
## 高级功能实现
### 4.1 数据分析与报告
<?php
/**
- 产品数据分析类
*/
class Product_Analytics {
/**
* 获取产品生命周期统计数据
*/
public static function get_lifecycle_stats($product_id = null) {
global $wpdb;
$stats = array();
// 获取所有文创产品
$args = array(
'post_type' => 'cultural_product',
'posts_per_page' => -1,
'post_status' => 'publish'
);
if ($product_id) {
$args['p'] = $product_id;
}
$products = get_posts($args);
// 初始化统计数据
$stage_counts = array(
'concept' => 0,
'design' => 0,
'production' => 0,
'marketing' => 0,
'maintenance' => 0,
'retirement' => 0
);
$total_development_cost = 0;
$total_production_cost = 0;
$total_expected_sales = 0;
$total_actual_sales = 0;
$product_count = 0;
foreach ($products as $product) {
$current_stage = get_field('current_stage', $product->ID);
$product_data = get_field('product_data', $product->ID);
// 统计各阶段产品数量
if (isset($stage_counts[$current_stage])) {
$stage_counts[$current_stage]++;
}
// 累加财务数据
if ($product_data) {
if (isset($product_data['development_cost'])) {
$total_development_cost += floatval($product_data['development_cost']);
}
if (isset($product_data['production_cost'])) {
$total_production_cost += floatval($product_data['production_cost']);
}
if (isset($product_data['expected_sales'])) {
$total_expected_sales += floatval($product_data['expected_sales']);
}
if (isset($product_data['actual_sales'])) {
$total_actual_sales += floatval($product_data['actual_sales']);
}
}
$product_count++;
}
// 计算平均数据
$stats['stage_distribution'] = $stage_counts;
$stats['total_products'] = $product_count;
$stats['avg_development_cost'] = $product_count > 0 ? $total_development_cost / $product_count : 0;
$stats['avg_production_cost'] = $product_count > 0 ? $total_production_cost / $product_count : 0;
$stats['sales_achievement_rate'] = $total_expected_sales > 0 ? ($total_actual_sales / $total_expected_sales) * 100 : 0;
return $stats;
}
/**
* 生成生命周期报告
*/
public static function generate_lifecycle_report($product_id = null) {
$stats = self::get_lifecycle_stats($product_id);
$report = array(
'summary' => array(
'total_products' => $stats['total_products'],
'most_common_stage' => array_search(max($stats['stage_distribution']), $stats['stage_distribution']),
'avg_total_cost' => $stats['avg_development_cost'] + $stats['avg_production_cost'],
'sales_achievement_rate' => round($stats['sales_achievement_rate'], 2)
),
'stage_analysis' => $stats['stage_distribution'],
'financial_metrics' => array(
'avg_development_cost' => round($stats['avg_development_cost'], 2),
'avg_production_cost' => round($stats['avg_production_cost'], 2),
'total_investment' => round($stats['avg_development_cost'] + $stats['avg_production_cost'], 2)
),
'recommendations' => array()
);
// 基于数据分析生成建议
if ($stats['stage_distribution']['concept'] > $stats['total_products'] * 0.4) {
$report['recommendations'][] = '概念阶段产品过多,建议加快产品开发进度';
}
if ($stats['sales_achievement_rate'] < 80) {
$report['recommendations'][] = '销售达成率较低,建议重新评估市场策略';
}
return $report;
}
/**
* 显示分析报告短代码
*/
public static function analytics_report_shortcode($atts) {
$atts = shortcode_atts(array(
'type' => 'summary', // summary, detailed, comparison
'product_id' => null
), $atts);
$report = self::generate_lifecycle_report($atts['product_id']);
ob_start();
?>
<div class="analytics-report">
<h3>文创产品生命周期分析报告</h3>
<div class="report-summary">
<h4>概要</h4>
<div class="summary-grid">
<div class="summary-item">
<span class="summary-label">产品总数</span>
<span class="summary-value"><?php echo $report['summary']['total_products']; ?></span>
</div>
<div class="summary-item">
<span class="summary-label">主要阶段</span>
<span class="summary-value"><?php echo $report['summary']['most_common_stage']; ?></span>
</div>
<div class="summary-item">
<span class="summary-label">平均总成本</span>
<span class="summary-value">¥<?php echo number_format($report['summary']['avg_total_cost'], 2); ?></span>
</div>
<div class="summary-item">
<span class="summary-label">销售达成率</span>
<span class="summary-value"><?php echo $report['summary']['sales_achievement_rate']; ?>%</span>
</div>
</div>
</div>
<div class="stage-analysis">
<h4>阶段分布</h4>
<div class="stage-chart">
<?php foreach ($report['stage_analysis'] as $stage => $count): ?>
<div class="stage-bar">
<div class="stage-label"><?php echo $stage; ?></div>
<div class="stage-bar-container">
<div class="stage-bar-fill" style="width: <?php echo ($count / $report['summary']['total_products']) * 100; ?>%">
<span class="stage-count"><?php echo $count; ?></span>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<?php if (!empty($report['recommendations'])): ?>
<div class="recommendations">
<h4>优化建议</h4>
<ul>
<?php foreach ($report['recommendations'] as $recommendation): ?>
<li><?php echo $recommendation; ?></li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
</div>
<style>
.analytics-report {
background: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.summary-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 15px;
margin: 15px 0;
}
.summary-item {
padding: 15px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border-radius: 6px;
text-align: center;
}
.summary-label {
display: block;
font-size: 14px;
opacity: 0.9;
margin-bottom: 5px;
}
.summary-value {
display: block;
font-size: 24px;
font-weight: bold;
}
.stage-chart {
margin: 20px 0;
}
.stage-bar {
margin: 10px 0;
display: flex;
align-items: center;
}
.stage-label {
width: 120px;
font-weight: bold;
}
.stage-bar-container {
flex: 1;
height: 30px;
background: #f0f0f0;
border-radius: 4px;
overflow: hidden;
}
.stage-bar-fill {
height: 100%;
background: linear-gradient(90deg, #4CAF50, #8BC34A);
display: flex;
align-items: center;
justify-content: flex-end;
padding-right: 10px;
transition: width 1s ease;
}
.stage-count {
color: white;
font-weight: bold;
text-shadow: 1px 1px 2px rgba(0,0,0,0.3);
}
.recommendations ul {
list-style-type: none;
padding-left: 0;
}
.recommendations li {
padding: 10px;
margin: 5px 0;
background: #fff3cd;
border-left: 4px solid #ffc107;
border-radius: 4px;
}
</style>
<?php
return ob_get_clean();
}
}
// 注册短代码
add_shortcode('product_analytics', array('Product_Analytics', 'analytics_report_shortcode'));
?>
### 4.2 自动化工作流
<?php
/**
- 自动化工作流管理
*/
class Workflow_Automation {
/**
* 自动推进产品阶段
*/
public static function auto_advance_stage() {
$products = get_posts(array(
'post_type' => 'cultural_product',
'posts_per_page' => -1,
'post_status' => 'publish'
));
$stages_manager = new Product_Stages_Manager();
$advanced_count = 0;
foreach ($products as $product) {
$current_stage = get_field('current_stage', $product->ID);
$stage_timeline = get_field('stage_timeline', $product->ID);
// 获取当前阶段的时间信息
$current_stage_data = null;
if ($stage_timeline) {
foreach ($stage_timeline as $item) {
if ($item['stage'] == $current_stage) {
$current_stage_data = $item;
break;
}
}
}
// 检查是否需要推进阶段
if ($current_stage_data && $current_stage_data['end_date']) {
$end_date = DateTime::createFromFormat('Ymd', $current_stage_data['end_date']);
$today = new DateTime();
// 如果阶段结束日期已过,自动推进到下一阶段
if ($end_date < $today) {
$next_stage = $stages_manager->get_next_stage($current_stage);
if ($next_stage) {
// 更新当前阶段
update_field('current_stage', $next_stage, $product->ID);
// 更新阶段时间线
if ($stage_timeline) {
$stage_timeline[] = array(
'stage' => $next_stage,
'start_date' => date('Ymd'),
'end_date' => '',
'notes' => '自动推进到下一阶段'
);
update_field('stage_timeline', $stage_timeline, $product->ID);
}
// 发送通知
self::send_stage_advance_notification($product->ID, $current_stage, $next_stage);
$advanced_count++;
}
}
}
}
return $advanced_count;
}
/**
* 发送阶段推进通知
*/
private static function send_stage_advance_notification($product_id, $old_stage, $new_stage) {
$product = get_post($product_id);
$stages_manager = new Product_Stages_Manager();
$old_stage_info = $stages_manager->get_stage($old_stage);
$new_stage_info = $stages_manager->get_stage($new_stage);
// 获取产品负责人(这里假设使用作者)
$author_id = $product->post_author;
$author_email = get_the_author_meta('user_email', $author_id);
$subject = '产品阶段已自动推进: ' . $product->post_title;
$message = "
<h3>产品阶段更新通知</h3>
<p>您的文创产品 <strong>{$product->post_title}</strong> 已从 <strong>{$old_stage_info['name']}</strong> 阶段自动推进到 <strong>{$new_stage_info['name']}</strong> 阶段。</p>
<p><strong>原阶段:</strong> {$old_stage_info['description']}</p>
<p><strong>新阶段:</strong> {$new_stage_info['description']}</p>
<p><strong>推进时间:</strong> " . date('Y-m-d H:i:s') . "</p>
<p>请及时处理新阶段的相关工作。</p>
<hr>
<p><a href='" . get_edit_post_link($product_id) . "'>点击此处管理产品</a></p>
";
// 发送邮件
$headers = array('Content-Type: text/html; charset=UTF-8');
wp_mail($author_email, $subject, $message, $headers);
// 添加管理通知
add_action('admin_notices', function() use ($product, $new_stage_info) {
?>
<div class="notice notice-info">
<p>产品 <strong><?php echo $product->post_title; ?></strong> 已自动推进到 <strong><?php echo $new_stage_info['name']; ?></strong> 阶段。</p>
</div>
<?php
});
}
/**
* 定期检查并推进阶段
*/
public static function schedule_stage_advancement() {
if (!wp_next_scheduled('cplm_auto_advance_stages')) {
wp_schedule_event(time(), 'daily', 'cplm_auto_advance_stages');
}
add_action('cplm_auto_advance_stages', array(__CLASS__, 'auto_advance_stage'));
}
}
// 初始化自动化工作流
add_action('init', array('Workflow_Automation', 'schedule_stage_advancement'));
?>
## 插件配置与使用
### 5.1 管理界面配置
<?php
/**
- 添加管理页面
*/
public function add_admin_pages() {
// 主管理页面
add_menu_page(
'文创产品生命周期管理',
'文创产品管理',
'manage_options',
'cultural-product-lifecycle',
array($this, 'render_admin_dashboard'),
'dashicons-art',
30
);
// 子页面:分析报告
add_submenu_page(
'cultural-product-lifecycle',
'产品分析报告',
'分析报告',
'manage_options',
'cplm-analytics',
array($this, 'render_analytics_page')
);
// 子页面:设置
add_submenu_page(
'cultural-product-lifecycle',
'插件设置',
'设置',
'manage_options',
'cplm-settings',
array($this, 'render_settings_page')
);
}
/**
- 渲染管理仪表板
*/
public function render_admin_dashboard() {
?>
<div class="wrap">
<h1


