首页 / 教程文章 / WordPress文创订单柔性拆分与合并处理教程

WordPress文创订单柔性拆分与合并处理教程

WordPress文创订单柔性拆分与合并处理教程

概述:为什么需要订单拆分与合并?

在文创电商运营中,订单处理常常面临复杂情况。客户可能:

  1. 同一订单包含不同发货时间的商品
  2. 多个订单需要合并发货以节省运费
  3. 部分商品缺货需要拆分发货
  4. 国际订单需要按品类分开发货(如书籍和周边)

传统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;
    }
    
    // 客户只能操作自己的订单
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5823.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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