分享笔记:

按配送类别拆分 WooCommerce 订单

拆分多个订单

有时候在线商店就跟线下店一样,会遇到各种状况。最常见的情况之一就是:一个订单里有的商品需要用不一样的配送方式发货。这时候,就需要把一个订单拆成几个。

今天这招就是教你怎么搞定这个事儿。下单之后,系统会自动按照商品的配送类型把订单拆开。比如,有的东西需要特殊配送、有的要走不同的路线,那就各分一个订单出来。

WooCommerce产品设置配送类别

产品的配送类别我在WooCommerce配送教程里讲过,设置非常简单,完成后到想要的产品设置里选择对应的配别就行了。

woocommerce产品配送类别选择

根据配送类别拆分订单代码

下面的代码就是实现这个功能的:它会检查订单里所有的商品,如果发现有不同的配送分类,就会按分类生成新的订单,每个订单只包含对应配送分类的商品。而且系统还会自动在订单里备注一下,说明这个订单是被拆过的。

/* 根据配送类别拆分订单 */
add_action( 'woocommerce_thankyou', 'jhchen_separate_order_shipping_class', 9999 );
function jhchen_separate_order_shipping_class( $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( 'Separete 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();
}
}
}

添加代码到子主题的functions.php或者通过自定义代码插件加入即可。下面这个就是一个订单,里面有2个不同的配送类别产品,所以一共被拆分成了三个订单。

woocommerce根据配送类别拆分订单

被拆分订单的订单备注里会显示它是从哪个订单拆分的。“此订单从 #40 号订单拆分”

被拆分订单显示源订单号

被拆分的订单都是可以单独操作的,像单独发送订单物流追踪号

为笔记评分

平均评分 5 / 5. 摘星者: 2

有疑问?留个言吧!

更多结果...

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
?>

更多结果...

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors