文章目录[隐藏]
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();
