WordPress小批量定制插件实现环保材料管理的教程
一、项目概述与需求分析
在当今环保意识日益增强的时代,许多企业需要对环保材料进行系统化管理。本教程将指导您开发一个WordPress定制插件,专门用于小批量的环保材料管理。这个插件将帮助企业追踪环保材料的库存、供应商信息、环保认证状态等关键数据。
主要功能需求:
- 环保材料信息录入与管理
- 库存数量追踪与预警
- 供应商信息管理
- 环保认证状态监控
- 数据报表生成
二、插件基础结构搭建
首先,我们需要创建插件的基本文件结构。在WordPress的wp-content/plugins/目录下创建一个新文件夹eco-material-manager。
<?php
/**
* Plugin Name: 环保材料管理系统
* Plugin URI: https://yourwebsite.com/
* Description: 用于管理环保材料的小批量定制插件
* Version: 1.0.0
* Author: 您的名称
* License: GPL v2 or later
* Text Domain: eco-material-manager
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 定义插件常量
define('ECO_MATERIAL_VERSION', '1.0.0');
define('ECO_MATERIAL_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('ECO_MATERIAL_PLUGIN_URL', plugin_dir_url(__FILE__));
// 初始化插件
class EcoMaterialManager {
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();
}
private function init_hooks() {
// 激活插件时创建数据库表
register_activation_hook(__FILE__, array($this, 'create_tables'));
// 加载文本域
add_action('init', array($this, 'load_textdomain'));
// 管理菜单
add_action('admin_menu', array($this, 'add_admin_menu'));
// 加载脚本和样式
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_assets'));
}
// 加载文本域
public function load_textdomain() {
load_plugin_textdomain('eco-material-manager', false, dirname(plugin_basename(__FILE__)) . '/languages');
}
// 创建数据库表
public function create_tables() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
// 环保材料表
$materials_table = $wpdb->prefix . 'eco_materials';
$suppliers_table = $wpdb->prefix . 'eco_suppliers';
$sql = "CREATE TABLE IF NOT EXISTS $materials_table (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
material_type varchar(100) NOT NULL,
stock_quantity int NOT NULL DEFAULT 0,
min_stock_level int NOT NULL DEFAULT 10,
unit varchar(50) NOT NULL,
supplier_id mediumint(9),
certification_status varchar(100),
certification_number varchar(255),
co2_saved decimal(10,2) COMMENT '二氧化碳减排量(kg)',
recyclable_percentage decimal(5,2) COMMENT '可回收百分比',
created_at datetime DEFAULT CURRENT_TIMESTAMP,
updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) $charset_collate;
CREATE TABLE IF NOT EXISTS $suppliers_table (
id mediumint(9) NOT NULL AUTO_INCREMENT,
company_name varchar(255) NOT NULL,
contact_person varchar(255),
email varchar(255),
phone varchar(50),
address text,
sustainability_rating int COMMENT '可持续性评级(1-5)',
certification_types text COMMENT '认证类型,JSON格式存储',
is_approved tinyint(1) DEFAULT 0,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
// 添加管理菜单
public function add_admin_menu() {
add_menu_page(
__('环保材料管理', 'eco-material-manager'),
__('环保材料', 'eco-material-manager'),
'manage_options',
'eco-material-manager',
array($this, 'display_materials_page'),
'dashicons-palmtree',
30
);
add_submenu_page(
'eco-material-manager',
__('材料列表', 'eco-material-manager'),
__('材料列表', 'eco-material-manager'),
'manage_options',
'eco-material-manager',
array($this, 'display_materials_page')
);
add_submenu_page(
'eco-material-manager',
__('添加新材料', 'eco-material-manager'),
__('添加材料', 'eco-material-manager'),
'manage_options',
'eco-material-add',
array($this, 'display_add_material_page')
);
add_submenu_page(
'eco-material-manager',
__('供应商管理', 'eco-material-manager'),
__('供应商', 'eco-material-manager'),
'manage_options',
'eco-material-suppliers',
array($this, 'display_suppliers_page')
);
add_submenu_page(
'eco-material-manager',
__('报表统计', 'eco-material-manager'),
__('报表', 'eco-material-manager'),
'manage_options',
'eco-material-reports',
array($this, 'display_reports_page')
);
}
// 加载管理端资源
public function enqueue_admin_assets($hook) {
if (strpos($hook, 'eco-material') === false) {
return;
}
wp_enqueue_style(
'eco-material-admin-style',
ECO_MATERIAL_PLUGIN_URL . 'assets/css/admin-style.css',
array(),
ECO_MATERIAL_VERSION
);
wp_enqueue_script(
'eco-material-admin-script',
ECO_MATERIAL_PLUGIN_URL . 'assets/js/admin-script.js',
array('jquery'),
ECO_MATERIAL_VERSION,
true
);
// 本地化脚本
wp_localize_script('eco-material-admin-script', 'ecoMaterialAjax', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('eco-material-nonce')
));
}
// 显示材料列表页面
public function display_materials_page() {
include ECO_MATERIAL_PLUGIN_DIR . 'templates/materials-list.php';
}
// 显示添加材料页面
public function display_add_material_page() {
include ECO_MATERIAL_PLUGIN_DIR . 'templates/add-material.php';
}
// 显示供应商页面
public function display_suppliers_page() {
include ECO_MATERIAL_PLUGIN_DIR . 'templates/suppliers.php';
}
// 显示报表页面
public function display_reports_page() {
include ECO_MATERIAL_PLUGIN_DIR . 'templates/reports.php';
}
}
// 初始化插件
EcoMaterialManager::get_instance();
?>
三、材料管理功能实现
接下来,我们创建材料添加和管理的核心功能。在插件目录下创建templates/add-material.php文件:
<?php
/**
* 添加环保材料页面模板
*/
// 检查用户权限
if (!current_user_can('manage_options')) {
wp_die(__('您没有权限访问此页面。', 'eco-material-manager'));
}
global $wpdb;
$materials_table = $wpdb->prefix . 'eco_materials';
$suppliers_table = $wpdb->prefix . 'eco_suppliers';
// 处理表单提交
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_material'])) {
// 验证nonce
if (!wp_verify_nonce($_POST['_wpnonce'], 'add_eco_material')) {
wp_die(__('安全验证失败,请重试。', 'eco-material-manager'));
}
// 准备数据
$material_data = array(
'name' => sanitize_text_field($_POST['material_name']),
'material_type' => sanitize_text_field($_POST['material_type']),
'stock_quantity' => intval($_POST['stock_quantity']),
'min_stock_level' => intval($_POST['min_stock_level']),
'unit' => sanitize_text_field($_POST['unit']),
'supplier_id' => intval($_POST['supplier_id']),
'certification_status' => sanitize_text_field($_POST['certification_status']),
'certification_number' => sanitize_text_field($_POST['certification_number']),
'co2_saved' => floatval($_POST['co2_saved']),
'recyclable_percentage' => floatval($_POST['recyclable_percentage'])
);
// 插入数据库
$result = $wpdb->insert($materials_table, $material_data);
if ($result) {
echo '<div class="notice notice-success"><p>' . __('材料添加成功!', 'eco-material-manager') . '</p></div>';
} else {
echo '<div class="notice notice-error"><p>' . __('添加失败,请重试。', 'eco-material-manager') . '</p></div>';
}
}
// 获取供应商列表
$suppliers = $wpdb->get_results("SELECT id, company_name FROM $suppliers_table WHERE is_approved = 1");
?>
<div class="wrap">
<h1><?php _e('添加环保材料', 'eco-material-manager'); ?></h1>
<form method="post" action="">
<?php wp_nonce_field('add_eco_material'); ?>
<table class="form-table">
<tr>
<th scope="row"><label for="material_name"><?php _e('材料名称', 'eco-material-manager'); ?></label></th>
<td><input type="text" id="material_name" name="material_name" class="regular-text" required></td>
</tr>
<tr>
<th scope="row"><label for="material_type"><?php _e('材料类型', 'eco-material-manager'); ?></label></th>
<td>
<select id="material_type" name="material_type" required>
<option value=""><?php _e('选择类型', 'eco-material-manager'); ?></option>
<option value="biodegradable"><?php _e('可生物降解', 'eco-material-manager'); ?></option>
<option value="recycled"><?php _e('再生材料', 'eco-material-manager'); ?></option>
<option value="organic"><?php _e('有机材料', 'eco-material-manager'); ?></option>
<option value="low_impact"><?php _e('低环境影响', 'eco-material-manager'); ?></option>
<option value="renewable"><?php _e('可再生材料', 'eco-material-manager'); ?></option>
</select>
</td>
</tr>
<tr>
<th scope="row"><label for="stock_quantity"><?php _e('库存数量', 'eco-material-manager'); ?></label></th>
<td><input type="number" id="stock_quantity" name="stock_quantity" min="0" step="1" required></td>
</tr>
<tr>
<th scope="row"><label for="min_stock_level"><?php _e('最低库存预警', 'eco-material-manager'); ?></label></th>
<td><input type="number" id="min_stock_level" name="min_stock_level" min="0" step="1" required></td>
</tr>
<tr>
<th scope="row"><label for="unit"><?php _e('单位', 'eco-material-manager'); ?></label></th>
<td>
<select id="unit" name="unit" required>
<option value="kg"><?php _e('千克', 'eco-material-manager'); ?></option>
<option value="piece"><?php _e('件', 'eco-material-manager'); ?></option>
<option value="meter"><?php _e('米', 'eco-material-manager'); ?></option>
<option value="liter"><?php _e('升', 'eco-material-manager'); ?></option>
<option value="roll"><?php _e('卷', 'eco-material-manager'); ?></option>
</select>
</td>
</tr>
<tr>
<th scope="row"><label for="supplier_id"><?php _e('供应商', 'eco-material-manager'); ?></label></th>
<td>
<select id="supplier_id" name="supplier_id">
<option value=""><?php _e('选择供应商', 'eco-material-manager'); ?></option>
<?php foreach ($suppliers as $supplier): ?>
<option value="<?php echo $supplier->id; ?>"><?php echo esc_html($supplier->company_name); ?></option>
<?php endforeach; ?>
</select>
</td>
</tr>
<tr>
<th scope="row"><label for="certification_status"><?php _e('认证状态', 'eco-material-manager'); ?></label></th>
<td>
<select id="certification_status" name="certification_status">
<option value="certified"><?php _e('已认证', 'eco-material-manager'); ?></option>
<option value="pending"><?php _e('认证中', 'eco-material-manager'); ?></option>
<option value="uncertified"><?php _e('未认证', 'eco-material-manager'); ?></option>
</select>
</td>
</tr>
<tr>
<th scope="row"><label for="certification_number"><?php _e('认证编号', 'eco-material-manager'); ?></label></th>
<td><input type="text" id="certification_number" name="certification_number" class="regular-text"></td>
</tr>
<tr>
<th scope="row"><label for="co2_saved"><?php _e('CO₂减排量(kg)', 'eco-material-manager'); ?></label></th>
<td><input type="number" id="co2_saved" name="co2_saved" min="0" step="0.01"></td>
</tr>
<tr>
<th scope="row"><label for="recyclable_percentage"><?php _e('可回收百分比', 'eco-material-manager'); ?></label></th>
<td><input type="number" id="recyclable_percentage" name="recyclable_percentage" min="0" max="100" step="0.01"> %</td>
</tr>
</table>
<p class="submit">
<input type="submit" name="add_material" class="button button-primary" value="<?php _e('添加材料', 'eco-material-manager'); ?>">
</p>
</form>
</div>
四、库存预警与报表功能
创建报表功能,在templates/reports.php中添加:
<?php
/**
* 环保材料报表页面
*/
if (!current_user_can('manage_options')) {
wp_die(__('您没有权限访问此页面。', 'eco-material-manager'));
}
global $wpdb;
$materials_table = $wpdb->prefix . 'eco_materials';
$suppliers_table = $wpdb->prefix . 'eco_suppliers';
// 获取库存预警材料
$low_stock_materials = $wpdb->get_results("
SELECT * FROM $materials_table
WHERE stock_quantity <= min_stock_level
ORDER BY stock_quantity ASC
");
// 获取材料类型统计
$material_stats = $wpdb->get_results("
SELECT
material_type,
COUNT(*) as count,
SUM(stock_quantity) as total_stock,
AVG(recyclable_percentage) as avg_recyclable
FROM $materials_table
GROUP BY material_type
");
// 获取环保效益统计
$environmental_stats = $wpdb->get_row("
SELECT
SUM(co2_saved) as total_co2_saved,
AVG(recyclable_percentage) as overall_recyclable_rate
FROM $materials_table
");
?>
<div class="wrap">
<h1><?php _e('环保材料报表', 'eco-material-manager'); ?></h1>
<div class="eco-material-reports">
<!-- 库存预警部分 -->
<div class="report-section">
<h2><?php _e('库存预警', 'eco-material-manager'); ?></h2>
<?php if (empty($low_stock_materials)): ?>
<div class="notice notice-success">
<p><?php _e('所有材料库存充足,无预警信息。', 'eco-material-manager'); ?></p>
</div>
<?php else: ?>
<table class="wp-list-table widefat fixed striped">
<thead>
<tr>
<th><?php _e('材料名称', 'eco-material-manager'); ?></th>
<th><?php _e('当前库存', 'eco-material-manager'); ?></th>
<th><?php _e('最低库存', 'eco-material-manager'); ?></th>
<th><?php _e('单位', 'eco-material-manager'); ?></th>
<th><?php _e('状态', 'eco-material-manager'); ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($low_stock_materials as $material): ?>
<tr>
<td><?php echo esc_html($material->name); ?></td>
<td><?php echo $material->stock_quantity; ?></td>
<td><?php echo $material->min_stock_level; ?></td>
<td><?php echo $material->unit; ?></td>
<td><span class="dashicons dashicons-warning" style="color:#d63638;"></span> <?php _e('需要补货', 'eco-material-manager'); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
</div>
<!-- 材料类型统计 -->
<div class="report-section">
<h2><?php _e('材料类型分布', 'eco-material-manager'); ?></h2>
<table class="wp-list-table widefat fixed striped">
<thead>
<tr>
<th><?php _e('材料类型', 'eco-material-manager'); ?></th>
<th><?php _e('种类数量', 'eco-material-manager'); ?></th>
<th><?php _e('总库存量', 'eco-material-manager'); ?></th>
<th><?php _e('平均可回收率', 'eco-material-manager'); ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($material_stats as $stat): ?>
<tr>
<td>
<?php
$type_names = array(
'biodegradable' => __('可生物降解', 'eco-material-manager'),
'recycled' => __('再生材料', 'eco-material-manager'),
'organic' => __('有机材料', 'eco-material-manager'),
'low_impact' => __('低环境影响', 'eco-material-manager'),
'renewable' => __('可再生材料', 'eco-material-manager')
);
echo $type_names[$stat->material_type] ?? $stat->material_type;
?>
</td>
<td><?php echo $stat->count; ?></td>
<td><?php echo $stat->total_stock; ?></td>
<td><?php echo round($stat->avg_recyclable, 2); ?>%</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<!-- 环保效益统计 -->
<div class="report-section">
<h2><?php _e('环保效益总览', 'eco-material-manager'); ?></h2>
<div class="environmental-benefits">
<div class="benefit-card">
<div class="benefit-icon">🌿</div>
<div class="benefit-content">
<h3><?php _e('总CO₂减排量', 'eco-material-manager'); ?></h3>
<p class="benefit-value"><?php echo round($environmental_stats->total_co2_saved, 2); ?> kg</p>
<p class="benefit-desc"><?php _e('相当于种植', 'eco-material-manager'); ?> <?php echo round($environmental_stats->total_co2_saved / 18, 1); ?> <?php _e('棵树', 'eco-material-manager'); ?></p>
</div>
</div>
<div class="benefit-card">
<div class="benefit-icon">♻️</div>
<div class="benefit-content">
<h3><?php _e('平均可回收率', 'eco-material-manager'); ?></h3>
<p class="benefit-value"><?php echo round($environmental_stats->overall_recyclable_rate, 2); ?>%</p>
<p class="benefit-desc"><?php _e('材料整体可回收比例', 'eco-material-manager'); ?></p>
</div>
</div>
</div>
</div>
<!-- 认证状态统计 -->
<div class="report-section">
<h2><?php _e('认证状态分析', 'eco-material-manager'); ?></h2>
<?php
$certification_stats = $wpdb->get_results("
SELECT
certification_status,
COUNT(*) as count,
SUM(stock_quantity) as total_stock
FROM $materials_table
GROUP BY certification_status
");
?>
<table class="wp-list-table widefat fixed striped">
<thead>
<tr>
<th><?php _e('认证状态', 'eco-material-manager'); ?></th>
<th><?php _e('材料数量', 'eco-material-manager'); ?></th>
<th><?php _e('库存总量', 'eco-material-manager'); ?></th>
<th><?php _e('占比', 'eco-material-manager'); ?></th>
</tr>
</thead>
<tbody>
<?php
$total_materials = array_sum(array_column($certification_stats, 'count'));
foreach ($certification_stats as $stat):
$percentage = ($stat->count / $total_materials) * 100;
?>
<tr>
<td>
<?php
$status_names = array(
'certified' => __('已认证', 'eco-material-manager'),
'pending' => __('认证中', 'eco-material-manager'),
'uncertified' => __('未认证', 'eco-material-manager')
);
echo $status_names[$stat->certification_status] ?? $stat->certification_status;
?>
</td>
<td><?php echo $stat->count; ?></td>
<td><?php echo $stat->total_stock; ?></td>
<td><?php echo round($percentage, 1); ?>%</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
<style>
.eco-material-reports .report-section {
margin-bottom: 30px;
padding: 20px;
background: #fff;
border: 1px solid #ccd0d4;
box-shadow: 0 1px 1px rgba(0,0,0,.04);
}
.environmental-benefits {
display: flex;
gap: 20px;
flex-wrap: wrap;
}
.benefit-card {
flex: 1;
min-width: 250px;
padding: 20px;
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
border-radius: 8px;
display: flex;
align-items: center;
gap: 15px;
}
.benefit-icon {
font-size: 40px;
}
.benefit-content h3 {
margin: 0 0 5px 0;
color: #1d2327;
}
.benefit-value {
font-size: 24px;
font-weight: bold;
color: #2271b1;
margin: 0;
}
.benefit-desc {
margin: 5px 0 0 0;
color: #646970;
font-size: 14px;
}
.stock-warning {
color: #d63638;
font-weight: bold;
}
</style>
## 五、AJAX交互与数据导出功能
在插件主文件中添加AJAX处理和数据导出功能:
// 在EcoMaterialManager类的init_hooks方法中添加
add_action('wp_ajax_get_material_details', array($this, 'ajax_get_material_details'));
add_action('wp_ajax_export_materials_csv', array($this, 'ajax_export_materials_csv'));
// 添加AJAX处理方法
public function ajax_get_material_details() {
// 验证nonce
if (!wp_verify_nonce($_POST['nonce'], 'eco-material-nonce')) {
wp_die('Security check failed');
}
global $wpdb;
$materials_table = $wpdb->prefix . 'eco_materials';
$material_id = intval($_POST['material_id']);
$material = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM $materials_table WHERE id = %d",
$material_id
));
if ($material) {
wp_send_json_success($material);
} else {
wp_send_json_error('Material not found');
}
}
// 导出CSV功能
public function ajax_export_materials_csv() {
if (!wp_verify_nonce($_POST['nonce'], 'eco-material-nonce')) {
wp_die('Security check failed');
}
global $wpdb;
$materials_table = $wpdb->prefix . 'eco_materials';
$suppliers_table = $wpdb->prefix . 'eco_suppliers';
// 获取所有材料数据
$materials = $wpdb->get_results("
SELECT
m.*,
s.company_name as supplier_name
FROM $materials_table m
LEFT JOIN $suppliers_table s ON m.supplier_id = s.id
ORDER BY m.created_at DESC
");
// 设置CSV头部
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=eco-materials-' . date('Y-m-d') . '.csv');
$output = fopen('php://output', 'w');
// CSV标题行
fputcsv($output, array(
__('ID', 'eco-material-manager'),
__('材料名称', 'eco-material-manager'),
__('材料类型', 'eco-material-manager'),
__('库存数量', 'eco-material-manager'),
__('最低库存', 'eco-material-manager'),
__('单位', 'eco-material-manager'),
__('供应商', 'eco-material-manager'),
__('认证状态', 'eco-material-manager'),
__('CO₂减排量(kg)', 'eco-material-manager'),
__('可回收率(%)', 'eco-material-manager'),
__('创建时间', 'eco-material-manager')
));
// 数据行
foreach ($materials as $material) {
$type_names = array(
'biodegradable' => __('可生物降解', 'eco-material-manager'),
'recycled' => __('再生材料', 'eco-material-manager'),
'organic' => __('有机材料', 'eco-material-manager'),
'low_impact' => __('低环境影响', 'eco-material-manager'),
'renewable' => __('可再生材料', 'eco-material-manager')
);
$status_names = array(
'certified' => __('已认证', 'eco-material-manager'),
'pending' => __('认证中', 'eco-material-manager'),
'uncertified' => __('未认证', 'eco-material-manager')
);
fputcsv($output, array(
$material->id,
$material->name,
$type_names[$material->material_type] ?? $material->material_type,
$material->stock_quantity,
$material->min_stock_level,
$material->unit,
$material->supplier_name,
$status_names[$material->certification_status] ?? $material->certification_status,
$material->co2_saved,
$material->recyclable_percentage,
$material->created_at
));
}
fclose($output);
exit;
}
## 六、短代码与前端展示
为了让环保材料信息能在网站前端展示,我们添加短代码功能:
// 在EcoMaterialManager类的init_hooks方法中添加
add_shortcode('display_eco_materials', array($this, 'shortcode_display_materials'));
// 短代码实现
public function shortcode_display_materials($atts) {
$atts = shortcode_atts(array(
'type' => 'all',
'limit' => 10,
'show_certified' => true
), $atts, 'display_eco_materials');
global $wpdb;
$materials_table = $wpdb->prefix . 'eco_materials';
// 构建查询
$query = "SELECT * FROM $materials_table WHERE 1=1";
$params = array();
if ($atts['type'] !== 'all') {
$query .= " AND material_type = %s";
$params[] = $atts['type'];
}
if ($atts['show_certified']) {
$query .= " AND certification_status = 'certified'";
}
$query .= " ORDER BY created_at DESC LIMIT %d";
$params[] = intval($atts['limit']);
if (!empty($params)) {
$materials = $wpdb->get_results($wpdb->prepare($query, $params));
} else {
$materials = $wpdb->get_results($query);
}
if (empty($materials)) {
return '<p>' . __('暂无环保材料信息。', 'eco-material-manager') . '</p>';
}
ob_start();
?>
<div class="eco-materials-display">
<div class="materials-grid">
<?php foreach ($materials as $material): ?>
<div class="material-card">
<div class="material-header">
<h3><?php echo esc_html($material->name); ?></h3>
<?php if ($material->certification_status === 'certified'): ?>
<span class="certification-badge">✅ <?php _e('已认证', 'eco-material-manager'); ?></span>
<?php endif; ?>
</div>
<div class="material-details">
<div class="detail-item">
<span class="label"><?php _e('类型', 'eco-material-manager'); ?>:</span>
<span class="value">
<?php
$type_names = array(
'biodegradable' => __('可生物降解', 'eco-material-manager'),
'recycled' => __('再生材料', 'eco-material-manager'),
'organic' => __('有机材料', 'eco-material-manager'),
'low_impact' => __('低环境影响', 'eco-material-manager'),
'renewable' => __('可再生材料', 'eco-material-manager')
);
echo $type_names[$material->material_type] ?? $material->material_type;
?>
</span>
</div>
<div class="detail-item">
<span class="label"><?php _e('可回收率', 'eco-material-manager'); ?>:</span>
<span class="value"><?php echo $material->recyclable_percentage; ?>%</span>
</div>
<div class="detail-item">
<span class="label"><?php _e('CO₂减排', 'eco-material-manager'); ?>:</span>
<span class="value"><?php echo $material->co2_saved; ?> kg</span>
</div>
<div class="detail-item">
<span class="label"><?php _e('库存状态', 'eco-material-manager'); ?>:</span>
<span class="value <?php echo $material->stock_quantity <= $material->min_stock_level ? 'low-stock' : 'in-stock'; ?>">
<?php echo $material->stock_quantity; ?> <?php echo $material->unit; ?>
</span>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<style>
.eco-materials-display .materials-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 20px;
margin: 20px 0;
}
.material-card {
background: #fff;
border: 1px solid #e0e0e0;
border-radius: 8px;
padding: 20px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
transition: transform 0.3s ease;
}
.material-card:hover {
transform: translateY(-5px);
box-shadow: 0 4px 8px rgba(0,0,0,0.15);
}
.material-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
border-bottom: 2px solid #4CAF50;
padding-bottom: 10px;
}
.material-header h3 {
margin: 0;
color: #2c3e50;
font-size: 18px;
}
.certification-badge {
background: #4CAF50;
color: white;
padding: 4px 8px;
border-radius: 4px;
font-size: 12px;
font-weight: bold;
}
.material-details .detail-item {
display: flex;
justify-content: space-between;
margin-bottom: 8px;
padding-bottom: 8px;
border-bottom: 1px solid #f0f0f0;
}
.detail-item:last-child {
border-bottom: none;
margin-bottom: 0;
}
.detail-item .label {
color: #666;
font-weight: 500;
}
.detail-item .value {
color: #333;
font-weight: 600;
}
.value.low-stock {
color: #e74c3c;
font-weight: bold;
}
.value.in-stock {
color: #27ae60;
}
</style>
<?php
return ob_get_clean();
}
## 七、插件优化与安全考虑
1. **数据验证与清理**:所有用户输入都经过严格的验证和清理
2. **权限检查**:每个管理功能都检查用户权限
3. **SQL注入防护**:使用`$wpdb->prepare()`处理所有数据库查询
4. **Nonce验证**:所有表单和AJAX请求都进行nonce验证
5. **错误处理**:适当的错误处理和用户反馈
## 八、安装与使用说明
1. 将插件文件夹上传到`wp-content/plugins/`目录
2. 在WordPress后台激活插件
