首页 / 教程文章 / WordPress小批量定制插件实现环保材料管理的教程

WordPress小批量定制插件实现环保材料管理的教程

WordPress小批量定制插件实现环保材料管理的教程

一、项目概述与需求分析

在当今环保意识日益增强的时代,许多企业需要对环保材料进行系统化管理。本教程将指导您开发一个WordPress定制插件,专门用于小批量的环保材料管理。这个插件将帮助企业追踪环保材料的库存、供应商信息、环保认证状态等关键数据。

主要功能需求:

  1. 环保材料信息录入与管理
  2. 库存数量追踪与预警
  3. 供应商信息管理
  4. 环保认证状态监控
  5. 数据报表生成

二、插件基础结构搭建

首先,我们需要创建插件的基本文件结构。在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后台激活插件
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/6070.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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