首页 / 教程文章 / WordPress小批量定制插件实现环保碳足迹追踪的教程

WordPress小批量定制插件实现环保碳足迹追踪的教程

WordPress小批量定制插件实现环保碳足迹追踪的教程

概述

在当今环保意识日益增强的时代,许多网站所有者希望在自己的WordPress网站上集成环保碳足迹追踪功能。本教程将指导您如何创建一个小批量定制插件,用于追踪和展示环保碳足迹数据。这个插件适合中小型网站使用,可以计算用户活动的碳排放量,并以可视化方式展示。

插件功能规划

我们的碳足迹追踪插件将包含以下核心功能:

  1. 用户活动数据收集(交通、能源使用等)
  2. 碳排放计算器
  3. 数据可视化展示
  4. 环保建议生成
  5. 数据导出功能

创建插件基础结构

首先,我们需要创建插件的基本文件和目录结构:

wp-content/plugins/carbon-footprint-tracker/
├── carbon-footprint-tracker.php
├── includes/
│   ├── class-data-collector.php
│   ├── class-carbon-calculator.php
│   ├── class-data-visualizer.php
│   └── class-export-handler.php
├── assets/
│   ├── css/
│   │   └── style.css
│   └── js/
│       └── script.js
└── templates/
    └── dashboard.php

主插件文件

创建主插件文件 carbon-footprint-tracker.php

<?php
/**
 * Plugin Name: 环保碳足迹追踪器
 * Plugin URI:  https://example.com/carbon-footprint-tracker
 * Description: 用于追踪和展示环保碳足迹数据的WordPress插件
 * Version:     1.0.0
 * Author:      环保开发者
 * License:     GPL v2 or later
 * Text Domain: carbon-footprint-tracker
 */

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

// 定义插件常量
define('CFT_VERSION', '1.0.0');
define('CFT_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('CFT_PLUGIN_URL', plugin_dir_url(__FILE__));

// 包含必要文件
require_once CFT_PLUGIN_DIR . 'includes/class-data-collector.php';
require_once CFT_PLUGIN_DIR . 'includes/class-carbon-calculator.php';
require_once CFT_PLUGIN_DIR . 'includes/class-data-visualizer.php';
require_once CFT_PLUGIN_DIR . 'includes/class-export-handler.php';

// 初始化插件类
class CarbonFootprintTracker {
    
    private $data_collector;
    private $carbon_calculator;
    private $data_visualizer;
    private $export_handler;
    
    public function __construct() {
        $this->init_components();
        $this->register_hooks();
    }
    
    private function init_components() {
        $this->data_collector = new CFT_Data_Collector();
        $this->carbon_calculator = new CFT_Carbon_Calculator();
        $this->data_visualizer = new CFT_Data_Visualizer();
        $this->export_handler = new CFT_Export_Handler();
    }
    
    private function register_hooks() {
        // 激活/停用插件时的操作
        register_activation_hook(__FILE__, array($this, 'activate_plugin'));
        register_deactivation_hook(__FILE__, array($this, 'deactivate_plugin'));
        
        // 初始化
        add_action('init', array($this, 'init_plugin'));
        
        // 添加管理菜单
        add_action('admin_menu', array($this, 'add_admin_menu'));
        
        // 加载脚本和样式
        add_action('wp_enqueue_scripts', array($this, 'enqueue_frontend_assets'));
        add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_assets'));
    }
    
    public function activate_plugin() {
        // 创建数据库表
        $this->create_database_tables();
        
        // 设置默认选项
        $this->set_default_options();
    }
    
    public function deactivate_plugin() {
        // 清理临时数据
        // 注意:这里不删除用户数据,以便用户重新激活时保留历史记录
    }
    
    public function init_plugin() {
        // 加载文本域
        load_plugin_textdomain('carbon-footprint-tracker', false, dirname(plugin_basename(__FILE__)) . '/languages');
    }
    
    public function add_admin_menu() {
        add_menu_page(
            '碳足迹追踪',
            '碳足迹追踪',
            'manage_options',
            'carbon-footprint-tracker',
            array($this, 'render_admin_dashboard'),
            'dashicons-chart-area',
            30
        );
    }
    
    public function enqueue_frontend_assets() {
        wp_enqueue_style(
            'cft-frontend-style',
            CFT_PLUGIN_URL . 'assets/css/style.css',
            array(),
            CFT_VERSION
        );
        
        wp_enqueue_script(
            'cft-frontend-script',
            CFT_PLUGIN_URL . 'assets/js/script.js',
            array('jquery', 'chart-js'),
            CFT_VERSION,
            true
        );
        
        // 本地化脚本,传递数据到JavaScript
        wp_localize_script('cft-frontend-script', 'cft_ajax', array(
            'ajax_url' => admin_url('admin-ajax.php'),
            'nonce' => wp_create_nonce('cft_nonce')
        ));
    }
    
    public function enqueue_admin_assets($hook) {
        if ('toplevel_page_carbon-footprint-tracker' !== $hook) {
            return;
        }
        
        wp_enqueue_style(
            'cft-admin-style',
            CFT_PLUGIN_URL . 'assets/css/admin-style.css',
            array(),
            CFT_VERSION
        );
        
        // 引入Chart.js用于数据可视化
        wp_enqueue_script(
            'chart-js',
            'https://cdn.jsdelivr.net/npm/chart.js',
            array(),
            '3.7.0',
            true
        );
        
        wp_enqueue_script(
            'cft-admin-script',
            CFT_PLUGIN_URL . 'assets/js/admin-script.js',
            array('jquery', 'chart-js'),
            CFT_VERSION,
            true
        );
    }
    
    public function render_admin_dashboard() {
        include CFT_PLUGIN_DIR . 'templates/dashboard.php';
    }
    
    private function create_database_tables() {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'carbon_footprint_data';
        $charset_collate = $wpdb->get_charset_collate();
        
        $sql = "CREATE TABLE IF NOT EXISTS $table_name (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            user_id mediumint(9),
            activity_type varchar(100) NOT NULL,
            activity_data text NOT NULL,
            carbon_emission decimal(10,2) NOT NULL,
            calculation_date datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
            PRIMARY KEY (id)
        ) $charset_collate;";
        
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
    }
    
    private function set_default_options() {
        $default_options = array(
            'transportation_factors' => array(
                'car' => 0.12, // kg CO2 per km
                'bus' => 0.03,
                'train' => 0.05,
                'plane' => 0.18,
                'bicycle' => 0,
                'walking' => 0
            ),
            'energy_factors' => array(
                'electricity' => 0.5, // kg CO2 per kWh
                'natural_gas' => 2.0,
                'heating_oil' => 2.7
            ),
            'measurement_unit' => 'kg',
            'show_tips' => true,
            'data_retention_days' => 365
        );
        
        update_option('cft_settings', $default_options);
    }
}

// 初始化插件
$carbon_footprint_tracker = new CarbonFootprintTracker();

碳排放计算器类

创建 includes/class-carbon-calculator.php

<?php
/**
 * 碳排放计算器类
 * 负责计算各种活动的碳排放量
 */

class CFT_Carbon_Calculator {
    
    private $settings;
    
    public function __construct() {
        $this->settings = get_option('cft_settings', array());
    }
    
    /**
     * 计算交通碳排放
     * 
     * @param string $transport_type 交通类型
     * @param float $distance 距离(公里)
     * @param int $passengers 乘客数量(用于分摊排放)
     * @return float 碳排放量(kg)
     */
    public function calculate_transport_emission($transport_type, $distance, $passengers = 1) {
        $factors = isset($this->settings['transportation_factors']) ? 
                   $this->settings['transportation_factors'] : array();
        
        if (!isset($factors[$transport_type])) {
            return 0;
        }
        
        $emission = $factors[$transport_type] * $distance;
        
        // 如果有多名乘客,分摊排放量
        if ($passengers > 1) {
            $emission = $emission / $passengers;
        }
        
        return round($emission, 2);
    }
    
    /**
     * 计算能源使用碳排放
     * 
     * @param string $energy_type 能源类型
     * @param float $consumption 消耗量
     * @param string $unit 单位(kWh, m³等)
     * @return float 碳排放量(kg)
     */
    public function calculate_energy_emission($energy_type, $consumption, $unit = 'kWh') {
        $factors = isset($this->settings['energy_factors']) ? 
                   $this->settings['energy_factors'] : array();
        
        if (!isset($factors[$energy_type])) {
            return 0;
        }
        
        // 单位转换(如果需要)
        $converted_consumption = $this->convert_energy_unit($consumption, $unit);
        
        $emission = $factors[$energy_type] * $converted_consumption;
        
        return round($emission, 2);
    }
    
    /**
     * 计算日常活动碳排放
     * 
     * @param string $activity 活动类型
     * @param array $data 活动数据
     * @return float 碳排放量(kg)
     */
    public function calculate_daily_activity_emission($activity, $data) {
        $emission = 0;
        
        switch ($activity) {
            case 'diet':
                // 饮食碳排放计算
                $emission = $this->calculate_diet_emission($data);
                break;
                
            case 'shopping':
                // 购物碳排放计算
                $emission = $this->calculate_shopping_emission($data);
                break;
                
            case 'waste':
                // 废弃物碳排放计算
                $emission = $this->calculate_waste_emission($data);
                break;
        }
        
        return round($emission, 2);
    }
    
    /**
     * 计算饮食碳排放
     */
    private function calculate_diet_emission($data) {
        $diet_factors = array(
            'meat_heavy' => 7.0, // kg CO2 per day
            'balanced' => 4.0,
            'vegetarian' => 3.0,
            'vegan' => 2.0
        );
        
        $diet_type = isset($data['diet_type']) ? $data['diet_type'] : 'balanced';
        
        return isset($diet_factors[$diet_type]) ? $diet_factors[$diet_type] : 4.0;
    }
    
    /**
     * 计算购物碳排放
     */
    private function calculate_shopping_emission($data) {
        // 简化的购物碳排放计算
        // 实际应用中可能需要更复杂的计算
        $emission = 0;
        
        if (isset($data['clothing_kg'])) {
            $emission += $data['clothing_kg'] * 15; // 每公斤衣物约15kg CO2
        }
        
        if (isset($data['electronics_count'])) {
            $emission += $data['electronics_count'] * 50; // 每件电子产品约50kg CO2
        }
        
        return $emission;
    }
    
    /**
     * 计算废弃物碳排放
     */
    private function calculate_waste_emission($data) {
        $waste_factors = array(
            'landfill' => 1.0, // kg CO2 per kg waste
            'recycled' => 0.1,
            'composted' => 0.05
        );
        
        $emission = 0;
        
        foreach ($data as $waste_type => $amount_kg) {
            if (isset($waste_factors[$waste_type])) {
                $emission += $waste_factors[$waste_type] * $amount_kg;
            }
        }
        
        return $emission;
    }
    
    /**
     * 单位转换
     */
    private function convert_energy_unit($value, $unit) {
        switch ($unit) {
            case 'm³': // 天然气立方米转kWh
                return $value * 10.55;
            case 'liter': // 燃油升转kWh
                return $value * 10.0;
            default:
                return $value;
        }
    }
    
    /**
     * 获取环保建议
     * 
     * @param float $total_emission 总排放量
     * @param array $breakdown 排放细分
     * @return array 建议列表
     */
    public function get_eco_tips($total_emission, $breakdown) {
        $tips = array();
        
        // 根据排放量给出建议
        if ($total_emission > 20) {
            $tips[] = "您的碳足迹较高,建议减少私家车使用,多使用公共交通。";
        }
        
        if (isset($breakdown['transport']) && $breakdown['transport'] > 10) {
            $tips[] = "交通排放占比较大,考虑拼车、使用公共交通或自行车出行。";
        }
        
        if (isset($breakdown['energy']) && $breakdown['energy'] > 5) {
            $tips[] = "能源消耗较高,建议使用节能电器,关闭不必要的电源。";
        }
        
        if (isset($breakdown['diet']) && $breakdown['diet'] > 5) {
            $tips[] = "考虑增加植物性饮食比例,减少肉类消费。";
        }
        
        if (count($tips) === 0) {
            $tips[] = "您的碳足迹表现良好!继续保持环保生活方式。";
        }
        
        return $tips;
    }
}

数据收集器类

创建 includes/class-data-collector.php

<?php
/**
 * 数据收集器类
 * 负责收集和存储用户碳足迹数据
 */

class CFT_Data_Collector {
    
    /**
     * 保存用户活动数据
     * 
     * @param int $user_id 用户ID(0表示匿名用户)
     * @param string $activity_type 活动类型
     * @param array $activity_data 活动数据
     * @param float $carbon_emission 碳排放量
     * @return int|false 插入ID或false
     */
    public function save_activity($user_id, $activity_type, $activity_data, $carbon_emission) {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'carbon_footprint_data';
        
        $result = $wpdb->insert(
            $table_name,
            array(
                'user_id' => $user_id,
                'activity_type' => $activity_type,
                'activity_data' => json_encode($activity_data),
                'carbon_emission' => $carbon_emission,
                'calculation_date' => current_time('mysql')
            ),
            array('%d', '%s', '%s', '%f', '%s')
        );
        
        return $result ? $wpdb->insert_id : false;
    }
    
    /**
     * 获取用户碳足迹数据
     * 
     * @param int $user_id 用户ID
     * @param string $period 时间周期(day, week, month, year)
     * @param string $activity_type 活动类型(可选)
     * @return array 碳足迹数据
     */
    public function get_user_footprint($user_id, $period = 'month', $activity_type = null) {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'carbon_footprint_data';
        
        // 根据时间周期设置日期范围
        $date_range = $this->get_date_range($period);
        
        $query = "SELECT * FROM $table_name 
                  WHERE user_id = %d 
                  AND calculation_date >= %s 
                  AND calculation_date <= %s";
        
        $params = array($user_id, $date_range['start'], $date_range['end']);
        
        if ($activity_type) {
            $query .= " AND activity_type = %s";
            $params[] = $activity_type;
        }
        
        $query .= " ORDER BY calculation_date DESC";
        
        $results = $wpdb->get_results(
            $wpdb->prepare($query, $params),
            ARRAY_A
        );
        
        // 解析JSON数据
        foreach ($results as &$row) {
            $row['activity_data'] = json_decode($row['activity_data'], true);
        }
        
        return $results;
    }
    
    /**
     * 获取汇总统计数据
     * 
     * @param int $user_id 用户ID
     * @param string $period 时间周期
     * @return array 汇总数据
     */
    public function get_summary_stats($user_id, $period = 'month') {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'carbon_footprint_data';
        $date_range = $this->get_date_range($period);
        

数据收集器类(续)

    /**
     * 获取汇总统计数据
     * 
     * @param int $user_id 用户ID
     * @param string $period 时间周期
     * @return array 汇总数据
     */
    public function get_summary_stats($user_id, $period = 'month') {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'carbon_footprint_data';
        $date_range = $this->get_date_range($period);
        
        // 获取总排放量
        $total_query = "SELECT SUM(carbon_emission) as total FROM $table_name 
                        WHERE user_id = %d 
                        AND calculation_date >= %s 
                        AND calculation_date <= %s";
        
        $total_result = $wpdb->get_row(
            $wpdb->prepare($total_query, array($user_id, $date_range['start'], $date_range['end']))
        );
        
        // 按活动类型分组统计
        $breakdown_query = "SELECT activity_type, SUM(carbon_emission) as total 
                            FROM $table_name 
                            WHERE user_id = %d 
                            AND calculation_date >= %s 
                            AND calculation_date <= %s 
                            GROUP BY activity_type";
        
        $breakdown_results = $wpdb->get_results(
            $wpdb->prepare($breakdown_query, array($user_id, $date_range['start'], $date_range['end'])),
            ARRAY_A
        );
        
        // 格式化分组数据
        $breakdown = array();
        foreach ($breakdown_results as $row) {
            $breakdown[$row['activity_type']] = floatval($row['total']);
        }
        
        // 获取趋势数据(最近7天)
        $trend_query = "SELECT DATE(calculation_date) as date, 
                               SUM(carbon_emission) as daily_total 
                        FROM $table_name 
                        WHERE user_id = %d 
                        AND calculation_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
                        GROUP BY DATE(calculation_date) 
                        ORDER BY date ASC";
        
        $trend_results = $wpdb->get_results(
            $wpdb->prepare($trend_query, array($user_id)),
            ARRAY_A
        );
        
        return array(
            'total_emission' => $total_result ? floatval($total_result->total) : 0,
            'breakdown' => $breakdown,
            'trend' => $trend_results,
            'period' => $period,
            'date_range' => $date_range
        );
    }
    
    /**
     * 获取日期范围
     */
    private function get_date_range($period) {
        $end_date = current_time('mysql');
        
        switch ($period) {
            case 'day':
                $start_date = date('Y-m-d H:i:s', strtotime('-1 day'));
                break;
            case 'week':
                $start_date = date('Y-m-d H:i:s', strtotime('-1 week'));
                break;
            case 'year':
                $start_date = date('Y-m-d H:i:s', strtotime('-1 year'));
                break;
            case 'month':
            default:
                $start_date = date('Y-m-d H:i:s', strtotime('-1 month'));
                break;
        }
        
        return array(
            'start' => $start_date,
            'end' => $end_date
        );
    }
    
    /**
     * 获取所有用户的汇总数据(管理员功能)
     */
    public function get_all_users_summary($period = 'month') {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'carbon_footprint_data';
        $date_range = $this->get_date_range($period);
        
        $query = "SELECT user_id, 
                         SUM(carbon_emission) as total_emission,
                         COUNT(*) as activity_count
                  FROM $table_name 
                  WHERE calculation_date >= %s 
                  AND calculation_date <= %s 
                  GROUP BY user_id 
                  ORDER BY total_emission DESC";
        
        return $wpdb->get_results(
            $wpdb->prepare($query, array($date_range['start'], $date_range['end'])),
            ARRAY_A
        );
    }
}

数据可视化类

创建 includes/class-data-visualizer.php

<?php
/**
 * 数据可视化类
 * 负责生成碳足迹数据的可视化图表
 */

class CFT_Data_Visualizer {
    
    /**
     * 生成排放量饼图数据
     */
    public function generate_pie_chart_data($breakdown_data) {
        $labels = array();
        $data = array();
        $background_colors = array();
        $border_colors = array();
        
        // 预定义颜色
        $colors = array(
            array('bg' => 'rgba(255, 99, 132, 0.7)', 'border' => 'rgba(255, 99, 132, 1)'),
            array('bg' => 'rgba(54, 162, 235, 0.7)', 'border' => 'rgba(54, 162, 235, 1)'),
            array('bg' => 'rgba(255, 206, 86, 0.7)', 'border' => 'rgba(255, 206, 86, 1)'),
            array('bg' => 'rgba(75, 192, 192, 0.7)', 'border' => 'rgba(75, 192, 192, 1)'),
            array('bg' => 'rgba(153, 102, 255, 0.7)', 'border' => 'rgba(153, 102, 255, 1)'),
            array('bg' => 'rgba(255, 159, 64, 0.7)', 'border' => 'rgba(255, 159, 64, 1)')
        );
        
        $color_index = 0;
        
        foreach ($breakdown_data as $category => $value) {
            // 美化分类名称
            $pretty_names = array(
                'transport' => '交通出行',
                'energy' => '能源消耗',
                'diet' => '饮食消费',
                'shopping' => '购物消费',
                'waste' => '废弃物处理'
            );
            
            $label = isset($pretty_names[$category]) ? $pretty_names[$category] : $category;
            $labels[] = $label . ' (' . $value . 'kg)';
            $data[] = $value;
            
            // 分配颜色
            $background_colors[] = $colors[$color_index]['bg'];
            $border_colors[] = $colors[$color_index]['border'];
            
            $color_index = ($color_index + 1) % count($colors);
        }
        
        return array(
            'labels' => $labels,
            'datasets' => array(
                array(
                    'data' => $data,
                    'backgroundColor' => $background_colors,
                    'borderColor' => $border_colors,
                    'borderWidth' => 1
                )
            )
        );
    }
    
    /**
     * 生成趋势折线图数据
     */
    public function generate_line_chart_data($trend_data) {
        $labels = array();
        $data = array();
        
        foreach ($trend_data as $day) {
            $labels[] = date('m/d', strtotime($day['date']));
            $data[] = floatval($day['daily_total']);
        }
        
        return array(
            'labels' => $labels,
            'datasets' => array(
                array(
                    'label' => '每日碳排放 (kg)',
                    'data' => $data,
                    'borderColor' => 'rgba(75, 192, 192, 1)',
                    'backgroundColor' => 'rgba(75, 192, 192, 0.2)',
                    'fill' => true,
                    'tension' => 0.4
                )
            )
        );
    }
    
    /**
     * 生成对比柱状图数据
     */
    public function generate_comparison_chart_data($user_data, $average_data) {
        $categories = array('交通', '能源', '饮食', '购物', '废弃物');
        
        return array(
            'labels' => $categories,
            'datasets' => array(
                array(
                    'label' => '您的排放',
                    'data' => $user_data,
                    'backgroundColor' => 'rgba(54, 162, 235, 0.7)',
                    'borderColor' => 'rgba(54, 162, 235, 1)',
                    'borderWidth' => 1
                ),
                array(
                    'label' => '平均排放',
                    'data' => $average_data,
                    'backgroundColor' => 'rgba(255, 99, 132, 0.7)',
                    'borderColor' => 'rgba(255, 99, 132, 1)',
                    'borderWidth' => 1
                )
            )
        );
    }
    
    /**
     * 生成环保成就徽章
     */
    public function generate_achievement_badges($total_emission, $period) {
        $badges = array();
        
        // 根据排放量判断成就
        if ($total_emission < 5) {
            $badges[] = array(
                'name' => '环保先锋',
                'description' => '月度碳排放低于5kg',
                'icon' => '🌿',
                'color' => 'green'
            );
        }
        
        if ($total_emission < 10) {
            $badges[] = array(
                'name' => '低碳达人',
                'description' => '月度碳排放低于10kg',
                'icon' => '🚲',
                'color' => 'blue'
            );
        }
        
        // 检查是否有连续低碳记录
        $badges[] = array(
            'name' => '持续行动者',
            'description' => '连续记录碳足迹超过30天',
            'icon' => '📅',
            'color' => 'purple'
        );
        
        return $badges;
    }
    
    /**
     * 渲染图表HTML
     */
    public function render_chart_html($chart_id, $chart_type, $chart_data, $options = array()) {
        $default_options = array(
            'height' => 300,
            'width' => 400
        );
        
        $options = wp_parse_args($options, $default_options);
        
        ob_start();
        ?>
        <div class="cft-chart-container">
            <canvas 
                id="<?php echo esc_attr($chart_id); ?>" 
                width="<?php echo esc_attr($options['width']); ?>" 
                height="<?php echo esc_attr($options['height']); ?>"
                data-chart-type="<?php echo esc_attr($chart_type); ?>"
                data-chart-data='<?php echo json_encode($chart_data); ?>'
            ></canvas>
        </div>
        <?php
        return ob_get_clean();
    }
}

数据导出处理器

创建 includes/class-export-handler.php

<?php
/**
 * 数据导出处理器类
 * 负责处理碳足迹数据的导出功能
 */

class CFT_Export_Handler {
    
    /**
     * 导出数据为CSV格式
     */
    public function export_to_csv($user_id, $period = 'month') {
        global $wpdb;
        
        $data_collector = new CFT_Data_Collector();
        $carbon_calculator = new CFT_Carbon_Calculator();
        
        // 获取用户数据
        $footprint_data = $data_collector->get_user_footprint($user_id, $period);
        $summary = $data_collector->get_summary_stats($user_id, $period);
        
        // 生成CSV内容
        $csv_content = "碳足迹追踪报告n";
        $csv_content .= "生成时间: " . current_time('Y-m-d H:i:s') . "n";
        $csv_content .= "统计周期: " . $period . "n";
        $csv_content .= "总排放量: " . $summary['total_emission'] . " kg CO2nn";
        
        $csv_content .= "活动明细:n";
        $csv_content .= "日期,活动类型,详细数据,碳排放量(kg)n";
        
        foreach ($footprint_data as $row) {
            $date = date('Y-m-d H:i', strtotime($row['calculation_date']));
            $activity_data = is_array($row['activity_data']) ? 
                            json_encode($row['activity_data'], JSON_UNESCAPED_UNICODE) : 
                            $row['activity_data'];
            
            $csv_content .= sprintf(
                '%s,%s,%s,%.2f',
                $date,
                $row['activity_type'],
                $activity_data,
                $row['carbon_emission']
            ) . "n";
        }
        
        // 添加汇总数据
        $csv_content .= "n分类汇总:n";
        $csv_content .= "分类,排放量(kg),占比n";
        
        $total = $summary['total_emission'];
        foreach ($summary['breakdown'] as $category => $emission) {
            $percentage = $total > 0 ? ($emission / $total * 100) : 0;
            $csv_content .= sprintf(
                '%s,%.2f,%.1f%%',
                $category,
                $emission,
                $percentage
            ) . "n";
        }
        
        // 添加环保建议
        $tips = $carbon_calculator->get_eco_tips($total, $summary['breakdown']);
        $csv_content .= "n环保建议:n";
        foreach ($tips as $index => $tip) {
            $csv_content .= ($index + 1) . ". " . $tip . "n";
        }
        
        return $csv_content;
    }
    
    /**
     * 导出数据为JSON格式
     */
    public function export_to_json($user_id, $period = 'month') {
        $data_collector = new CFT_Data_Collector();
        $carbon_calculator = new CFT_Carbon_Calculator();
        
        $footprint_data = $data_collector->get_user_footprint($user_id, $period);
        $summary = $data_collector->get_summary_stats($user_id, $period);
        
        $export_data = array(
            'metadata' => array(
                'export_date' => current_time('c'),
                'period' => $period,
                'user_id' => $user_id
            ),
            'summary' => $summary,
            'detailed_records' => $footprint_data,
            'eco_tips' => $carbon_calculator->get_eco_tips(
                $summary['total_emission'], 
                $summary['breakdown']
            )
        );
        
        return json_encode($export_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    }
    
    /**
     * 处理导出请求
     */
    public function handle_export_request() {
        if (!isset($_GET['cft_export']) || !wp_verify_nonce($_GET['nonce'], 'cft_export_nonce')) {
            return;
        }
        
        $user_id = get_current_user_id();
        $format = isset($_GET['format']) ? sanitize_text_field($_GET['format']) : 'csv';
        $period = isset($_GET['period']) ? sanitize_text_field($_GET['period']) : 'month';
        
        switch ($format) {
            case 'json':
                $content = $this->export_to_json($user_id, $period);
                $filename = 'carbon-footprint-' . date('Y-m-d') . '.json';
                $content_type = 'application/json';
                break;
                
            case 'csv':
            default:
                $content = $this->export_to_csv($user_id, $period);
                $filename = 'carbon-footprint-' . date('Y-m-d') . '.csv';
                $content_type = 'text/csv';
                break;
        }
        
        // 设置HTTP头,触发文件下载
        header('Content-Type: ' . $content_type);
        header('Content-Disposition: attachment; filename="' . $filename . '"');
        header('Content-Length: ' . strlen($content));
        header('Cache-Control: no-cache, no-store, must-revalidate');
        header('Pragma: no-cache');
        header('Expires: 0');
        
        echo $content;
        exit;
    }
}

前端界面模板

创建 templates/dashboard.php

<?php
/**
 * 管理面板模板
 */
if (!current_user_can('manage_options')) {
    wp_die('您没有权限访问此页面。');
}

$data_collector = new CFT_Data_Collector();
$carbon_calculator = new CFT_Carbon_Calculator();
$data_visualizer = new CFT_Data_Visualizer();

// 获取当前用户数据
$user_id = get_current_user_id();
$summary = $data_collector->get_summary_stats($user_id, 'month');
$tips = $carbon_calculator->get_eco_tips($summary['total_emission'], $summary['breakdown']);
$badges = $data_visualizer->generate_achievement_badges($summary['total_emission'], 'month');

// 生成图表数据
$pie_chart_data = $data_visualizer->generate_pie_chart_data($summary['breakdown']);
$line_chart_data = $data_visualizer->generate_line_chart_data($summary['trend']);
?>
<div class="wrap cft-dashboard">
    <h1>环保碳足迹追踪器</h1>
    
    <div class="cft-stats-summary">
        <div class="cft-stat-card">
            <h3>本月总排放</h3>
            <div class="cft-stat-value"><?php echo number_format($summary['total_emission'], 2); ?> kg</div>
            <p>二氧化碳当量</p>
        </div>
        
        <div class="cft-stat-card">
            <h3>活动记录</h3>
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/6311.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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