文章目录[隐藏]
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§ion=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) {
