文章目录[隐藏]
WordPress文创订单柔性拆分与合并处理教程
概述:为什么需要订单拆分与合并?
在文创电商运营中,订单处理常常面临复杂情况。客户可能:
- 同一订单包含不同发货时间的商品
- 多个订单需要合并发货以节省运费
- 部分商品缺货需要拆分发货
- 国际订单需要按品类分开发货(如书籍和周边)
传统WordPress电商插件往往缺乏灵活的订单处理功能。本教程将介绍如何通过代码实现智能化的订单拆分与合并处理,提升运营效率。
环境准备与基础配置
1. 开发环境要求
<?php
/**
* WordPress订单处理系统环境检查
* 确保满足以下条件:
* 1. WordPress 5.0+
* 2. WooCommerce 4.0+
* 3. PHP 7.2+
*/
// 检查必要插件是否激活
function check_required_plugins() {
$required_plugins = array(
'woocommerce/woocommerce.php' => 'WooCommerce',
);
$missing_plugins = array();
foreach ($required_plugins as $plugin_path => $plugin_name) {
if (!is_plugin_active($plugin_path)) {
$missing_plugins[] = $plugin_name;
}
}
if (!empty($missing_plugins)) {
add_action('admin_notices', function() use ($missing_plugins) {
echo '<div class="notice notice-error">';
echo '<p>需要安装并激活以下插件:' . implode(', ', $missing_plugins) . '</p>';
echo '</div>';
});
return false;
}
return true;
}
// PHP版本检查
if (version_compare(PHP_VERSION, '7.2.0', '<')) {
wp_die('需要PHP 7.2.0或更高版本');
}
add_action('admin_init', 'check_required_plugins');
?>
2. 数据库表结构设计
-- 订单拆分记录表
CREATE TABLE IF NOT EXISTS wp_order_split_records (
id BIGINT(20) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
original_order_id BIGINT(20) UNSIGNED NOT NULL,
new_order_id BIGINT(20) UNSIGNED NOT NULL,
split_reason VARCHAR(255),
split_date DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_original_order (original_order_id),
INDEX idx_new_order (new_order_id)
);
-- 订单合并记录表
CREATE TABLE IF NOT EXISTS wp_order_merge_records (
id BIGINT(20) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
main_order_id BIGINT(20) UNSIGNED NOT NULL,
merged_order_id BIGINT(20) UNSIGNED NOT NULL,
merge_date DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_main_order (main_order_id),
INDEX idx_merged_order (merged_order_id)
);
核心功能实现
1. 订单智能拆分系统
<?php
/**
* WordPress文创订单拆分处理器
* 支持按商品属性、库存状态、发货时间自动拆分
*/
class WC_Order_Splitter {
/**
* 根据发货时间拆分订单
* @param int $order_id 原始订单ID
* @return array 拆分后的订单ID数组
*/
public static function split_by_shipping_time($order_id) {
$original_order = wc_get_order($order_id);
if (!$original_order) {
return new WP_Error('invalid_order', '订单不存在');
}
// 按商品发货时间分组
$items_by_shipping = array();
foreach ($original_order->get_items() as $item_id => $item) {
$product = $item->get_product();
$shipping_days = $product->get_meta('_shipping_prepare_days');
if (empty($shipping_days)) {
$shipping_days = 'standard';
}
if (!isset($items_by_shipping[$shipping_days])) {
$items_by_shipping[$shipping_days] = array();
}
$items_by_shipping[$shipping_days][] = array(
'item_id' => $item_id,
'product_id' => $item->get_product_id(),
'quantity' => $item->get_quantity(),
'variation_id' => $item->get_variation_id(),
'data' => $item->get_data()
);
}
// 如果只有一个分组,不需要拆分
if (count($items_by_shipping) <= 1) {
return array($order_id);
}
$new_order_ids = array();
// 为每个发货时间组创建新订单
foreach ($items_by_shipping as $shipping_time => $items) {
$new_order = wc_create_order(array(
'customer_id' => $original_order->get_customer_id(),
'created_via' => 'order_split',
'parent' => $order_id
));
// 复制客户信息
$new_order->set_address($original_order->get_address('billing'), 'billing');
$new_order->set_address($original_order->get_address('shipping'), 'shipping');
// 添加商品
foreach ($items as $item_data) {
$product = wc_get_product($item_data['product_id']);
$new_order->add_product($product, $item_data['quantity']);
}
// 复制运费和支付方式
$new_order->set_shipping_total($original_order->get_shipping_total());
$new_order->set_payment_method($original_order->get_payment_method());
// 添加备注
$new_order->add_order_note(
sprintf('从订单 #%s 拆分,发货时间:%s天',
$order_id,
$shipping_time === 'standard' ? '标准' : $shipping_time
)
);
$new_order->save();
$new_order_ids[] = $new_order->get_id();
// 记录拆分信息
self::record_split($order_id, $new_order->get_id(), '按发货时间拆分');
}
// 更新原始订单状态
$original_order->update_status('split', '订单已拆分');
return $new_order_ids;
}
/**
* 记录拆分操作
*/
private static function record_split($original_id, $new_id, $reason) {
global $wpdb;
$wpdb->insert(
$wpdb->prefix . 'order_split_records',
array(
'original_order_id' => $original_id,
'new_order_id' => $new_id,
'split_reason' => $reason
)
);
}
}
?>
2. 订单合并管理系统
<?php
/**
* WordPress文创订单合并处理器
* 支持多订单合并,智能处理重复商品和运费计算
*/
class WC_Order_Merger {
/**
* 合并多个订单
* @param array $order_ids 要合并的订单ID数组
* @param int $main_order_id 主订单ID(可选)
* @return int|WP_Error 合并后的订单ID
*/
public static function merge_orders($order_ids, $main_order_id = null) {
if (count($order_ids) < 2) {
return new WP_Error('insufficient_orders', '至少需要两个订单进行合并');
}
// 确定主订单
if ($main_order_id && in_array($main_order_id, $order_ids)) {
$main_order = wc_get_order($main_order_id);
} else {
$main_order = wc_get_order(min($order_ids));
$main_order_id = $main_order->get_id();
}
// 收集所有商品(合并重复项)
$all_items = array();
$total_shipping = 0;
foreach ($order_ids as $order_id) {
$order = wc_get_order($order_id);
if (!$order) {
continue;
}
// 跳过主订单自身
if ($order_id == $main_order_id) {
continue;
}
// 合并商品
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
$variation_id = $item->get_variation_id();
$key = $product_id . '_' . $variation_id;
if (isset($all_items[$key])) {
$all_items[$key]['quantity'] += $item->get_quantity();
} else {
$all_items[$key] = array(
'product_id' => $product_id,
'variation_id' => $variation_id,
'quantity' => $item->get_quantity(),
'data' => $item->get_data()
);
}
}
// 累加运费
$total_shipping += $order->get_shipping_total();
// 记录合并关系
self::record_merge($main_order_id, $order_id);
// 更新原订单状态
$order->update_status('merged', '订单已合并到 #' . $main_order_id);
}
// 更新主订单商品
$main_order->remove_order_items();
foreach ($all_items as $item) {
$product = wc_get_product($item['product_id']);
$main_order->add_product($product, $item['quantity']);
}
// 更新运费
$main_order->set_shipping_total($total_shipping);
// 添加合并备注
$merged_ids = array_diff($order_ids, array($main_order_id));
$main_order->add_order_note(
sprintf('合并了订单:%s', implode(', #', $merged_ids))
);
$main_order->save();
return $main_order_id;
}
/**
* 智能合并建议(基于相同客户和收货地址)
*/
public static function get_merge_suggestions($customer_id = null) {
global $wpdb;
if (!$customer_id) {
$customer_id = get_current_user_id();
}
// 查找相同客户、相同地址的待处理订单
$query = "
SELECT o1.ID as order1, o2.ID as order2
FROM {$wpdb->posts} o1
INNER JOIN {$wpdb->posts} o2 ON o1.ID < o2.ID
WHERE o1.post_type = 'shop_order'
AND o2.post_type = 'shop_order'
AND o1.post_status IN ('wc-processing', 'wc-on-hold')
AND o2.post_status IN ('wc-processing', 'wc-on-hold')
AND o1.post_author = %d
AND o2.post_author = %d
AND NOT EXISTS (
SELECT 1 FROM {$wpdb->prefix}order_merge_records
WHERE (main_order_id = o1.ID AND merged_order_id = o2.ID)
OR (main_order_id = o2.ID AND merged_order_id = o1.ID)
)
LIMIT 10
";
return $wpdb->get_results($wpdb->prepare($query, $customer_id, $customer_id));
}
/**
* 记录合并操作
*/
private static function record_merge($main_id, $merged_id) {
global $wpdb;
$wpdb->insert(
$wpdb->prefix . 'order_merge_records',
array(
'main_order_id' => $main_id,
'merged_order_id' => $merged_id
)
);
}
}
?>
后台管理界面集成
1. 订单编辑页面添加操作按钮
<?php
/**
* 在WordPress后台订单页面添加拆分合并按钮
*/
add_action('woocommerce_order_actions', 'add_custom_order_actions');
function add_custom_order_actions($actions) {
$actions['split_order'] = __('拆分订单', 'your-textdomain');
$actions['merge_order'] = __('合并订单', 'your-textdomain');
return $actions;
}
add_action('woocommerce_order_action_split_order', 'process_split_order_action');
add_action('woocommerce_order_action_merge_order', 'process_merge_order_action');
function process_split_order_action($order) {
$new_order_ids = WC_Order_Splitter::split_by_shipping_time($order->get_id());
if (!is_wp_error($new_order_ids)) {
$order->add_order_note(
sprintf('订单已拆分为:%s', implode(', #', $new_order_ids))
);
}
}
function process_merge_order_action($order) {
// 获取合并建议
$suggestions = WC_Order_Merger::get_merge_suggestions($order->get_customer_id());
if (!empty($suggestions)) {
$merge_candidates = array();
foreach ($suggestions as $suggestion) {
if ($suggestion->order1 == $order->get_id()) {
$merge_candidates[] = $suggestion->order2;
} elseif ($suggestion->order2 == $order->get_id()) {
$merge_candidates[] = $suggestion->order1;
}
}
if (!empty($merge_candidates)) {
$merge_candidates[] = $order->get_id();
$result = WC_Order_Merger::merge_orders($merge_candidates, $order->get_id());
if (!is_wp_error($result)) {
$order->add_order_note('订单合并完成');
}
}
}
}
?>
2. 批量操作功能
<?php
/**
* 订单列表批量操作
*/
add_filter('bulk_actions-edit-shop_order', 'add_bulk_order_actions');
function add_bulk_order_actions($actions) {
$actions['bulk_split'] = __('批量拆分', 'your-textdomain');
$actions['bulk_merge'] = __('批量合并', 'your-textdomain');
return $actions;
}
add_filter('handle_bulk_actions-edit-shop_order', 'handle_bulk_order_actions', 10, 3);
function handle_bulk_order_actions($redirect_to, $action, $order_ids) {
if ($action === 'bulk_merge') {
$result = WC_Order_Merger::merge_orders($order_ids);
if (!is_wp_error($result)) {
$redirect_to = add_query_arg('bulk_merged', count($order_ids), $redirect_to);
}
} elseif ($action === 'bulk_split') {
$total_split = 0;
foreach ($order_ids as $order_id) {
$new_ids = WC_Order_Splitter::split_by_shipping_time($order_id);
if (!is_wp_error($new_ids)) {
$total_split += count($new_ids) - 1;
}
}
$redirect_to = add_query_arg('bulk_split', $total_split, $redirect_to);
}
return $redirect_to;
}
?>
前端客户界面优化
1. 我的账户页面显示合并订单
<?php
/**
* 在"我的账户"页面显示合并订单信息
*/
add_action('woocommerce_view_order', 'display_merged_orders_info', 20);
function display_merged_orders_info($order_id) {
global $wpdb;
// 检查是否是合并的主订单
$merged_orders = $wpdb->get_results($wpdb->prepare(
"SELECT merged_order_id FROM {$wpdb->prefix}order_merge_records
WHERE main_order_id = %d",
$order_id
));
if (!empty($merged_orders)) {
echo '<div class="merged-orders-notice">';
echo '<h3>' . __('包含以下合并订单', 'your-textdomain') . '</h3>';
echo '<ul>';
foreach ($merged_orders as $merged) {
$order = wc_get_order($merged->merged_order_id);
if ($order) {
echo '<li>订单 #' . $merged->merged_order_id . ' - ' .
$order->get_date_created()->date('Y-m-d') . '</li>';
}
}
echo '</ul>';
echo '</div>';
}
// 检查是否被拆分
$split_from = $wpdb->get_var($wpdb->prepare(
"SELECT original_order_id FROM {$wpdb->prefix}order_split_records
WHERE new_order_id = %d",
$order_id
));
if ($split_from) {
echo '<div class="split-order-notice">';
echo '<p>' . sprintf(
__('此订单从订单 #%s 拆分而来', 'your-textdomain'),
$split_from
) . '</p>';
echo '</div>';
}
}
?>
高级功能扩展
1. 自动化拆分规则引擎
<?php
/**
* 自动化订单拆分规则引擎
* 支持多种拆分策略配置
*/
class WC_Auto_Split_Rules {
private $rules = array();
public function __construct() {
$this->load_rules();
}
/**
* 加载拆分规则
*/
private function load_rules() {
// 可从数据库或配置文件中加载规则
$this->rules = array(
array(
'name' => '按库存状态拆分',
'condition' => 'check_stock_status',
'priority' => 10
),
array(
'name' => '按供应商拆分',
'condition' => 'check_supplier',
'priority' => 20
),
array(
'name' => '按发货地区拆分',
'condition' => 'check_shipping_zone',
'priority' => 30
)
);
// 按优先级排序
usort($this->rules, function($a, $b) {
return $a['priority'] - $b['priority'];
});
}
/**
订单
*/
public function auto_process_order($order_id) {
$order = wc_get_order($order_id);
if (!$order || $order->get_meta('_auto_split_processed')) {
return false;
}
$split_needed = false;
$split_reasons = array();
// 检查所有规则
foreach ($this->rules as $rule) {
$method = $rule['condition'];
if (method_exists($this, $method)) {
$result = $this->$method($order);
if ($result['needs_split']) {
$split_needed = true;
$split_reasons[] = $result['reason'];
}
}
}
// 执行拆分
if ($split_needed) {
$this->execute_auto_split($order, $split_reasons);
$order->update_meta_data('_auto_split_processed', true);
$order->save();
return true;
}
return false;
}
/**
* 检查库存状态
*/
private function check_stock_status($order) {
$needs_split = false;
$reason = '';
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if ($product && !$product->is_in_stock()) {
$needs_split = true;
$reason = '部分商品缺货';
break;
}
}
return array(
'needs_split' => $needs_split,
'reason' => $reason
);
}
/**
* 检查供应商
*/
private function check_supplier($order) {
$suppliers = array();
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if ($product) {
$supplier = $product->get_meta('_supplier');
if ($supplier) {
$suppliers[$supplier] = true;
}
}
}
return array(
'needs_split' => count($suppliers) > 1,
'reason' => count($suppliers) > 1 ? '多供应商发货' : ''
);
}
/**
* 执行自动拆分
*/
private function execute_auto_split($order, $reasons) {
$order->add_order_note(
'系统自动拆分订单,原因:' . implode(',', $reasons)
);
// 调用拆分器
WC_Order_Splitter::split_by_shipping_time($order->get_id());
}
}
// 自动处理新订单
add_action('woocommerce_checkout_order_processed', 'auto_process_new_order', 20, 2);
function auto_process_new_order($order_id, $posted_data) {
$auto_splitter = new WC_Auto_Split_Rules();
$auto_splitter->auto_process_order($order_id);
}
?>
### 2. 物流成本优化算法
<?php
/**
- 物流成本优化计算器
- 智能判断是否应该合并订单以节省运费
*/
class WC_Shipping_Optimizer {
/**
* 计算合并后的运费节省
*/
public static function calculate_merge_savings($order_ids) {
$individual_shipping = 0;
$merged_shipping = 0;
// 获取各订单单独运费
foreach ($order_ids as $order_id) {
$order = wc_get_order($order_id);
if ($order) {
$individual_shipping += self::get_order_shipping_cost($order);
}
}
// 模拟合并后的运费
$merged_order_data = self::simulate_merged_order($order_ids);
$merged_shipping = self::calculate_shipping_cost($merged_order_data);
return array(
'individual' => $individual_shipping,
'merged' => $merged_shipping,
'savings' => $individual_shipping - $merged_shipping,
'savings_percent' => $individual_shipping > 0 ?
(($individual_shipping - $merged_shipping) / $individual_shipping) * 100 : 0
);
}
/**
* 获取订单运费
*/
private static function get_order_shipping_cost($order) {
return $order->get_shipping_total() + $order->get_shipping_tax();
}
/**
* 模拟合并订单数据
*/
private static function simulate_merged_order($order_ids) {
$total_weight = 0;
$total_value = 0;
$items_count = 0;
$destination = null;
foreach ($order_ids as $order_id) {
$order = wc_get_order($order_id);
if ($order) {
// 计算总重量和价值
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if ($product) {
$weight = $product->get_weight() ?: 0;
$total_weight += $weight * $item->get_quantity();
$total_value += $product->get_price() * $item->get_quantity();
$items_count += $item->get_quantity();
}
}
// 获取目的地(假设所有订单目的地相同)
if (!$destination) {
$destination = $order->get_shipping_country() . '_' .
$order->get_shipping_state() . '_' .
$order->get_shipping_postcode();
}
}
}
return array(
'weight' => $total_weight,
'value' => $total_value,
'items_count' => $items_count,
'destination' => $destination
);
}
/**
* 计算运费(简化版)
*/
private static function calculate_shipping_cost($order_data) {
// 这里应该集成实际的运费计算逻辑
// 示例:基于重量和地区的简单计算
$base_cost = 10; // 基础运费
$weight_cost = $order_data['weight'] * 2; // 每公斤2元
$destination_multiplier = self::get_destination_multiplier($order_data['destination']);
return ($base_cost + $weight_cost) * $destination_multiplier;
}
private static function get_destination_multiplier($destination) {
// 简化地区系数
$multipliers = array(
'CN_' => 1.0, // 中国大陆
'US_' => 2.5, // 美国
'EU_' => 2.0, // 欧洲
);
foreach ($multipliers as $prefix => $multiplier) {
if (strpos($destination, $prefix) === 0) {
return $multiplier;
}
}
return 1.5; // 默认系数
}
}
?>
## 数据统计与报表
### 1. 拆分合并统计报表
<?php
/**
- 订单拆分合并统计报表
*/
add_action('admin_menu', 'add_order_split_merge_reports');
function add_order_split_merge_reports() {
add_submenu_page(
'woocommerce',
'订单拆分合并统计',
'拆分合并统计',
'manage_woocommerce',
'order-split-merge-stats',
'display_order_split_merge_stats'
);
}
function display_order_split_merge_stats() {
global $wpdb;
// 获取统计数据
$stats = array(
'today' => self::get_daily_stats('today'),
'week' => self::get_daily_stats('week'),
'month' => self::get_daily_stats('month'),
'total' => self::get_total_stats()
);
?>
<div class="wrap">
<h1>订单拆分合并统计</h1>
<div class="stats-grid">
<div class="stat-box">
<h3>今日统计</h3>
<p>拆分订单: <?php echo $stats['today']['splits']; ?></p>
<p>合并订单: <?php echo $stats['today']['merges']; ?></p>
</div>
<div class="stat-box">
<h3>本周统计</h3>
<p>拆分订单: <?php echo $stats['week']['splits']; ?></p>
<p>合并订单: <?php echo $stats['week']['merges']; ?></p>
</div>
<div class="stat-box">
<h3>本月统计</h3>
<p>拆分订单: <?php echo $stats['month']['splits']; ?></p>
<p>合并订单: <?php echo $stats['month']['merges']; ?></p>
</div>
<div class="stat-box">
<h3>总计</h3>
<p>拆分订单: <?php echo $stats['total']['splits']; ?></p>
<p>合并订单: <?php echo $stats['total']['merges']; ?></p>
</div>
</div>
<h2>最近操作记录</h2>
<?php self::display_recent_operations(); ?>
</div>
<style>
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin: 20px 0;
}
.stat-box {
background: #fff;
padding: 20px;
border: 1px solid #ddd;
border-radius: 4px;
}
.stat-box h3 {
margin-top: 0;
}
</style>
<?php
}
private function get_daily_stats($period) {
global $wpdb;
$date_condition = '';
switch ($period) {
case 'today':
$date_condition = "DATE(split_date) = CURDATE()";
break;
case 'week':
$date_condition = "split_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)";
break;
case 'month':
$date_condition = "split_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)";
break;
}
$splits = $wpdb->get_var("
SELECT COUNT(*) FROM {$wpdb->prefix}order_split_records
WHERE {$date_condition}
");
$merges = $wpdb->get_var("
SELECT COUNT(*) FROM {$wpdb->prefix}order_merge_records
WHERE {$date_condition}
");
return array(
'splits' => $splits ?: 0,
'merges' => $merges ?: 0
);
}
private function get_total_stats() {
global $wpdb;
$splits = $wpdb->get_var("
SELECT COUNT(*) FROM {$wpdb->prefix}order_split_records
");
$merges = $wpdb->get_var("
SELECT COUNT(*) FROM {$wpdb->prefix}order_merge_records
");
return array(
'splits' => $splits ?: 0,
'merges' => $merges ?: 0
);
}
private function display_recent_operations() {
global $wpdb;
$operations = $wpdb->get_results("
(SELECT
'split' as type,
original_order_id as order1,
new_order_id as order2,
split_date as operation_date,
split_reason as reason
FROM {$wpdb->prefix}order_split_records
ORDER BY split_date DESC
LIMIT 10)
UNION ALL
(SELECT
'merge' as type,
main_order_id as order1,
merged_order_id as order2,
merge_date as operation_date,
'订单合并' as reason
FROM {$wpdb->prefix}order_merge_records
ORDER BY merge_date DESC
LIMIT 10)
ORDER BY operation_date DESC
LIMIT 20
");
if ($operations) {
echo '<table class="wp-list-table widefat fixed striped">';
echo '<thead>
<tr>
<th>操作类型</th>
<th>订单1</th>
<th>订单2</th>
<th>操作时间</th>
<th>原因</th>
</tr>
</thead>';
echo '<tbody>';
foreach ($operations as $op) {
echo '<tr>';
echo '<td>' . ($op->type == 'split' ? '拆分' : '合并') . '</td>';
echo '<td><a href="' . admin_url('post.php?post=' . $op->order1 . '&action=edit') . '">#' . $op->order1 . '</a></td>';
echo '<td><a href="' . admin_url('post.php?post=' . $op->order2 . '&action=edit') . '">#' . $op->order2 . '</a></td>';
echo '<td>' . $op->operation_date . '</td>';
echo '<td>' . $op->reason . '</td>';
echo '</tr>';
}
echo '</tbody></table>';
}
}
?>
## 性能优化与安全考虑
### 1. 数据库查询优化
<?php
/**
- 订单拆分合并系统性能优化
*/
class WC_Order_Optimizer {
/**
* 批量操作时的性能优化
*/
public static function optimize_bulk_operations($order_ids) {
// 禁用对象缓存,减少内存使用
wp_suspend_cache_addition(true);
// 提高查询效率
add_filter('posts_pre_query', array(__CLASS__, 'optimize_order_query'), 10, 2);
// 批量获取订单数据
$orders = self::batch_get_orders($order_ids);
// 恢复设置
remove_filter('posts_pre_query', array(__CLASS__, 'optimize_order_query'));
wp_suspend_cache_addition(false);
return $orders;
}
/**
* 优化订单查询
*/
public static function optimize_order_query($posts, $query) {
if ($query->get('post_type') === 'shop_order' &&
$query->get('post__in')) {
global $wpdb;
$order_ids = implode(',', array_map('intval', $query->get('post__in')));
// 直接查询,避免复杂的WP_Query开销
$posts = $wpdb->get_results("
SELECT * FROM {$wpdb->posts}
WHERE ID IN ({$order_ids})
AND post_type = 'shop_order'
");
foreach ($posts as $post) {
$post = sanitize_post($post, 'raw');
}
}
return $posts;
}
/**
* 批量获取订单
*/
private static function batch_get_orders($order_ids) {
if (empty($order_ids)) {
return array();
}
$chunks = array_chunk($order_ids, 50); // 每次处理50个订单
$all_orders = array();
foreach ($chunks as $chunk) {
$args = array(
'post_type' => 'shop_order',
'post__in' => $chunk,
'posts_per_page' => -1,
'fields' => 'ids' // 只获取ID,减少数据量
);
$order_ids_chunk = get_posts($args);
foreach ($order_ids_chunk as $order_id) {
$all_orders[$order_id] = wc_get_order($order_id);
}
// 每批处理完清理一次内存
if (function_exists('gc_collect_cycles')) {
gc_collect_cycles();
}
}
return $all_orders;
}
/**
* 清理过期记录
*/
public static function cleanup_old_records($days = 90) {
global $wpdb;
$date_limit = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// 清理拆分记录
$wpdb->query($wpdb->prepare("
DELETE FROM {$wpdb->prefix}order_split_records
WHERE split_date < %s
", $date_limit));
// 清理合并记录
$wpdb->query($wpdb->prepare("
DELETE FROM {$wpdb->prefix}order_merge_records
WHERE merge_date < %s
", $date_limit));
return array(
'split_deleted' => $wpdb->rows_affected,
'merge_deleted' => $wpdb->rows_affected
);
}
}
// 定期清理任务
add_action('wp_scheduled_cleanup', 'schedule_order_records_cleanup');
function schedule_order_records_cleanup() {
if (!wp_next_scheduled('cleanup_order_split_merge_records')) {
wp_schedule_event(time(), 'daily', 'cleanup_order_split_merge_records');
}
}
add_action('cleanup_order_split_merge_records', function() {
WC_Order_Optimizer::cleanup_old_records(90); // 保留90天记录
});
?>
### 2. 安全与权限控制
<?php
/**
- 订单拆分合并系统安全控制
*/
class WC_Order_Security {
/**
* 验证订单操作权限
*/
public static function check_order_permission($order_id, $user_id = null) {
if (!$user_id) {
$user_id = get_current_user_id();
}
$order = wc_get_order($order_id);
if (!$order) {
return new WP_Error('order_not_found', '订单不存在');
}
// 管理员权限检查
if (current_user_can('manage_woocommerce')) {
return true;
}
// 客户只能操作自己的订单
