首页 / 教程文章 / WordPress小批量定制插件实现绿色供应链管理的教程

WordPress小批量定制插件实现绿色供应链管理的教程

WordPress小批量定制插件实现绿色供应链管理的教程

引言:绿色供应链管理的数字化需求

在当今环保意识日益增强的商业环境中,绿色供应链管理已成为企业可持续发展的重要组成部分。对于中小型企业而言,通过WordPress网站集成绿色供应链管理功能,既能提升企业形象,又能实现环保目标。本教程将指导您开发一个WordPress定制插件,帮助企业管理小批量的绿色供应链流程。

插件规划与功能设计

1.1 核心功能模块

  • 供应商环保资质管理
  • 产品碳足迹追踪
  • 物流路线优化计算
  • 环保材料使用记录
  • 供应链透明度报告

1.2 数据库结构设计

我们需要创建几个自定义数据表来存储供应链信息。

插件基础架构

<?php
/**
 * 插件名称: Green Supply Chain Manager
 * 插件URI: https://yourwebsite.com/
 * 描述: 小批量绿色供应链管理插件
 * 版本: 1.0.0
 * 作者: Your Name
 * 许可证: GPL v2 or later
 */

// 防止直接访问
if (!defined('ABSPATH')) {
    exit;
}

// 定义插件常量
define('GSCM_VERSION', '1.0.0');
define('GSCM_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('GSCM_PLUGIN_URL', plugin_dir_url(__FILE__));

/**
 * 主插件类
 */
class Green_Supply_Chain_Manager {
    
    private static $instance = null;
    
    public static function get_instance() {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    private function __construct() {
        $this->init_hooks();
    }
    
    /**
     * 初始化WordPress钩子
     */
    private function init_hooks() {
        // 激活/停用钩子
        register_activation_hook(__FILE__, array($this, 'activate'));
        register_deactivation_hook(__FILE__, array($this, 'deactivate'));
        
        // 管理菜单
        add_action('admin_menu', array($this, 'add_admin_menu'));
        
        // 初始化
        add_action('init', array($this, 'init'));
    }
    
    /**
     * 插件激活时创建数据库表
     */
    public function activate() {
        $this->create_database_tables();
        flush_rewrite_rules();
    }
    
    /**
     * 插件停用时的清理工作
     */
    public function deactivate() {
        // 可选的清理代码
        flush_rewrite_rules();
    }
    
    /**
     * 初始化插件
     */
    public function init() {
        // 加载文本域
        load_plugin_textdomain('gscm', false, dirname(plugin_basename(__FILE__)) . '/languages');
    }
    
    /**
     * 创建数据库表
     */
    private function create_database_tables() {
        global $wpdb;
        
        $charset_collate = $wpdb->get_charset_collate();
        $table_prefix = $wpdb->prefix . 'gscm_';
        
        // 供应商表
        $suppliers_table = $table_prefix . 'suppliers';
        $suppliers_sql = "CREATE TABLE IF NOT EXISTS $suppliers_table (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            name varchar(100) NOT NULL,
            contact_email varchar(100),
            contact_phone varchar(20),
            eco_certification varchar(200),
            carbon_rating decimal(5,2) DEFAULT 0.00,
            location varchar(200),
            created_at datetime DEFAULT CURRENT_TIMESTAMP,
            updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            PRIMARY KEY (id)
        ) $charset_collate;";
        
        // 产品表
        $products_table = $table_prefix . 'products';
        $products_sql = "CREATE TABLE IF NOT EXISTS $products_table (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            name varchar(200) NOT NULL,
            supplier_id mediumint(9),
            material_composition text,
            carbon_footprint decimal(10,2) DEFAULT 0.00,
            recyclable_percentage decimal(5,2) DEFAULT 0.00,
            weight_kg decimal(10,2),
            created_at datetime DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY (id),
            FOREIGN KEY (supplier_id) REFERENCES {$suppliers_table}(id) ON DELETE SET NULL
        ) $charset_collate;";
        
        // 物流表
        $logistics_table = $table_prefix . 'logistics';
        $logistics_sql = "CREATE TABLE IF NOT EXISTS $logistics_table (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            product_id mediumint(9),
            transport_mode varchar(50),
            distance_km decimal(10,2),
            estimated_carbon decimal(10,2),
            route_details text,
            shipment_date date,
            completed tinyint(1) DEFAULT 0,
            created_at datetime DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY (id),
            FOREIGN KEY (product_id) REFERENCES {$products_table}(id) ON DELETE CASCADE
        ) $charset_collate;";
        
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($suppliers_sql);
        dbDelta($products_sql);
        dbDelta($logistics_sql);
    }
    
    /**
     * 添加管理菜单
     */
    public function add_admin_menu() {
        add_menu_page(
            __('绿色供应链管理', 'gscm'),
            __('绿色供应链', 'gscm'),
            'manage_options',
            'gscm-dashboard',
            array($this, 'display_dashboard'),
            'dashicons-palmtree',
            30
        );
        
        add_submenu_page(
            'gscm-dashboard',
            __('供应商管理', 'gscm'),
            __('供应商', 'gscm'),
            'manage_options',
            'gscm-suppliers',
            array($this, 'display_suppliers_page')
        );
        
        add_submenu_page(
            'gscm-dashboard',
            __('产品管理', 'gscm'),
            __('产品', 'gscm'),
            'manage_options',
            'gscm-products',
            array($this, 'display_products_page')
        );
        
        add_submenu_page(
            'gscm-dashboard',
            __('物流管理', 'gscm'),
            __('物流', 'gscm'),
            'manage_options',
            'gscm-logistics',
            array($this, 'display_logistics_page')
        );
        
        add_submenu_page(
            'gscm-dashboard',
            __('碳足迹报告', 'gscm'),
            __('报告', 'gscm'),
            'manage_options',
            'gscm-reports',
            array($this, 'display_reports_page')
        );
    }
    
    /**
     * 显示仪表板
     */
    public function display_dashboard() {
        include GSCM_PLUGIN_DIR . 'templates/dashboard.php';
    }
    
    /**
     * 显示供应商页面
     */
    public function display_suppliers_page() {
        include GSCM_PLUGIN_DIR . 'templates/suppliers.php';
    }
    
    /**
     * 显示产品页面
     */
    public function display_products_page() {
        include GSCM_PLUGIN_DIR . 'templates/products.php';
    }
    
    /**
     * 显示物流页面
     */
    public function display_logistics_page() {
        include GSCM_PLUGIN_DIR . 'templates/logistics.php';
    }
    
    /**
     * 显示报告页面
     */
    public function display_reports_page() {
        include GSCM_PLUGIN_DIR . 'templates/reports.php';
    }
}

// 初始化插件
Green_Supply_Chain_Manager::get_instance();
?>

供应商管理模块实现

3.1 供应商添加表单处理

<?php
/**
 * 供应商管理类
 */
class GSCM_Supplier_Manager {
    
    /**
     * 添加新供应商
     * @param array $data 供应商数据
     * @return int|WP_Error 供应商ID或错误
     */
    public static function add_supplier($data) {
        global $wpdb;
        
        // 验证必填字段
        if (empty($data['name'])) {
            return new WP_Error('missing_name', __('供应商名称是必填项', 'gscm'));
        }
        
        // 准备插入数据
        $supplier_data = array(
            'name' => sanitize_text_field($data['name']),
            'contact_email' => sanitize_email($data['contact_email']),
            'contact_phone' => sanitize_text_field($data['contact_phone']),
            'eco_certification' => sanitize_textarea_field($data['eco_certification']),
            'carbon_rating' => floatval($data['carbon_rating']),
            'location' => sanitize_text_field($data['location'])
        );
        
        $table_name = $wpdb->prefix . 'gscm_suppliers';
        
        // 插入数据库
        $result = $wpdb->insert($table_name, $supplier_data);
        
        if (false === $result) {
            return new WP_Error('db_error', __('数据库插入失败', 'gscm'));
        }
        
        return $wpdb->insert_id;
    }
    
    /**
     * 获取所有供应商
     * @return array 供应商列表
     */
    public static function get_all_suppliers() {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'gscm_suppliers';
        $query = "SELECT * FROM $table_name ORDER BY created_at DESC";
        
        return $wpdb->get_results($query, ARRAY_A);
    }
    
    /**
     * 计算供应商平均碳评级
     * @return float 平均碳评级
     */
    public static function calculate_average_carbon_rating() {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'gscm_suppliers';
        $query = "SELECT AVG(carbon_rating) as avg_rating FROM $table_name";
        
        $result = $wpdb->get_row($query, ARRAY_A);
        
        return $result ? round(floatval($result['avg_rating']), 2) : 0;
    }
}
?>

碳足迹计算与报告功能

4.1 碳足迹计算器

<?php
/**
 * 碳足迹计算类
 */
class GSCM_Carbon_Calculator {
    
    // 运输方式碳排放系数 (kg CO2 per ton-km)
    private static $transport_factors = array(
        'truck' => 0.21,    // 卡车
        'train' => 0.03,    // 火车
        'ship' => 0.01,     // 船舶
        'plane' => 0.80,    // 飞机
        'electric_vehicle' => 0.05 // 电动车
    );
    
    // 材料碳排放系数 (kg CO2 per kg)
    private static $material_factors = array(
        'recycled_plastic' => 1.5,
        'virgin_plastic' => 3.0,
        'recycled_paper' => 0.7,
        'virgin_paper' => 1.2,
        'organic_cotton' => 2.5,
        'conventional_cotton' => 5.0,
        'bamboo' => 1.0,
        'wood' => 1.8
    );
    
    /**
     * 计算物流碳排放
     * @param string $mode 运输方式
     * @param float $distance 距离(km)
     * @param float $weight 重量(kg)
     * @return float 碳排放量(kg CO2)
     */
    public static function calculate_transport_emissions($mode, $distance, $weight) {
        if (!isset(self::$transport_factors[$mode])) {
            $mode = 'truck'; // 默认使用卡车系数
        }
        
        $factor = self::$transport_factors[$mode];
        $weight_tons = $weight / 1000; // 转换为吨
        
        return $factor * $distance * $weight_tons;
    }
    
    /**
     * 计算材料碳排放
     * @param array $materials 材料数组(array('material_type' => weight_kg))
     * @return float 碳排放量(kg CO2)
     */
    public static function calculate_material_emissions($materials) {
        $total_emissions = 0;
        
        foreach ($materials as $material_type => $weight) {
            if (isset(self::$material_factors[$material_type])) {
                $total_emissions += self::$material_factors[$material_type] * floatval($weight);
            }
        }
        
        return $total_emissions;
    }
    
    /**
     * 生成碳足迹报告
     * @param int $product_id 产品ID
     * @return array 报告数据
     */
    public static function generate_carbon_report($product_id) {
        global $wpdb;
        
        $products_table = $wpdb->prefix . 'gscm_products';
        $logistics_table = $wpdb->prefix . 'gscm_logistics';
        
        // 获取产品信息
        $product = $wpdb->get_row($wpdb->prepare(
            "SELECT * FROM $products_table WHERE id = %d", $product_id
        ), ARRAY_A);
        
        if (!$product) {
            return new WP_Error('product_not_found', __('产品未找到', 'gscm'));
        }
        
        // 获取物流信息
        $logistics = $wpdb->get_results($wpdb->prepare(
            "SELECT * FROM $logistics_table WHERE product_id = %d", $product_id
        ), ARRAY_A);
        
        // 计算总碳排放
        $total_emissions = floatval($product['carbon_footprint']);
        
        foreach ($logistics as $logistic) {
            $transport_emissions = self::calculate_transport_emissions(
                $logistic['transport_mode'],
                floatval($logistic['distance_km']),
                floatval($product['weight_kg'])
            );
            $total_emissions += $transport_emissions;
        }
        
        // 生成报告
        $report = array(
            'product_name' => $product['name'],
            'material_emissions' => floatval($product['carbon_footprint']),
            'transport_emissions' => $total_emissions - floatval($product['carbon_footprint']),
            'total_emissions' => $total_emissions,
            'recyclable_percentage' => floatval($product['recyclable_percentage']),
            'logistics_count' => count($logistics),
            'report_date' => current_time('mysql')
        );
        
        return $report;
    }
}
?>

前端展示与短代码集成

5.1 创建短代码显示供应链信息

<?php
/**
 * 前端展示类
 */
class GSCM_Frontend_Display {
    
    /**
     * 初始化短代码
     */
    public static function init() {
        add_shortcode('gscm_supplier_list', array(__CLASS__, 'display_supplier_list'));
        add_shortcode('gscm_carbon_footprint', array(__CLASS__, 'display_carbon_footprint'));
        add_shortcode('gscm_sustainability_report', array(__CLASS__, 'display_sustainability_report'));
    }
    
    /**
     * 显示供应商列表短代码
     * @param array $atts 短代码属性
     * @return string HTML内容
     */
    public static function display_supplier_list($atts) {
        $atts = shortcode_atts(array(
            'limit' => 10,
            'show_carbon' => 'yes'
        ), $atts, 'gscm_supplier_list');
        
        $suppliers = GSCM_Supplier_Manager::get_all_suppliers();
        $limit = intval($atts['limit']);
        
        if ($limit > 0) {
            $suppliers = array_slice($suppliers, 0, $limit);
        }
        
        ob_start();
        ?>
        <div class="gscm-supplier-list">
            <h3><?php _e('绿色供应商', 'gscm'); ?></h3>
            <div class="supplier-grid">
                <?php foreach ($suppliers as $supplier): ?>
                <div class="supplier-card">
                    <h4><?php echo esc_html($supplier['name']); ?></h4>
                    <p><strong><?php _e('位置:', 'gscm'); ?></strong> <?php echo esc_html($supplier['location']); ?></p>
                    <?php if ($atts['show_carbon'] === 'yes'): ?>
                    <p><strong><?php _e('碳评级:', 'gscm'); ?></strong> 
                        <span class="carbon-rating <?php echo self::get_carbon_rating_class($supplier['carbon_rating']); ?>">
                            <?php echo floatval($supplier['carbon_rating']); ?>/10
                        </span>
                    </p>
                    <?php endif; ?>
                    <?php if (!empty($supplier['eco_certification'])): ?>
                    <p><strong><?php _e('环保认证:', 'gscm'); ?></strong> <?php echo esc_html($supplier['eco_certification']); ?></p>
                    <?php endif; ?>
                </div>
                <?php endforeach; ?>
            </div>
        </div>
        
        <style>
            .gscm-supplier-list .supplier-grid {
                display: grid;
                grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
                gap: 20px;
                margin-top: 20px;
            }
            .supplier-card {
                border: 1px solid #e0e0e0;
                padding: 15px;
                border-radius: 8px;
                background: #f9f9f9;
            }
            .carbon-rating {
                padding: 2px 8px;
            .carbon-rating.excellent { background: #4CAF50; color: white; }
            .carbon-rating.good { background: #8BC34A; color: white; }
            .carbon-rating.fair { background: #FFC107; color: black; }
            .carbon-rating.poor { background: #F44336; color: white; }
        </style>
        <?php
        return ob_get_clean();
    }
    
    /**
     * 根据碳评级获取CSS类
     * @param float $rating 碳评级
     * @return string CSS类名
     */
    private static function get_carbon_rating_class($rating) {
        $rating = floatval($rating);
        if ($rating >= 8) return 'excellent';
        if ($rating >= 6) return 'good';
        if ($rating >= 4) return 'fair';
        return 'poor';
    }
    
    /**
     * 显示产品碳足迹短代码
     * @param array $atts 短代码属性
     * @return string HTML内容
     */
    public static function display_carbon_footprint($atts) {
        $atts = shortcode_atts(array(
            'product_id' => 0
        ), $atts, 'gscm_carbon_footprint');
        
        $product_id = intval($atts['product_id']);
        
        if ($product_id <= 0) {
            return '<p>' . __('请提供有效的产品ID', 'gscm') . '</p>';
        }
        
        $report = GSCM_Carbon_Calculator::generate_carbon_report($product_id);
        
        if (is_wp_error($report)) {
            return '<p>' . $report->get_error_message() . '</p>';
        }
        
        ob_start();
        ?>
        <div class="gscm-carbon-footprint">
            <h3><?php echo sprintf(__('产品碳足迹报告: %s', 'gscm'), esc_html($report['product_name'])); ?></h3>
            
            <div class="carbon-metrics">
                <div class="metric-card">
                    <h4><?php _e('总碳排放', 'gscm'); ?></h4>
                    <div class="metric-value"><?php echo number_format($report['total_emissions'], 2); ?> kg CO₂</div>
                    <p class="metric-label"><?php _e('整个生命周期', 'gscm'); ?></p>
                </div>
                
                <div class="metric-card">
                    <h4><?php _e('材料碳排放', 'gscm'); ?></h4>
                    <div class="metric-value"><?php echo number_format($report['material_emissions'], 2); ?> kg CO₂</div>
                    <p class="metric-label"><?php _e('生产阶段', 'gscm'); ?></p>
                </div>
                
                <div class="metric-card">
                    <h4><?php _e('运输碳排放', 'gscm'); ?></h4>
                    <div class="metric-value"><?php echo number_format($report['transport_emissions'], 2); ?> kg CO₂</div>
                    <p class="metric-label"><?php _e('物流阶段', 'gscm'); ?></p>
                </div>
                
                <div class="metric-card">
                    <h4><?php _e('可回收比例', 'gscm'); ?></h4>
                    <div class="metric-value"><?php echo number_format($report['recyclable_percentage'], 1); ?>%</div>
                    <div class="recycle-bar">
                        <div class="recycle-fill" style="width: <?php echo $report['recyclable_percentage']; ?>%"></div>
                    </div>
                </div>
            </div>
            
            <div class="carbon-breakdown">
                <h4><?php _e('碳排放构成', 'gscm'); ?></h4>
                <div class="breakdown-chart">
                    <?php
                    $material_percent = ($report['material_emissions'] / $report['total_emissions']) * 100;
                    $transport_percent = ($report['transport_emissions'] / $report['total_emissions']) * 100;
                    ?>
                    <div class="breakdown-segment material" style="width: <?php echo $material_percent; ?>%">
                        <span><?php _e('材料', 'gscm'); ?> (<?php echo number_format($material_percent, 1); ?>%)</span>
                    </div>
                    <div class="breakdown-segment transport" style="width: <?php echo $transport_percent; ?>%">
                        <span><?php _e('运输', 'gscm'); ?> (<?php echo number_format($transport_percent, 1); ?>%)</span>
                    </div>
                </div>
            </div>
        </div>
        
        <style>
            .gscm-carbon-footprint .carbon-metrics {
                display: grid;
                grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
                gap: 20px;
                margin: 20px 0;
            }
            .metric-card {
                background: white;
                border: 1px solid #e0e0e0;
                border-radius: 8px;
                padding: 20px;
                text-align: center;
                box-shadow: 0 2px 4px rgba(0,0,0,0.1);
            }
            .metric-value {
                font-size: 24px;
                font-weight: bold;
                color: #2E7D32;
                margin: 10px 0;
            }
            .metric-label {
                color: #666;
                font-size: 14px;
            }
            .recycle-bar {
                height: 8px;
                background: #e0e0e0;
                border-radius: 4px;
                margin-top: 10px;
                overflow: hidden;
            }
            .recycle-fill {
                height: 100%;
                background: linear-gradient(90deg, #4CAF50, #8BC34A);
            }
            .breakdown-chart {
                display: flex;
                height: 40px;
                border-radius: 4px;
                overflow: hidden;
                margin-top: 10px;
            }
            .breakdown-segment {
                display: flex;
                align-items: center;
                justify-content: center;
                color: white;
                font-size: 12px;
                font-weight: bold;
            }
            .breakdown-segment.material { background: #2196F3; }
            .breakdown-segment.transport { background: #FF9800; }
        </style>
        <?php
        return ob_get_clean();
    }
}
?>

数据可视化与报告生成

6.1 使用Chart.js创建可视化图表

<?php
/**
 * 数据可视化类
 */
class GSCM_Data_Visualization {
    
    /**
     * 生成碳排放趋势图
     * @param string $period 时间周期 (week, month, year)
     * @return string Chart.js HTML代码
     */
    public static function generate_emissions_chart($period = 'month') {
        global $wpdb;
        
        $products_table = $wpdb->prefix . 'gscm_products';
        
        // 根据时间周期获取数据
        switch ($period) {
            case 'week':
                $date_format = '%Y-%m-%d';
                $interval = '7 DAY';
                break;
            case 'year':
                $date_format = '%Y-%m';
                $interval = '1 YEAR';
                break;
            default: // month
                $date_format = '%Y-%m-%d';
                $interval = '30 DAY';
        }
        
        $query = $wpdb->prepare(
            "SELECT 
                DATE_FORMAT(created_at, %s) as date,
                SUM(carbon_footprint) as total_emissions,
                AVG(recyclable_percentage) as avg_recyclable
            FROM $products_table 
            WHERE created_at >= DATE_SUB(NOW(), INTERVAL $interval)
            GROUP BY DATE_FORMAT(created_at, %s)
            ORDER BY created_at ASC",
            $date_format, $date_format
        );
        
        $data = $wpdb->get_results($query, ARRAY_A);
        
        if (empty($data)) {
            return '<p>' . __('暂无数据', 'gscm') . '</p>';
        }
        
        // 准备Chart.js数据
        $labels = array_column($data, 'date');
        $emissions = array_column($data, 'total_emissions');
        $recyclable = array_column($data, 'avg_recyclable');
        
        ob_start();
        ?>
        <div class="gscm-chart-container">
            <canvas id="emissionsChart" width="400" height="200"></canvas>
        </div>
        
        <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
        <script>
        document.addEventListener('DOMContentLoaded', function() {
            const ctx = document.getElementById('emissionsChart').getContext('2d');
            const emissionsChart = new Chart(ctx, {
                type: 'line',
                data: {
                    labels: <?php echo json_encode($labels); ?>,
                    datasets: [{
                        label: '<?php _e('碳排放总量 (kg CO₂)', 'gscm'); ?>',
                        data: <?php echo json_encode($emissions); ?>,
                        borderColor: '#F44336',
                        backgroundColor: 'rgba(244, 67, 54, 0.1)',
                        borderWidth: 2,
                        fill: true,
                        yAxisID: 'y'
                    }, {
                        label: '<?php _e('平均可回收比例 (%)', 'gscm'); ?>',
                        data: <?php echo json_encode($recyclable); ?>,
                        borderColor: '#4CAF50',
                        backgroundColor: 'rgba(76, 175, 80, 0.1)',
                        borderWidth: 2,
                        fill: true,
                        yAxisID: 'y1'
                    }]
                },
                options: {
                    responsive: true,
                    interaction: {
                        mode: 'index',
                        intersect: false
                    },
                    scales: {
                        x: {
                            grid: {
                                display: false
                            }
                        },
                        y: {
                            type: 'linear',
                            display: true,
                            position: 'left',
                            title: {
                                display: true,
                                text: '<?php _e('碳排放 (kg CO₂)', 'gscm'); ?>'
                            },
                            grid: {
                                color: 'rgba(0,0,0,0.1)'
                            }
                        },
                        y1: {
                            type: 'linear',
                            display: true,
                            position: 'right',
                            title: {
                                display: true,
                                text: '<?php _e('可回收比例 (%)', 'gscm'); ?>'
                            },
                            grid: {
                                drawOnChartArea: false
                            },
                            min: 0,
                            max: 100
                        }
                    },
                    plugins: {
                        tooltip: {
                            callbacks: {
                                label: function(context) {
                                    let label = context.dataset.label || '';
                                    if (label) {
                                        label += ': ';
                                    }
                                    if (context.datasetIndex === 0) {
                                        label += context.parsed.y.toFixed(2) + ' kg CO₂';
                                    } else {
                                        label += context.parsed.y.toFixed(1) + '%';
                                    }
                                    return label;
                                }
                            }
                        }
                    }
                }
            });
        });
        </script>
        <?php
        return ob_get_clean();
    }
    
    /**
     * 生成供应商比较图
     * @return string Chart.js HTML代码
     */
    public static function generate_supplier_comparison_chart() {
        global $wpdb;
        
        $suppliers_table = $wpdb->prefix . 'gscm_suppliers';
        $products_table = $wpdb->prefix . 'gscm_products';
        
        $query = "
            SELECT 
                s.name as supplier_name,
                s.carbon_rating,
                COUNT(p.id) as product_count,
                AVG(p.carbon_footprint) as avg_product_emissions,
                AVG(p.recyclable_percentage) as avg_recyclable
            FROM $suppliers_table s
            LEFT JOIN $products_table p ON s.id = p.supplier_id
            GROUP BY s.id
            HAVING product_count > 0
            ORDER BY carbon_rating DESC
            LIMIT 10
        ";
        
        $data = $wpdb->get_results($query, ARRAY_A);
        
        if (empty($data)) {
            return '<p>' . __('暂无供应商数据', 'gscm') . '</p>';
        }
        
        $labels = array_column($data, 'supplier_name');
        $ratings = array_column($data, 'carbon_rating');
        $emissions = array_column($data, 'avg_product_emissions');
        
        ob_start();
        ?>
        <div class="gscm-chart-container">
            <canvas id="supplierChart" width="400" height="300"></canvas>
        </div>
        
        <script>
        document.addEventListener('DOMContentLoaded', function() {
            const ctx = document.getElementById('supplierChart').getContext('2d');
            const supplierChart = new Chart(ctx, {
                type: 'bar',
                data: {
                    labels: <?php echo json_encode($labels); ?>,
                    datasets: [{
                        label: '<?php _e('碳评级 (1-10)', 'gscm'); ?>',
                        data: <?php echo json_encode($ratings); ?>,
                        backgroundColor: 'rgba(76, 175, 80, 0.7)',
                        borderColor: 'rgba(76, 175, 80, 1)',
                        borderWidth: 1,
                        yAxisID: 'y'
                    }, {
                        label: '<?php _e('平均产品碳排放 (kg CO₂)', 'gscm'); ?>',
                        data: <?php echo json_encode($emissions); ?>,
                        backgroundColor: 'rgba(244, 67, 54, 0.7)',
                        borderColor: 'rgba(244, 67, 54, 1)',
                        borderWidth: 1,
                        yAxisID: 'y1'
                    }]
                },
                options: {
                    responsive: true,
                    scales: {
                        x: {
                            grid: {
                                display: false
                            }
                        },
                        y: {
                            beginAtZero: true,
                            max: 10,
                            title: {
                                display: true,
                                text: '<?php _e('碳评级', 'gscm'); ?>'
                            }
                        },
                        y1: {
                            position: 'right',
                            beginAtZero: true,
                            title: {
                                display: true,
                                text: '<?php _e('碳排放', 'gscm'); ?>'
                            },
                            grid: {
                                drawOnChartArea: false
                            }
                        }
                    },
                    plugins: {
                        legend: {
                            position: 'top'
                        },
                        tooltip: {
                            callbacks: {
                                label: function(context) {
                                    let label = context.dataset.label || '';
                                    if (label) {
                                        label += ': ';
                                    }
                                    if (context.datasetIndex === 0) {
                                        label += context.parsed.y.toFixed(1);
                                    } else {
                                        label += context.parsed.y.toFixed(2) + ' kg CO₂';
                                    }
                                    return label;
                                }
                            }
                        }
                    }
                }
            });
        });
        </script>
        <?php
        return ob_get_clean();
    }
}
?>

插件优化与安全考虑

7.1 安全防护措施

<?php
/**
 * 安全与优化类
 */
class GSCM_Security_Optimizer {
    
    /**
     * 验证用户权限
     * @param string $capability 所需权限
     * @return bool 是否有权限
     */
    public static function check_capability($capability = 'manage_options') {
        return current_user_can($capability);
    }
    
    /**
     * 清理和验证输入数据
     * @param array $data 输入数据
     * @param array $rules 验证规则
     * @return array|WP_Error 清理后的数据或错误
     */
    public static function sanitize_input($data, $rules) {
        $sanitized = array();
        
        foreach ($rules as $field => $rule) {
            if (!isset($data[$field]) && strpos($rule, 'required') !== false) {
                return new WP_Error('missing_field', sprintf(__('缺少必填字段: %s', 'gscm'), $field));
            }
            
            $value = isset($data[$field]) ? $data[$field] : '';
            
            switch ($rule) {
                case 'required|email':
                    if (!is_email($value)) {
                        return new WP_Error('invalid_email', __('无效的邮箱地址', 'gscm'));
                    }
                    $sanitized[$field] = sanitize_email($value);
                    break;
                    
                case 'required|text':
                    $sanitized[$field] = sanitize_text_field($value);
                    break;
                    
                case 'required|textarea':
                    $sanitized[$field] = sanitize_textarea_field($value);
                    break;
                    
                case 'required|float':
                    $sanitized[$field] = floatval($value);
                    break;
                    
                case 'required|int':
                    $sanitized[$field] = intval($value);
                    break;
                    
                case 'text':
                    $sanitized[$field] = sanitize_text_field($value);
                    break;
                    
                case 'float':
                    $sanitized[$field] = floatval($value);
                    break;
                    
                default:
                    $sanitized[$field] = sanitize_text_field($value);
            }
        }
        
        return $sanitized;
    }
    
    /**
     * 防止SQL注入
     * @param string $query SQL查询
     * @param array $params 参数
     * @return string 安全的查询
     */
    public static function safe_query($query, $params = array()) {
        global $wpdb;
        
        if (empty($params)) {
            return $query;
        }
        
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/6190.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

工作时间:周一至周五,9:00-17:30,节假日休息
返回顶部