文章目录[隐藏]
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;
}
