首页 / 教程文章 / WordPress柔性物流轨迹跟踪插件开发详解

WordPress柔性物流轨迹跟踪插件开发详解

WordPress柔性物流轨迹跟踪插件开发详解

引言:为什么需要柔性物流跟踪插件

在电子商务蓬勃发展的今天,物流信息的透明化已成为提升用户体验的关键环节。传统的物流跟踪方案往往缺乏灵活性,难以适应不同物流服务商的多样化数据格式。本文将详细介绍如何开发一个柔性物流轨迹跟踪插件,该插件能够适配多种物流API,提供可定制的跟踪界面,并支持实时状态更新。

一、插件架构设计

1.1 核心架构概述

我们的插件采用模块化设计,主要包含以下核心模块:

  • API适配器层:处理不同物流服务商的API接口
  • 数据解析器:统一处理各种格式的物流数据
  • 数据库管理层:存储物流跟踪信息
  • 前端展示层:用户界面和可视化组件
  • 缓存机制:优化性能,减少API调用

1.2 文件结构设计

wp-flexible-shipping-tracker/
├── includes/
│   ├── class-api-manager.php      # API管理器
│   ├── class-data-parser.php      # 数据解析器
│   ├── class-db-manager.php       # 数据库管理
│   └── class-cache-handler.php    # 缓存处理器
├── admin/
│   ├── class-admin-settings.php   # 后台设置
│   └── admin-page.php             # 管理页面
├── public/
│   ├── class-tracker-display.php  # 前端展示
│   └── css/tracker-styles.css     # 样式文件
├── assets/
│   └── js/tracker-scripts.js      # 前端脚本
└── wp-flexible-shipping-tracker.php # 主插件文件

二、数据库设计与实现

2.1 数据表结构

/**
 * 创建物流跟踪数据表
 * 这段代码应该在插件激活时执行
 */
function wfst_create_tracking_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'wfst_tracking_data';
    $charset_collate = $wpdb->get_charset_collate();
    
    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        order_id bigint(20) NOT NULL,
        tracking_number varchar(100) NOT NULL,
        carrier_code varchar(50) NOT NULL,
        carrier_name varchar(100) NOT NULL,
        status varchar(50) NOT NULL,
        estimated_delivery datetime DEFAULT NULL,
        last_updated datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        tracking_data longtext NOT NULL,  # 存储JSON格式的详细跟踪信息
        PRIMARY KEY (id),
        INDEX order_idx (order_id),
        INDEX tracking_idx (tracking_number),
        INDEX status_idx (status)
    ) $charset_collate;";
    
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
register_activation_hook(__FILE__, 'wfst_create_tracking_table');

2.2 数据模型类

class WFST_Tracking_Model {
    private $wpdb;
    private $table_name;
    
    public function __construct() {
        global $wpdb;
        $this->wpdb = $wpdb;
        $this->table_name = $wpdb->prefix . 'wfst_tracking_data';
    }
    
    /**
     * 保存或更新跟踪信息
     * @param array $tracking_data 跟踪数据数组
     * @return int|false 插入/更新的行ID或失败时返回false
     */
    public function save_tracking_data($tracking_data) {
        $defaults = array(
            'order_id' => 0,
            'tracking_number' => '',
            'carrier_code' => '',
            'carrier_name' => '',
            'status' => 'pending',
            'estimated_delivery' => null,
            'tracking_data' => '[]'
        );
        
        $data = wp_parse_args($tracking_data, $defaults);
        
        // 检查是否已存在相同订单和运单号的记录
        $existing = $this->get_tracking_by_order_and_number(
            $data['order_id'], 
            $data['tracking_number']
        );
        
        if ($existing) {
            // 更新现有记录
            return $this->wpdb->update(
                $this->table_name,
                $data,
                array('id' => $existing->id)
            );
        } else {
            // 插入新记录
            $this->wpdb->insert($this->table_name, $data);
            return $this->wpdb->insert_id;
        }
    }
    
    /**
     * 根据订单ID获取跟踪信息
     * @param int $order_id 订单ID
     * @return array 跟踪信息数组
     */
    public function get_tracking_by_order($order_id) {
        $query = $this->wpdb->prepare(
            "SELECT * FROM {$this->table_name} WHERE order_id = %d ORDER BY last_updated DESC",
            $order_id
        );
        return $this->wpdb->get_results($query);
    }
}

三、API适配器实现

3.1 抽象适配器基类

abstract class WFST_Carrier_Adapter {
    protected $api_key;
    protected $api_url;
    protected $carrier_code;
    
    public function __construct($api_key = '') {
        $this->api_key = $api_key;
        $this->init_api_config();
    }
    
    /**
     * 初始化API配置 - 由子类实现
     */
    abstract protected function init_api_config();
    
    /**
     * 获取物流跟踪信息
     * @param string $tracking_number 运单号
     * @return array 标准化的跟踪数据
     */
    abstract public function get_tracking_info($tracking_number);
    
    /**
     * 标准化跟踪数据
     * @param array $raw_data 原始API数据
     * @return array 标准化后的数据
     */
    protected function normalize_tracking_data($raw_data) {
        // 将不同API的响应转换为统一格式
        return array(
            'tracking_number' => $raw_data['tracking_number'] ?? '',
            'status' => $this->map_status($raw_data['status'] ?? ''),
            'estimated_delivery' => $raw_data['estimated_delivery'] ?? null,
            'checkpoints' => $this->parse_checkpoints($raw_data['checkpoints'] ?? []),
            'carrier_info' => array(
                'code' => $this->carrier_code,
                'name' => $raw_data['carrier_name'] ?? $this->carrier_code
            )
        );
    }
    
    /**
     * 映射状态到统一状态码
     * @param string $carrier_status 物流商状态
     * @return string 统一状态码
     */
    abstract protected function map_status($carrier_status);
    
    /**
     * 解析检查点数据
     * @param array $raw_checkpoints 原始检查点数据
     * @return array 标准化的检查点数组
     */
    protected function parse_checkpoints($raw_checkpoints) {
        $checkpoints = array();
        
        foreach ($raw_checkpoints as $checkpoint) {
            $checkpoints[] = array(
                'location' => $checkpoint['location'] ?? '',
                'description' => $checkpoint['description'] ?? '',
                'timestamp' => $checkpoint['timestamp'] ?? '',
                'status' => $checkpoint['status'] ?? ''
            );
        }
        
        // 按时间倒序排列
        usort($checkpoints, function($a, $b) {
            return strtotime($b['timestamp']) - strtotime($a['timestamp']);
        });
        
        return $checkpoints;
    }
}

3.2 具体物流商适配器示例

class WFST_SF_Express_Adapter extends WFST_Carrier_Adapter {
    protected function init_api_config() {
        $this->carrier_code = 'sf_express';
        $this->api_url = 'https://sf-express.com/api/v2/track';
    }
    
    public function get_tracking_info($tracking_number) {
        // 构建API请求
        $args = array(
            'headers' => array(
                'Content-Type' => 'application/json',
                'Authorization' => 'Bearer ' . $this->api_key
            ),
            'body' => json_encode(array(
                'trackingNumber' => $tracking_number,
                'language' => 'zh-CN'
            )),
            'timeout' => 15
        );
        
        // 发送请求
        $response = wp_remote_post($this->api_url, $args);
        
        if (is_wp_error($response)) {
            return array(
                'error' => true,
                'message' => $response->get_error_message()
            );
        }
        
        $body = wp_remote_retrieve_body($response);
        $data = json_decode($body, true);
        
        // 处理响应并标准化数据
        return $this->normalize_tracking_data($data);
    }
    
    protected function map_status($carrier_status) {
        // 将顺丰状态映射到统一状态
        $status_map = array(
            '已收件' => 'collected',
            '运输中' => 'in_transit',
            '派送中' => 'out_for_delivery',
            '已签收' => 'delivered',
            '异常' => 'exception'
        );
        
        return $status_map[$carrier_status] ?? 'unknown';
    }
}

四、前端展示组件

4.1 短代码实现

class WFST_Tracker_Display {
    
    /**
     * 初始化短代码
     */
    public function init() {
        add_shortcode('flexible_tracking', array($this, 'render_tracking_shortcode'));
    }
    
    /**
     * 渲染跟踪短代码
     * @param array $atts 短代码属性
     * @return string HTML内容
     */
    public function render_tracking_shortcode($atts) {
        $atts = shortcode_atts(array(
            'order_id' => 0,
            'tracking_number' => '',
            'show_title' => true,
            'layout' => 'vertical'
        ), $atts, 'flexible_tracking');
        
        // 获取跟踪数据
        $tracking_data = $this->get_tracking_data($atts);
        
        if (empty($tracking_data)) {
            return '<div class="wfst-no-data">暂无物流信息</div>';
        }
        
        // 渲染模板
        ob_start();
        include plugin_dir_path(__FILE__) . '../templates/tracking-display.php';
        return ob_get_clean();
    }
    
    /**
     * 获取跟踪数据
     */
    private function get_tracking_data($atts) {
        $model = new WFST_Tracking_Model();
        
        if (!empty($atts['tracking_number'])) {
            // 直接通过运单号查询
            return $model->get_tracking_by_number($atts['tracking_number']);
        } elseif (!empty($atts['order_id'])) {
            // 通过订单ID查询
            return $model->get_tracking_by_order($atts['order_id']);
        }
        
        return array();
    }
}

4.2 前端模板示例

<!-- templates/tracking-display.php -->
<div class="wfst-tracking-container wfst-layout-<?php echo esc_attr($layout); ?>">
    <?php if ($show_title): ?>
    <h3 class="wfst-title">物流跟踪信息</h3>
    <?php endif; ?>
    
    <?php foreach ($tracking_data as $tracking): ?>
    <div class="wfst-tracking-item">
        <div class="wfst-header">
            <span class="wfst-carrier"><?php echo esc_html($tracking->carrier_name); ?></span>
            <span class="wfst-number">运单号: <?php echo esc_html($tracking->tracking_number); ?></span>
            <span class="wfst-status wfst-status-<?php echo esc_attr($tracking->status); ?>">
                <?php echo $this->get_status_text($tracking->status); ?>
            </span>
        </div>
        
        <?php 
        $checkpoints = json_decode($tracking->tracking_data, true);
        if (!empty($checkpoints['checkpoints'])): 
        ?>
        <div class="wfst-timeline">
            <?php foreach ($checkpoints['checkpoints'] as $checkpoint): ?>
            <div class="wfst-checkpoint">
                <div class="wfst-checkpoint-dot"></div>
                <div class="wfst-checkpoint-content">
                    <div class="wfst-checkpoint-time">
                        <?php echo date('Y-m-d H:i', strtotime($checkpoint['timestamp'])); ?>
                    </div>
                    <div class="wfst-checkpoint-desc">
                        <?php echo esc_html($checkpoint['description']); ?>
                    </div>
                    <?php if (!empty($checkpoint['location'])): ?>
                    <div class="wfst-checkpoint-location">
                        <i class="wfst-icon-location"></i>
                        <?php echo esc_html($checkpoint['location']); ?>
                    </div>
                    <?php endif; ?>
                </div>
            </div>
            <?php endforeach; ?>
        </div>
        <?php endif; ?>
        
        <?php if (!empty($checkpoints['estimated_delivery'])): ?>
        <div class="wfst-estimated-delivery">
            预计送达: <?php echo date('Y年m月d日', strtotime($checkpoints['estimated_delivery'])); ?>
        </div>
        <?php endif; ?>
    </div>
    <?php endforeach; ?>
</div>

五、后台管理界面

5.1 设置页面实现

class WFST_Admin_Settings {
    
    public function __construct() {
        add_action('admin_menu', array($this, 'add_admin_menu'));
        add_action('admin_init', array($this, 'register_settings'));
    }
    
    public function add_admin_menu() {
        add_menu_page(
            '柔性物流跟踪设置',
            '物流跟踪',
            'manage_options',
            'wfst-settings',
            array($this, 'render_settings_page'),
            'dashicons-location-alt',
            56
        );
    }
    
    public function register_settings() {
        register_setting('wfst_settings_group', 'wfst_settings');
        
        add_settings_section(
            'wfst_api_section',
            'API设置',
            array($this, 'render_api_section'),
            'wfst-settings'
        );
        
        // 添加各个物流商的API设置字段
        $carriers = array('sf_express', 'yto', 'zto', 'sto', 'jd');
        
        foreach ($carriers as $carrier) {
            add_settings_field(
                "wfst_{$carrier}_api_key",
                $this->get_carrier_name($carrier) . ' API Key',
                array($this, 'render_api_key_field'),
                'wfst-settings',
                'wfst_api_section',
                array('carrier' => $carrier)
            );
        }
    }
    
    public function render_settings_page() {
        ?>
        <div class="wrap">
            <h1>柔性物流跟踪插件设置</h1>
            <form method="post" action="options.php">
                <?php
                settings_fields('wfst_settings_group');
                do_settings_sections('wfst-settings');
                submit_button();
                ?>
            </form>
            
            <div class="wfst-test-section">
                <h3>API测试</h3>
                <input type="text" id="wfst-test-tracking" placeholder="输入运单号进行测试">
                <select id="wfst-test-carrier">
                    <option value="sf_express">顺丰速运</option>
                    <option value="yto">圆通速递</option>
                    <option value="zto">中通快递</option>
                </select>
                <button id="wfst-test-btn" class="button button-secondary">测试API</button>
                <div id="wfst-test-result"></div>
            </div>
        </div>
        <?php
    }
}

六、性能优化与缓存机制

6.1 缓存处理器实现

class WFST_Cache_Handler {
    private $cache_group = 'wfst_tracking';
    private $cache_expiration = 300; // 5分钟
    
    /**
     * 获取缓存数据
     * @param string $key 缓存键
     * @return mixed 缓存数据或false
     */
    public function get($key) {
        $cache_key = $this->build_cache_key($key);
        $data = wp_cache_get($cache_key, $this->cache_group);
        
        if ($data === false) {
            // 尝试从数据库缓存获取
            $data = $this->get_from_db_cache($key);
            if ($data !== false) {
                // 回填到对象缓存
                wp_cache_set($cache_key, $data, $this->cache_group, $this->cache_expiration);
            }
        }
        
        return $data;
    }
    
    /**
     * 设置缓存数据
     * @param string $key 缓存键
     * @param mixed $data 要缓存的数据
     * @return bool 是否成功
     */
    public function set($key, $data) {
        $cache_key = $this->build_cache_key($key);
        
        // 设置对象缓存
        $result1 = wp_cache_set($cache_key, $data, $this->cache_group, $this->cache_expiration);
        
        // 设置数据库缓存
        $result2 = $this->set_to_db_cache($key, $data);
        
        return $result1 && $result2;
    }
    
    /**
     * 构建缓存键
     */
    private function build_cache_key($key) {
        return md5('wfst_' . $key);
    }
    
    /**
     * 从数据库缓存获取
     */
    private function get_from_db_cache($key) {
        global $wpdb;
        $query = $wpdb->prepare(
            "SELECT cache_value FROM {$table_name} 
             WHERE cache_key = %s AND expires > %s",
            $this->build_cache_key($key),
            current_time('mysql', 1)
        );
        
        $result = $wpdb->get_var($query);
        return $result ? maybe_unserialize($result) : false;
    }
    
    /**
     * 设置数据库缓存
     */
    private function set_to_db_cache($key, $data) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'wfst_cache';
        
        $expires = date('Y-m-d H:i:s', time() + $this->cache_expiration);
        
        return $wpdb->replace(
            $table_name,
            array(
                'cache_key' => $this->build_cache_key($key),
                'cache_value' => maybe_serialize($data),
                'expires' => $expires
            ),
            array('%s', '%s', '%s')
        );
    }
    
    /**
     * 清理过期缓存
     */
    public function cleanup_expired_cache() {
        global $wpdb;
        $table_name = $wpdb->prefix . 'wfst_cache';
        
        $wpdb->query(
            $wpdb->prepare(
                "DELETE FROM {$table_name} WHERE expires < %s",
                current_time('mysql', 1)
            )
        );
    }
}

6.2 异步更新机制

class WFST_Async_Updater {
    
    /**
     * 初始化异步更新器
     */
    public function init() {
        add_action('wp_ajax_wfst_update_tracking', array($this, 'handle_async_update'));
        add_action('wp_ajax_nopriv_wfst_update_tracking', array($this, 'handle_async_update'));
        
        // 定时清理缓存
        add_action('wfst_daily_cleanup', array($this, 'daily_cleanup'));
    }
    
    /**
     * 处理异步更新请求
     */
    public function handle_async_update() {
        // 验证nonce
        if (!wp_verify_nonce($_POST['nonce'], 'wfst_async_update')) {
            wp_die('安全验证失败', 403);
        }
        
        $tracking_id = intval($_POST['tracking_id']);
        $force_update = isset($_POST['force']) ? boolval($_POST['force']) : false;
        
        // 获取跟踪记录
        $model = new WFST_Tracking_Model();
        $tracking = $model->get_tracking_by_id($tracking_id);
        
        if (!$tracking) {
            wp_send_json_error('跟踪记录不存在');
        }
        
        // 检查是否需要更新(避免频繁调用API)
        if (!$force_update) {
            $last_updated = strtotime($tracking->last_updated);
            $now = time();
            
            // 根据状态设置不同的更新频率
            $update_intervals = array(
                'delivered' => 3600,      // 已签收:1小时更新一次
                'exception' => 1800,      // 异常:30分钟更新一次
                'out_for_delivery' => 300, // 派送中:5分钟更新一次
                'default' => 600          // 默认:10分钟更新一次
            );
            
            $interval = $update_intervals[$tracking->status] ?? $update_intervals['default'];
            
            if (($now - $last_updated) < $interval) {
                wp_send_json_success(array(
                    'message' => '数据未到更新时间',
                    'data' => json_decode($tracking->tracking_data, true)
                ));
            }
        }
        
        // 调用API更新数据
        $adapter = WFST_API_Manager::get_adapter($tracking->carrier_code);
        $new_data = $adapter->get_tracking_info($tracking->tracking_number);
        
        if (isset($new_data['error'])) {
            wp_send_json_error($new_data['message']);
        }
        
        // 更新数据库
        $model->update_tracking_data($tracking_id, array(
            'status' => $new_data['status'],
            'tracking_data' => json_encode($new_data),
            'estimated_delivery' => $new_data['estimated_delivery']
        ));
        
        // 清除相关缓存
        $cache_keys = array(
            "tracking_{$tracking_id}",
            "order_{$tracking->order_id}",
            "number_{$tracking->tracking_number}"
        );
        
        $cache = new WFST_Cache_Handler();
        foreach ($cache_keys as $key) {
            $cache->delete($key);
        }
        
        wp_send_json_success(array(
            'message' => '更新成功',
            'data' => $new_data
        ));
    }
    
    /**
     * 每日清理任务
     */
    public function daily_cleanup() {
        $cache = new WFST_Cache_Handler();
        $cache->cleanup_expired_cache();
        
        // 清理过期的跟踪记录
        $this->cleanup_old_tracking_records();
    }
    
    /**
     * 清理旧的跟踪记录
     */
    private function cleanup_old_tracking_records() {
        global $wpdb;
        $table_name = $wpdb->prefix . 'wfst_tracking_data';
        
        // 删除90天前已签收的记录
        $cutoff_date = date('Y-m-d H:i:s', strtotime('-90 days'));
        
        $wpdb->query(
            $wpdb->prepare(
                "DELETE FROM {$table_name} 
                 WHERE status = 'delivered' 
                 AND last_updated < %s",
                $cutoff_date
            )
        );
    }
}

七、插件集成与扩展

7.1 WooCommerce集成

class WFST_WooCommerce_Integration {
    
    public function init() {
        // 在订单详情页添加跟踪信息
        add_action('woocommerce_order_details_after_order_table', 
            array($this, 'display_tracking_in_order'), 10, 1);
        
        // 在订单列表页添加跟踪列
        add_filter('manage_edit-shop_order_columns', 
            array($this, 'add_tracking_column'));
        add_action('manage_shop_order_posts_custom_column', 
            array($this, 'display_tracking_column'), 10, 2);
        
        // 添加订单操作按钮
        add_filter('woocommerce_admin_order_actions', 
            array($this, 'add_tracking_action'), 10, 2);
        
        // 处理自动同步
        add_action('woocommerce_order_status_changed', 
            array($this, 'handle_order_status_change'), 10, 4);
    }
    
    /**
     * 在订单详情页显示跟踪信息
     */
    public function display_tracking_in_order($order) {
        $model = new WFST_Tracking_Model();
        $tracking_data = $model->get_tracking_by_order($order->get_id());
        
        if (empty($tracking_data)) {
            return;
        }
        
        echo '<div class="wfst-order-tracking-section">';
        echo '<h3>物流跟踪信息</h3>';
        
        foreach ($tracking_data as $tracking) {
            $checkpoints = json_decode($tracking->tracking_data, true);
            
            echo '<div class="wfst-order-tracking-item">';
            echo '<p><strong>' . esc_html($tracking->carrier_name) . '</strong>';
            echo ' - 运单号: ' . esc_html($tracking->tracking_number) . '</p>';
            
            if (!empty($checkpoints['checkpoints'])) {
                $latest = $checkpoints['checkpoints'][0];
                echo '<p>最新状态: ' . esc_html($latest['description']) . '</p>';
                echo '<p>时间: ' . date('Y-m-d H:i', strtotime($latest['timestamp'])) . '</p>';
            }
            
            echo '</div>';
        }
        
        echo '</div>';
    }
    
    /**
     * 处理订单状态变化
     */
    public function handle_order_status_change($order_id, $old_status, $new_status, $order) {
        // 当订单状态变为"处理中"时,自动创建跟踪记录
        if ($new_status === 'processing') {
            $this->auto_create_tracking($order);
        }
    }
    
    /**
     * 自动创建跟踪记录
     */
    private function auto_create_tracking($order) {
        // 获取订单中的运单号(如果有的话)
        $tracking_numbers = $order->get_meta('_tracking_numbers');
        
        if (!empty($tracking_numbers)) {
            $model = new WFST_Tracking_Model();
            
            foreach ($tracking_numbers as $number) {
                $model->save_tracking_data(array(
                    'order_id' => $order->get_id(),
                    'tracking_number' => $number['number'],
                    'carrier_code' => $number['carrier'],
                    'carrier_name' => $this->get_carrier_name($number['carrier']),
                    'status' => 'pending'
                ));
            }
        }
    }
}

7.2 REST API扩展

class WFST_REST_API {
    
    public function init() {
        add_action('rest_api_init', array($this, 'register_routes'));
    }
    
    /**
     * 注册REST API路由
     */
    public function register_routes() {
        register_rest_route('wfst/v1', '/tracking/(?P<id>d+)', array(
            'methods' => 'GET',
            'callback' => array($this, 'get_tracking'),
            'permission_callback' => array($this, 'check_permission'),
            'args' => array(
                'id' => array(
                    'validate_callback' => function($param) {
                        return is_numeric($param);
                    }
                )
            )
        ));
        
        register_rest_route('wfst/v1', '/tracking', array(
            'methods' => 'POST',
            'callback' => array($this, 'create_tracking'),
            'permission_callback' => array($this, 'check_permission')
        ));
        
        register_rest_route('wfst/v1', '/carriers', array(
            'methods' => 'GET',
            'callback' => array($this, 'get_carriers'),
            'permission_callback' => '__return_true'
        ));
    }
    
    /**
     * 获取跟踪信息
     */
    public function get_tracking($request) {
        $tracking_id = $request->get_param('id');
        
        $model = new WFST_Tracking_Model();
        $tracking = $model->get_tracking_by_id($tracking_id);
        
        if (!$tracking) {
            return new WP_Error('not_found', '跟踪记录不存在', array('status' => 404));
        }
        
        // 构建响应数据
        $response = array(
            'id' => $tracking->id,
            'order_id' => $tracking->order_id,
            'tracking_number' => $tracking->tracking_number,
            'carrier' => array(
                'code' => $tracking->carrier_code,
                'name' => $tracking->carrier_name
            ),
            'status' => $tracking->status,
            'estimated_delivery' => $tracking->estimated_delivery,
            'last_updated' => $tracking->last_updated,
            'tracking_data' => json_decode($tracking->tracking_data, true)
        );
        
        return rest_ensure_response($response);
    }
    
    /**
     * 创建跟踪记录
     */
    public function create_tracking($request) {
        $params = $request->get_json_params();
        
        // 验证必填字段
        $required = array('order_id', 'tracking_number', 'carrier_code');
        foreach ($required as $field) {
            if (empty($params[$field])) {
                return new WP_Error('missing_field', 
                    sprintf('缺少必填字段: %s', $field), 
                    array('status' => 400));
            }
        }
        
        $model = new WFST_Tracking_Model();
        $tracking_id = $model->save_tracking_data(array(
            'order_id' => intval($params['order_id']),
            'tracking_number' => sanitize_text_field($params['tracking_number']),
            'carrier_code' => sanitize_text_field($params['carrier_code']),
            'carrier_name' => sanitize_text_field($params['carrier_name'] ?? $params['carrier_code']),
            'status' => 'pending'
        ));
        
        if (!$tracking_id) {
            return new WP_Error('save_failed', '保存跟踪记录失败', array('status' => 500));
        }
        
        // 异步获取跟踪信息
        $this->async_fetch_tracking($tracking_id);
        
        return rest_ensure_response(array(
            'success' => true,
            'tracking_id' => $tracking_id,
            'message' => '跟踪记录创建成功'
        ));
    }
    
    /**
     * 权限检查
     */
    public function check_permission($request) {
        return current_user_can('manage_options') || 
               $this->validate_api_key($request);
    }
    
    /**
     * 验证API密钥
     */
    private function validate_api_key($request) {
        $api_key = $request->get_header('X-WFST-API-Key');
        $stored_key = get_option('wfst_api_key');
        
        return !empty($api_key) && hash_equals($stored_key, $api_key);
    }
}

八、插件部署与配置

8.1 主插件文件

<?php
/**
 * Plugin Name: WordPress柔性物流轨迹跟踪插件
 * Plugin URI: https://example.com/wfst
 * Description: 支持多物流商、可定制的物流轨迹跟踪插件
 * Version: 1.0.0
 * Author: Your Name
 * License: GPL v2 or later
 * Text Domain: wfst
 */

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

// 定义插件常量
define('WFST_VERSION', '1.0.0');
define('WFST_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('WFST_PLUGIN_URL', plugin_dir_url(__FILE__));

// 自动加载类
spl_autoload_register(function($class_name) {
    if (strpos($class_name, 'WFST_') === 0) {
        $file = WFST_PLUGIN_DIR . 'includes/' . strtolower(str_replace('_', '-', $class_name)) . '.php';
        if (file_exists($file)) {
            require_once $file;
        }
    }
});

// 初始化插件
class WFST_Plugin {
    
    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();
        $this->load_dependencies();
    }
    
    private function init_hooks() {
        // 激活/停用钩子
        register_activation_hook(__FILE__, array($this, 'activate'));
        register_deactivation_hook(__FILE__, array($this, 'deactivate'));
        
        // 初始化钩子
        add_action('plugins_loaded', array($this, 'init'));
        
        // 多语言支持
        add_action('init', array($this, 'load_textdomain'));
    }
    
    private function load_dependencies() {
        // 加载核心类
        require_once WFST_PLUGIN_DIR . 'includes/class-api-manager.php';
        require_once WFST_PLUGIN_DIR . 'includes/class-data-parser.php';
        require_once WFST_PLUGIN_DIR . 'includes/class-db-manager.php';
        require_once WFST_PLUGIN_DIR . 'includes/class-cache-handler.php';
        
        // 加载前端类
        require_once WFST_PLUGIN_DIR . 'public/class-tracker-display.php';
        
        // 加载后台类
        if (is_admin()) {
            require_once WFST_PLUGIN_DIR . 'admin/class-admin-settings.php';
            require_once WFST_PLUGIN_DIR . 'admin/class-admin-ajax.php';
        }
    }
    
    public function activate() {
        // 创建数据库表
        require_once WFST_PLUGIN_DIR . 'includes/class-db-manager.php';
        $db_manager = new WFST_DB_Manager();
        $db_manager->create_tables();
        
        // 设置默认选项
        $default_options = array(
            'cache_expiration' => 300,
            'auto_update' => true,
            'enable_woocommerce' => true
        );
        update_option('wfst_settings', $default_options);
        
        // 创建定时任务
        if (!wp_next_scheduled('wfst_daily_cleanup')) {
            wp_schedule_event(time(), 'daily', 'wfst_daily_cleanup');
        }
    }
    
    public function deactivate() {
        // 清理定时任务
        wp_clear_scheduled_hook('wfst_daily_cleanup');
        
        // 清理缓存
        $cache = new WFST_Cache_Handler();
        $cache->flush();
    }
    
    public function init() {
        // 初始化各个模块
        $api_manager = new WFST_API_Manager();
        $tracker_display = new WFST_Tracker_Display();
        $async_updater = new WFST_Async_Updater();
        
        // 初始化REST API
        $rest_api = new WFST_REST_API();
        $rest_api->init();
        
        // 如果WooCommerce激活,集成它
        if (class_exists('WooCommerce')) {
            $wc_integration = new WFST_WooCommerce_Integration();
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5831.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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