对于需要管理复杂工作流程的店主来说,以编程方式拆分 WooCommerce 订单非常有用。无论您是处理预购订单、分拆发货,还是简单地为多次发货组织商品,根据产品划分订单都能确保更顺畅的操作和更好的客户体验。
然而,拆分订单不仅仅是为了拆分商品,复制付款方式、发货方式和总计等关键细节对于保持一致性同样重要。
在本教程中,我们将探讨如何在 WooCommerce 中以编程方式拆分订单,确保复制订单包含原始订单的所有相关详细信息,如付款方式、订单状态、账单和送货地址。
本指南结束时,您将拥有一个强大的解决方案,可以直接在 WooCommerce 商店中自动分割订单。让我们深入了解代码并开始使用!
怎么根据运输类别在购买时拆分订单
当然,你也可以改变拆分订单的方式,比如按产品 ID、产品类别、自定义元数据信息等进行拆分。我之所以选择运输类别,是因为每个产品只能有一个运输类别(或者没有,在这种情况下,运输类别等于 0),而且这是一种非常常见的情况。
add_action( 'woocommerce_thankyou', 'wprs_split_order_after_checkout', 9999 );
function wprs_split_order_after_checkout( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order || $order->get_meta( '_order_split' ) ) return;
$items_by_shipping_class = array();
foreach ( $order->get_items() as $item_id => $item ) {
$product = $item->get_product();
$class_id = $product->get_shipping_class_id();
$items_by_shipping_class[$class_id][$item_id] = $item;
}
if ( count( $items_by_shipping_class ) > 1 ) {
foreach ( array_slice( $items_by_shipping_class, 1 ) as $class_id => $items ) {
$new_order = wc_create_order();
$new_order->set_address( $order->get_address( 'billing' ), 'billing' );
if ( $order->needs_shipping_address() ) $new_order->set_address( $order->get_address( 'shipping' ) ?? $order->get_address( 'billing' ), 'shipping' );
foreach ( $items as $item_id => $item ) {
$new_item = new WC_Order_Item_Product();
$new_item->set_product( $item->get_product() );
$new_item->set_quantity( $item->get_quantity() );
$new_item->set_total( $item->get_total() );
$new_item->set_subtotal( $item->get_subtotal() );
$new_item->set_tax_class( $item->get_tax_class() );
$new_item->set_taxes( $item->get_taxes() );
foreach ( $item->get_meta_data() as $meta ) {
$new_item->add_meta_data( $meta->key, $meta->value, true );
}
$new_order->add_item( $new_item );
$order->remove_item( $item_id );
}
$new_order->add_order_note( 'Splitted from order ' . $order_id );
$new_order->calculate_totals();
$new_order->set_payment_method( $order->get_payment_method() );
$new_order->set_payment_method_title( $order->get_payment_method_title() );
$new_order->update_status( $order->get_status() );
$order->calculate_totals();
$order->update_meta_data( '_order_split', true );
$order->save();
}
}
}
函数概述
我们把拆分订单的函数 wprs_split_order_after_checkout
挂载到了 WooCommerce 的 woocommerce_thankyou
操作钩子上。这意味着一旦订单支付完成,用户被重定向到 “谢谢你 “页面,拆分订单的代码就会运行。
- 检查订单是否已拆分
- 该函数首先检查订单是否已被拆分(使用自定义元字段 _order_split)。如果是,则跳过拆分过程以避免重复。
- 按运输类别分组商品
- 订单中的商品会被循环遍历,并根据运输类别 (get_shipping_class_id) 进行分组。当您想根据不同的运输方式或类别拆分订单时,这很有用。
- 检查是否需要拆分
- 如果订单中有多个运输类别,则会将订单拆分为多个较小的订单。
- 为每个运输类别创建新订单
- 对于运输类别中的每一组物品(第一组除外),都会创建一个新订单(wc_create_order)。
- 账单和送货地址从原始订单复制到新订单。
- 这些商品被克隆,新的订单中会填充这些商品以及所有相关详细信息,例如数量、总价、税金和元数据。
- 原始订单中的商品在转移到新订单后被删除。
- 订单备注和总计
- 新订单中添加了注释,表明该订单已从原始订单中拆分出来。
- 新订单的总额将被重新计算,付款方式将从原始订单复制过来。
- 确定原始订单和新订单
总结
本文中的代码非常适合需要根据某些条件(如不同的运输类别)将订单拆分成多个小订单的情况。它能确保每个新订单保留原始订单的相关详细信息,如账单/发货地址、付款方式和商品信息。这在代发货或需要单独发货的订单等情况下非常有用。