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();
}
}
}

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

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