首页 / 教程文章 / WordPress柔性物流与配送集成插件开发指南

WordPress柔性物流与配送集成插件开发指南

WordPress柔性物流与配送集成插件开发指南

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

在当今电子商务蓬勃发展的时代,物流配送体验直接影响着商家的转化率和客户满意度。WordPress作为全球最流行的内容管理系统,其WooCommerce插件占据了电商市场的重要份额。然而,标准物流解决方案往往无法满足多样化的配送需求,特别是对于需要对接多个物流供应商、支持动态运费计算或提供定制化配送选项的商家。

柔性物流插件能够帮助商家根据产品特性、客户位置、订单金额等因素智能选择最优配送方案,同时提供实时跟踪、多仓库管理和配送时间预估等高级功能。本文将指导您开发一个功能完善的WordPress柔性物流与配送集成插件。

插件基础架构设计

1.1 创建插件基本结构

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

flexible-shipping-integration/
├── flexible-shipping.php          # 主插件文件
├── includes/
│   ├── class-shipping-core.php    # 核心物流类
│   ├── class-carrier-manager.php  # 物流商管理器
│   ├── class-rate-calculator.php  # 运费计算器
│   └── class-order-tracker.php    # 订单追踪器
├── admin/
│   ├── css/
│   ├── js/
│   └── class-admin-settings.php   # 后台设置
├── public/
│   ├── css/
│   ├── js/
│   └── class-public-display.php   # 前端显示
└── templates/                     # 模板文件

1.2 主插件文件配置

<?php
/**
 * Plugin Name: Flexible Shipping Integration
 * Plugin URI: https://yourwebsite.com/flexible-shipping
 * Description: 一个灵活的WordPress物流与配送集成插件,支持多物流商和智能运费计算
 * Version: 1.0.0
 * Author: Your Name
 * License: GPL v2 or later
 * Text Domain: flexible-shipping
 */

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

// 定义插件常量
define('FSI_VERSION', '1.0.0');
define('FSI_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('FSI_PLUGIN_URL', plugin_dir_url(__FILE__));

// 检查WooCommerce是否激活
add_action('admin_init', 'fsi_check_woocommerce');
function fsi_check_woocommerce() {
    if (!class_exists('WooCommerce')) {
        add_action('admin_notices', 'fsi_woocommerce_missing_notice');
        deactivate_plugins(plugin_basename(__FILE__));
    }
}

function fsi_woocommerce_missing_notice() {
    ?>
    <div class="notice notice-error">
        <p><?php _e('Flexible Shipping Integration需要WooCommerce插件才能正常工作。', 'flexible-shipping'); ?></p>
    </div>
    <?php
}

// 初始化插件
add_action('plugins_loaded', 'fsi_init_plugin');
function fsi_init_plugin() {
    if (!class_exists('WooCommerce')) {
        return;
    }
    
    // 加载核心类
    require_once FSI_PLUGIN_DIR . 'includes/class-shipping-core.php';
    require_once FSI_PLUGIN_DIR . 'includes/class-carrier-manager.php';
    require_once FSI_PLUGIN_DIR . 'includes/class-rate-calculator.php';
    require_once FSI_PLUGIN_DIR . 'includes/class-order-tracker.php';
    
    // 初始化核心类
    $flexible_shipping = new Flexible_Shipping_Core();
    $flexible_shipping->init();
}

核心物流类实现

2.1 物流方法集成

<?php
/**
 * 核心物流类 - 集成到WooCommerce物流方法
 */
class Flexible_Shipping_Core {
    
    private $carrier_manager;
    private $rate_calculator;
    
    public function __construct() {
        $this->carrier_manager = new Carrier_Manager();
        $this->rate_calculator = new Rate_Calculator();
    }
    
    public function init() {
        // 添加自定义物流方法到WooCommerce
        add_filter('woocommerce_shipping_methods', array($this, 'add_shipping_method'));
        
        // 注册物流方法类
        add_action('woocommerce_shipping_init', array($this, 'shipping_method_init'));
        
        // 添加设置链接
        add_filter('plugin_action_links_' . plugin_basename(FSI_PLUGIN_DIR . 'flexible-shipping.php'), 
                  array($this, 'add_settings_link'));
    }
    
    /**
     * 初始化物流方法类
     */
    public function shipping_method_init() {
        require_once FSI_PLUGIN_DIR . 'includes/class-wc-shipping-flexible.php';
    }
    
    /**
     * 添加自定义物流方法
     */
    public function add_shipping_method($methods) {
        $methods['flexible_shipping'] = 'WC_Shipping_Flexible';
        return $methods;
    }
    
    /**
     * 添加插件设置链接
     */
    public function add_settings_link($links) {
        $settings_link = '<a href="' . admin_url('admin.php?page=wc-settings&tab=shipping&section=flexible_shipping') . '">' . 
                         __('设置', 'flexible-shipping') . '</a>';
        array_unshift($links, $settings_link);
        return $links;
    }
}

2.2 自定义WooCommerce物流方法

<?php
/**
 * WooCommerce自定义物流方法类
 */
class WC_Shipping_Flexible extends WC_Shipping_Method {
    
    /**
     * 构造函数
     */
    public function __construct($instance_id = 0) {
        $this->id = 'flexible_shipping';
        $this->instance_id = absint($instance_id);
        $this->method_title = __('柔性物流', 'flexible-shipping');
        $this->method_description = __('灵活配置的多物流商配送解决方案', 'flexible-shipping');
        $this->supports = array(
            'shipping-zones',
            'instance-settings',
            'instance-settings-modal'
        );
        
        // 初始化设置
        $this->init();
        
        // 保存设置
        add_action('woocommerce_update_options_shipping_' . $this->id, array($this, 'process_admin_options'));
    }
    
    /**
     * 初始化设置
     */
    public function init() {
        // 加载设置表单
        $this->init_form_fields();
        $this->init_settings();
        
        // 定义用户可设置的变量
        $this->title = $this->get_option('title');
        $this->tax_status = $this->get_option('tax_status');
        $this->enabled = $this->get_option('enabled');
        
        // 保存设置
        add_action('woocommerce_update_options_shipping_' . $this->id, array($this, 'process_admin_options'));
    }
    
    /**
     * 初始化设置字段
     */
    public function init_form_fields() {
        $this->form_fields = array(
            'enabled' => array(
                'title' => __('启用/禁用', 'flexible-shipping'),
                'type' => 'checkbox',
                'label' => __('启用此物流方法', 'flexible-shipping'),
                'default' => 'yes'
            ),
            'title' => array(
                'title' => __('物流标题', 'flexible-shipping'),
                'type' => 'text',
                'description' => __('客户在结账时看到的物流选项标题', 'flexible-shipping'),
                'default' => __('柔性物流配送', 'flexible-shipping'),
                'desc_tip' => true
            ),
            'default_carrier' => array(
                'title' => __('默认物流商', 'flexible-shpping'),
                'type' => 'select',
                'description' => __('当没有匹配规则时使用的默认物流商', 'flexible-shipping'),
                'default' => 'local',
                'options' => array(
                    'local' => __('本地配送', 'flexible-shipping'),
                    'express' => __('快递服务', 'flexible-shipping'),
                    'economy' => __('经济型物流', 'flexible-shipping')
                )
            )
        );
    }
    
    /**
     * 计算运费 - 核心方法
     */
    public function calculate_shipping($package = array()) {
        global $wpdb;
        
        // 获取配送地址
        $destination = $package['destination'];
        
        // 获取购物车信息
        $cart_total = WC()->cart->get_cart_contents_total();
        $cart_weight = WC()->cart->get_cart_contents_weight();
        
        // 调用运费计算器
        $rates = $this->calculate_flexible_rates($destination, $cart_total, $cart_weight);
        
        // 添加物流选项到WooCommerce
        foreach ($rates as $rate) {
            $this->add_rate(array(
                'id' => $this->get_rate_id($rate['id']),
                'label' => $rate['label'],
                'cost' => $rate['cost'],
                'meta_data' => array(
                    'carrier' => $rate['carrier'],
                    'estimated_days' => $rate['estimated_days']
                )
            ));
        }
    }
    
    /**
     * 计算灵活运费
     */
    private function calculate_flexible_rates($destination, $cart_total, $cart_weight) {
        $rates = array();
        
        // 示例:根据订单金额提供不同物流选项
        if ($cart_total < 50) {
            // 小金额订单提供经济型选项
            $rates[] = array(
                'id' => 'economy',
                'label' => __('经济配送 (5-7个工作日)', 'flexible-shipping'),
                'cost' => 5.99,
                'carrier' => 'economy',
                'estimated_days' => '5-7'
            );
        } else {
            // 大金额订单提供免费快递
            $rates[] = array(
                'id' => 'free_express',
                'label' => __('免费快递 (2-3个工作日)', 'flexible-shipping'),
                'cost' => 0,
                'carrier' => 'express',
                'estimated_days' => '2-3'
            );
        }
        
        // 添加加急选项
        $rates[] = array(
            'id' => 'priority',
            'label' => __('加急配送 (1-2个工作日)', 'flexible-shipping'),
            'cost' => 12.99,
            'carrier' => 'express',
            'estimated_days' => '1-2'
        );
        
        return $rates;
    }
}

物流商管理器开发

3.1 多物流商集成架构

<?php
/**
 * 物流商管理器类
 */
class Carrier_Manager {
    
    private $carriers = array();
    
    public function __construct() {
        $this->load_carriers();
    }
    
    /**
     * 加载所有可用物流商
     */
    private function load_carriers() {
        // 内置物流商
        $this->carriers = array(
            'local' => array(
                'name' => __('本地配送', 'flexible-shipping'),
                'class' => 'Local_Carrier',
                'enabled' => true
            ),
            'express' => array(
                'name' => __('快递服务', 'flexible-shipping'),
                'class' => 'Express_Carrier',
                'enabled' => true
            )
        );
        
        // 允许通过过滤器添加更多物流商
        $this->carriers = apply_filters('fsi_available_carriers', $this->carriers);
    }
    
    /**
     * 获取所有启用的物流商
     */
    public function get_enabled_carriers() {
        return array_filter($this->carriers, function($carrier) {
            return $carrier['enabled'];
        });
    }
    
    /**
     * 计算所有物流商的运费
     */
    public function calculate_all_rates($package) {
        $rates = array();
        
        foreach ($this->get_enabled_carriers() as $carrier_id => $carrier_info) {
            $carrier_class = $carrier_info['class'];
            
            if (class_exists($carrier_class)) {
                $carrier = new $carrier_class();
                $carrier_rates = $carrier->calculate_rates($package);
                
                if (!empty($carrier_rates)) {
                    $rates = array_merge($rates, $carrier_rates);
                }
            }
        }
        
        return $rates;
    }
}

/**
 * 物流商抽象类
 */
abstract class Abstract_Carrier {
    
    protected $id;
    protected $name;
    protected $api_key;
    
    abstract public function calculate_rates($package);
    abstract public function track_shipment($tracking_number);
    
    /**
     * 验证配送地址
     */
    protected function validate_address($address) {
        // 基本地址验证
        if (empty($address['country'])) {
            return false;
        }
        
        // 这里可以添加更复杂的地址验证逻辑
        return true;
    }
    
    /**
     * 计算基于重量的运费
     */
    protected function calculate_weight_based_cost($weight, $base_cost, $per_kg_cost) {
        if ($weight <= 0) {
            return $base_cost;
        }
        
        return $base_cost + ($weight * $per_kg_cost);
    }
}

/**
 * 本地配送物流商实现
 */
class Local_Carrier extends Abstract_Carrier {
    
    public function __construct() {
        $this->id = 'local';
        $this->name = __('本地配送', 'flexible-shipping');
        $this->api_key = get_option('fsi_local_carrier_api_key', '');
    }
    
    public function calculate_rates($package) {
        $rates = array();
        
        // 只支持本地配送
        if ($package['destination']['country'] !== WC()->countries->get_base_country()) {
            return $rates;
        }
        
        // 计算本地配送费用
        $cart_total = WC()->cart->get_cart_contents_total();
        $cost = 0;
        
        if ($cart_total < 100) {
            $cost = 4.99;
        }
        
        $rates[] = array(
            'id' => $this->id,
            'label' => sprintf(__('%s (1-3个工作日)', 'flexible-shipping'), $this->name),
            'cost' => $cost,
            'carrier' => $this->id,
            'estimated_days' => '1-3'
        );
        
        return $rates;
    }
    
    public function track_shipment($tracking_number) {
        // 本地配送通常没有跟踪号
        return array(
            'status' => 'delivered',
            'message' => __('本地配送订单通常没有跟踪信息', 'flexible-shipping')
        );
    }
}

后台管理系统实现

4.1 插件设置页面

<?php
/**
 * 后台设置类
 */
class FSI_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_submenu_page(
            'woocommerce',
            __('柔性物流设置', 'flexible-shipping'),
            __('柔性物流', 'flexible-shipping'),
            'manage_options',
            'flexible-shipping-settings',
            array($this, 'render_settings_page')
        );
    }
    
    /**
     * 注册设置
     */
    public function register_settings() {
        register_setting('fsi_settings_group', 'fsi_general_settings');
        
        add_settings_section(
            'fsi_general_section',
            __('常规设置', 'flexible-shipping'),
            array($this, 'render_general_section'),
            'flexible-shipping-settings'
        );
        
        add_settings_field(
            'enable_debug',
            __('调试模式', 'flexible-shipping'),
            array($this, 'render_enable_debug_field'),
            'flexible-shipping-settings',
            'fsi_general_section'
        );
        
        add_settings_field(
            'default_weight_unit',
            __('默认重量单位', 'flexible-shipping'),
            array($this, 'render_weight_unit_field'),
            'flexible-shipping-settings',
            'fsi_general_section'
        );
    }
    
    /**
     * 渲染设置页面
     */
    public function render_settings_page() {
        ?>
        <div class="wrap">
            <h1><?php echo esc_html(get_admin_page_title()); ?></h1>
            
            <div class="fsi-admin-container">
                <div class="fsi-admin-header">
                    <h2><?php _e('柔性物流配置', 'flexible-shipping'); ?></h2>
                    <p><?php _e('配置您的物流和配送设置', 'flexible-shipping'); ?></p>
                </div>
                
                <div class="fsi-admin-content">
                    <form method="post" action="options.php">
                        <?php
                        settings_fields('fsi_settings_group');
                        do_settings_sections('flexible-shipping-settings');
                        submit_button();
                        ?>
                    </form>
                    
                    <div class="fsi-stats-box">
                        <h3><?php _e('物流统计', 'flexible-shipping'); ?></h3>
                        <?php $this->render_shipping_stats(); ?>
                    </div>
                </div>
            </div>
        </div>
        
        <style>
            .fsi-admin-container {
                background: #fff;
                padding: 20px;
                margin-top: 20px;
                border-radius: 5px;
                box-shadow: 0 1px 3px rgba(0,0,0,0.1);
            }
            .fsi-stats-box {
                margin-top: 30px;
                padding: 20px;
                background: #f8f9fa;
                border-left: 4px solid #2271b1;
            }
        </style>
        <?php
    }
    
    /**
     * 渲染常规设置部分
     */
    public function render_general_section() {
        echo '<p>' . __('配置插件的基本设置。', 'flexible-shipping') . '</p>';
    }
    
    /**
     * 渲染调试模式字段
     */
    public function render_enable_debug_field() {
        $options = get_option('fsi_general_settings');
        $checked = isset($options['enable_debug']) ? $options['enable_debug'] : 0;
        ?>
        <input type="checkbox" name="fsi_general_settings[enable_debug]" value="1" <?php checked(1, $checked); ?>>
        <label><?php _e('启用调试日志(记录运费计算过程)', 'flexible-shipping'); ?></label>
        <?php
    }
    
    /**
     * 渲染重量单位字段
     */
    public function render_weight_unit_field() {
        $options = get_option('fsi_general_settings');
        $selected = isset($options['default_weight_unit']) ? $options['default_weight_unit'] : 'kg';
        ?>
        <select name="fsi_general_settings[default_weight_unit]">
            <option value="kg" <?php selected($selected, 'kg'); ?>><?php _e('千克 (kg)', 'flexible-shipping'); ?></option>
            <option value="g" <?php selected($selected, 'g'); ?>><?php _e('克 (g)', 'flexible-shipping'); ?></option>
            <option value="lb" <?php selected($selected, 'lb'); ?>><?php _e('磅 (lb)', 'flexible-shipping'); ?></option>
        </select>
        <?php
    }
    
    /**
     * 渲染物流统计
     */
    private function render_shipping_stats() {
        global $wpdb;
        
        // 获取最近30天的物流统计
        $thirty_days_ago = date('Y-m-d', strtotime('-30 days'));
        
        $stats = $wpdb->get_results($wpdb->prepare("
            SELECT meta_value as carrier, COUNT(*) as count
            FROM {$wpdb->prefix}woocommerce_order_itemmeta
            WHERE meta_key = 'carrier'
            AND order_item_id IN (
                SELECT order_item_id 
                FROM {$wpdb->prefix}woocommerce_order_items 
                WHERE order_id IN (
                    SELECT ID 
                    FROM {$wpdb->posts} 
                    WHERE post_type = 'shop_order' 
                    AND post_date >= %s
                )
            )
            GROUP BY meta_value
        ", $thirty_days_ago));
        
        if ($stats) {
            echo '<ul>';
            foreach ($stats as $stat) {
                echo '<li>' . esc_html($stat->carrier) . ': ' . $stat->count . ' ' . __('单', 'flexible-shipping') . '</li>';
            }
            echo '</ul>';
        } else {
            echo '<p>' . __('暂无统计数据', 'flexible-shipping') . '</p>';
        }
    }
}

运费计算器高级功能

5.1 智能运费计算引擎

<?php
/**
 * 高级运费计算器
 */
class Advanced_Rate_Calculator {
    
    /**
     * 计算基于规则的运费
     */
    public function calculate_by_rules($package, $rules) {
        $applicable_rates = array();
        
        foreach ($rules as $rule) {
            if ($this->is_rule_applicable($rule, $package)) {
                $rate = $this->apply_rule($rule, $package);
                if ($rate) {
                    $applicable_rates[] = $rate;
                }
            }
        }
        
        // 如果没有匹配规则,使用默认规则
        if (empty($applicable_rates)) {
            $applicable_rates[] = $this->get_default_rate($package);
        }
        
        return $applicable_rates;
    }
    
    /**
     * 检查规则是否适用
     */
    private function is_rule_applicable($rule, $package) {
        $conditions = $rule['conditions'];
        $all_conditions_met = true;
        
        foreach ($conditions as $condition) {
            if (!$this->check_condition($condition, $package)) {
                $all_conditions_met = false;
                break;
            }
        }
        
        return $all_conditions_met;
    }
    
    /**
     * 检查单个条件
     */
    private function check_condition($condition, $package) {
        switch ($condition['type']) {
            case 'cart_total':
                $cart_total = WC()->cart->get_cart_contents_total();
                return $this->compare_values(
                    $cart_total, 
                    $condition['value'], 
                    $condition['operator']
                );
                
            case 'cart_weight':
                $cart_weight = WC()->cart->get_cart_contents_weight();
                return $this->compare_values(
                    $cart_weight, 
                    $condition['value'], 
                    $condition['operator']
                );
                
            case 'shipping_country':
                $country = $package['destination']['country'];
                return in_array($country, (array)$condition['value']);
                
            case 'shipping_state':
                $state = $package['destination']['state'];
                return in_array($state, (array)$condition['value']);
                
            case 'shipping_postcode':
                $postcode = $package['destination']['postcode'];
                return $this->check_postcode($postcode, $condition['value']);
                
            default:
                // 允许通过过滤器添加自定义条件
                return apply_filters(
                    'fsi_check_condition_' . $condition['type'], 
                    false, 
                    $condition, 
                    $package
                );
        }
    }
    
    /**
     * 比较数值
     */
    private function compare_values($actual, $expected, $operator) {
        switch ($operator) {
            case '==':
                return $actual == $expected;
            case '!=':
                return $actual != $expected;
            case '>':
                return $actual > $expected;
            case '>=':
                return $actual >= $expected;
            case '<':
                return $actual < $expected;
            case '<=':
                return $actual <= $expected;
            default:
                return false;
        }
    }
    
    /**
     * 检查邮政编码
     */
    private function check_postcode($postcode, $pattern) {
        // 支持通配符和范围
        if (strpos($pattern, '*') !== false) {
            $regex = '/^' . str_replace('*', '.*', $pattern) . '$/';
            return preg_match($regex, $postcode);
        }
        
        // 支持范围 1000-2000
        if (strpos($pattern, '-') !== false) {
            list($min, $max) = explode('-', $pattern);
            return ($postcode >= $min && $postcode <= $max);
        }
        
        return $postcode == $pattern;
    }
    
    /**
     * 应用规则计算运费
     */
    private function apply_rule($rule, $package) {
        $cost = $rule['base_cost'];
        
        // 添加基于重量的费用
        if (!empty($rule['weight_cost'])) {
            $weight = WC()->cart->get_cart_contents_weight();
            $cost += $weight * $rule['weight_cost'];
        }
        
        // 添加基于数量的费用
        if (!empty($rule['item_cost'])) {
            $item_count = WC()->cart->get_cart_contents_count();
            $cost += $item_count * $rule['item_cost'];
        }
        
        // 添加基于距离的费用(如果支持)
        if (!empty($rule['distance_cost']) && function_exists('fsi_calculate_distance')) {
            $distance = fsi_calculate_distance($package['destination']);
            $cost += $distance * $rule['distance_cost'];
        }
        
        return array(
            'id' => 'rule_' . $rule['id'],
            'label' => $rule['name'],
            'cost' => max(0, $cost), // 确保费用不为负数
            'carrier' => $rule['carrier'],
            'estimated_days' => $rule['estimated_days']
        );
    }
    
    /**
     * 获取默认运费
     */
    private function get_default_rate($package) {
        $default_carrier = get_option('fsi_default_carrier', 'local');
        $default_cost = get_option('fsi_default_shipping_cost', 5.99);
        
        return array(
            'id' => 'default',
            'label' => __('标准配送', 'flexible-shipping'),
            'cost' => $default_cost,
            'carrier' => $default_carrier,
            'estimated_days' => '3-5'
        );
    }
}

订单追踪系统

6.1 实时物流追踪

<?php
/**
 * 订单追踪器类
 */
class Order_Tracker {
    
    public function __construct() {
        add_action('woocommerce_order_details_after_order_table', array($this, 'display_tracking_info'), 10, 1);
        add_action('add_meta_boxes', array($this, 'add_tracking_meta_box'));
        add_action('woocommerce_process_shop_order_meta', array($this, 'save_tracking_data'), 10, 2);
    }
    
    /**
     * 在前端订单详情页显示追踪信息
     */
    public function display_tracking_info($order) {
        $tracking_data = $this->get_tracking_data($order->get_id());
        
        if (empty($tracking_data)) {
            return;
        }
        
        ?>
        <div class="fsi-tracking-info">
            <h3><?php _e('物流追踪信息', 'flexible-shipping'); ?></h3>
            <div class="tracking-details">
                <p><strong><?php _e('物流商:', 'flexible-shipping'); ?></strong> 
                   <?php echo esc_html($tracking_data['carrier_name']); ?></p>
                <p><strong><?php _e('追踪号码:', 'flexible-shipping'); ?></strong> 
                   <?php echo esc_html($tracking_data['tracking_number']); ?></p>
                
                <?php if (!empty($tracking_data['tracking_url'])): ?>
                    <p><a href="<?php echo esc_url($tracking_data['tracking_url']); ?>" 
                          target="_blank" class="button">
                        <?php _e('查看物流详情', 'flexible-shipping'); ?>
                    </a></p>
                <?php endif; ?>
                
                <?php if (!empty($tracking_data['status'])): ?>
                    <div class="tracking-status">
                        <strong><?php _e('当前状态:', 'flexible-shipping'); ?></strong>
                        <span class="status-badge status-<?php echo esc_attr($tracking_data['status']); ?>">
                            <?php echo $this->get_status_text($tracking_data['status']); ?>
                        </span>
                    </div>
                <?php endif; ?>
                
                <?php if (!empty($tracking_data['events'])): ?>
                    <div class="tracking-timeline">
                        <h4><?php _e('物流轨迹', 'flexible-shipping'); ?></h4>
                        <ul>
                            <?php foreach ($tracking_data['events'] as $event): ?>
                                <li>
                                    <span class="event-time"><?php echo esc_html($event['time']); ?></span>
                                    <span class="event-description"><?php echo esc_html($event['description']); ?></span>
                                    <span class="event-location"><?php echo esc_html($event['location']); ?></span>
                                </li>
                            <?php endforeach; ?>
                        </ul>
                    </div>
                <?php endif; ?>
            </div>
        </div>
        
        <style>
            .fsi-tracking-info {
                margin: 20px 0;
                padding: 20px;
                background: #f8f9fa;
                border-radius: 5px;
            }
            .status-badge {
                display: inline-block;
                padding: 3px 10px;
                border-radius: 12px;
                font-size: 12px;
                margin-left: 10px;
            }
            .status-pending { background: #ffc107; color: #000; }
            .status-in_transit { background: #17a2b8; color: #fff; }
            .status-delivered { background: #28a745; color: #fff; }
            .tracking-timeline ul {
                list-style: none;
                padding-left: 0;
                border-left: 2px solid #ddd;
                margin-left: 10px;
            }
            .tracking-timeline li {
                padding: 10px 0 10px 20px;
                position: relative;
            }
            .tracking-timeline li:before {
                content: '';
                position: absolute;
                left: -6px;
                top: 15px;
                width: 10px;
                height: 10px;
                border-radius: 50%;
                background: #2271b1;
            }
        </style>
        <?php
    }
    
    /**
     * 添加追踪信息元框
     */
    public function add_tracking_meta_box() {
        add_meta_box(
            'fsi_tracking_info',
            __('物流追踪信息', 'flexible-shipping'),
            array($this, 'render_tracking_meta_box'),
            'shop_order',
            'side',
            'high'
        );
    }
    
    /**
     * 渲染追踪信息元框
     */
    public function render_tracking_meta_box($post) {
        $order_id = $post->ID;
        $tracking_data = $this->get_tracking_data($order_id);
        
        wp_nonce_field('fsi_save_tracking_data', 'fsi_tracking_nonce');
        ?>
        <div class="tracking-fields">
            <p>
                <label for="fsi_carrier"><?php _e('物流商:', 'flexible-shipping'); ?></label>
                <select id="fsi_carrier" name="fsi_tracking[carrier]" style="width:100%;">
                    <option value=""><?php _e('选择物流商', 'flexible-shipping'); ?></option>
                    <option value="local" <?php selected($tracking_data['carrier'] ?? '', 'local'); ?>>
                        <?php _e('本地配送', 'flexible-shipping'); ?>
                    </option>
                    <option value="express" <?php selected($tracking_data['carrier'] ?? '', 'express'); ?>>
                        <?php _e('快递服务', 'flexible-shipping'); ?>
                    </option>
                    <option value="economy" <?php selected($tracking_data['carrier'] ?? '', 'economy'); ?>>
                        <?php _e('经济物流', 'flexible-shipping'); ?>
                    </option>
                </select>
            </p>
            
            <p>
                <label for="fsi_tracking_number"><?php _e('追踪号码:', 'flexible-shipping'); ?></label>
                <input type="text" id="fsi_tracking_number" 
                       name="fsi_tracking[tracking_number]" 
                       value="<?php echo esc_attr($tracking_data['tracking_number'] ?? ''); ?>" 
                       style="width:100%;">
            </p>
            
            <p>
                <label for="fsi_tracking_url"><?php _e('追踪链接:', 'flexible-shipping'); ?></label>
                <input type="url" id="fsi_tracking_url" 
                       name="fsi_tracking[tracking_url]" 
                       value="<?php echo esc_url($tracking_data['tracking_url'] ?? ''); ?>" 
                       style="width:100%;"
                       placeholder="https://">
            </p>
            
            <p>
                <label for="fsi_tracking_status"><?php _e('物流状态:', 'flexible-shipping'); ?></label>
                <select id="fsi_tracking_status" name="fsi_tracking[status]" style="width:100%;">
                    <option value="pending" <?php selected($tracking_data['status'] ?? '', 'pending'); ?>>
                        <?php _e('待处理', 'flexible-shipping'); ?>
                    </option>
                    <option value="in_transit" <?php selected($tracking_data['status'] ?? '', 'in_transit'); ?>>
                        <?php _e('运输中', 'flexible-shipping'); ?>
                    </option>
                    <option value="delivered" <?php selected($tracking_data['status'] ?? '', 'delivered'); ?>>
                        <?php _e('已送达', 'flexible-shipping'); ?>
                    </option>
                </select>
            </p>
            
            <p>
                <button type="button" class="button button-secondary" 
                        onclick="fsiUpdateTrackingStatus(<?php echo $order_id; ?>)">
                    <?php _e('更新物流状态', 'flexible-shipping'); ?>
                </button>
            </p>
        </div>
        
        <script>
        function fsiUpdateTrackingStatus(orderId) {
            if (!confirm('<?php _e('确定要更新物流状态吗?', 'flexible-shipping'); ?>')) {
                return;
            }
            
            jQuery.post(ajaxurl, {
                action: 'fsi_update_tracking',
                order_id: orderId,
                nonce: '<?php echo wp_create_nonce('fsi_update_tracking'); ?>'
            }, function(response) {
                if (response.success) {
                    alert('<?php _e('物流状态已更新', 'flexible-shipping'); ?>');
                    location.reload();
                } else {
                    alert('<?php _e('更新失败', 'flexible-shipping'); ?>');
                }
            });
        }
        </script>
        <?php
    }
    
    /**
     * 保存追踪数据
     */
    public function save_tracking_data($order_id, $post) {
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5731.html

EXCHANGES®作者

EXCHANGES® 技术支持:漳州柔性供应链服务有限公司
上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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