拆分WooCommerce订单并创建新订单(如果原始订单中有未交货的产品 [英] Split a WooCommerce order and create a new order if the original order has products in backorder

查看:15
本文介绍了拆分WooCommerce订单并创建新订单(如果原始订单中有未交货的产品的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有自定义订单状态,它可以正常工作。

我在这里需要的帮助是遍历订单项目并检查它们中是否有任何延交订单,如果有,从原始订单中取出延交订单项目并创建新订单,并为新订单赋予Backorder状态。

我们的想法是,如果且仅当原始订单中存在延交订单中的项目时,才创建延交订单。

add_action( 'woocommerce_checkout_order_processed', 'split_order_if_order_has_backorder_products', 10, 1 );
function split_order_if_order_has_backorder_products( $order_id ) {
    if( ! $order_id ) return;

    // get order object
    $order = new WC_Order( $order_id );

    // get order currency
    $currency = $order->get_currency();

    // get order payment method
    $payment_gateway = $order->get_payment_method();

    // get order items = each product in the order
    $items = $order->get_items();

    foreach ( $items as $item ) {       
        $product = wc_get_product( $item['product_id'] );

        if ( $product->is_on_backorder() ) {

        // THIS IS NOT WORKING FOR SOME REASON?
        $backorder = wc_create_order();         
        $backorder->add_product( $product, $item['quantity'] );
        }
    }

    // THIS IS NOT WORKING EITHER = I NEED TO REMOVE THE BACKORDER ITEMS FROM THE ORIGINAL ORDER, RECALCULATE AND SAVE THE NEW TOTAL
    foreach($items as $backorder_product => $item){
        $order->remove_item($backorder_product);
        $order->calculate_totals();
        $order->save();
    }

    $address = array(
        'first_name' => $order->get_billing_first_name(),
        'last_name'  => $order->get_billing_last_name(),
        'email'      => $order->get_billing_email(),
        'phone'      => $order->get_billing_phone(),
        'address_1'  => $order->get_billing_address_1(),
        'address_2'  => $order->get_billing_address_2(),
        'city'       => $order->get_billing_city(),
        'state'      => $order->get_billing_state(),
        'postcode'   => $order->get_billing_postcode(),
        'country'    => $order->get_billing_country()
    );

    $shipping = array(
        'first_name' => $order->get_shipping_first_name(),
        'last_name'  => $order->get_shipping_last_name(),
        'address_1'  => $order->get_shipping_address_1(),
        'address_2'  => $order->get_shipping_address_2(),
        'city'       => $order->get_shipping_city(),
        'state'      => $order->get_shipping_state(),
        'postcode'   => $order->get_shipping_postcode(),
        'country'    => $order->get_shipping_country()
    );

    // Set addresses
    $backorder->set_address( $address, 'billing' );
    $backorder->set_address( $shipping, 'shipping' );

    // set the correct currency and payment gateway
    $backorder->set_currency($currency);
    $backorder->set_payment_method($payment_gateway);

    // calculate totals
    $backorder->calculate_totals();

    // set order note with original ID
    $backorder->add_order_note('Automated Backorder. Created from the original order ID: '.$order->get_id());

    // give the new backorder the correct status
    $backorder->update_status( 'backorder' );
}

推荐答案

如果原始订单包含具有延交状态的产品,则下面的代码仅创建包含延交产品的新订单。

上次更新:02/22-在WordPress 5.9和WooCommerce 6.2.0中测试

function action_woocommerce_checkout_order_processed( $order_id, $posted_data, $order ) {
    // Initialize
    $check_for_back_orders = false;

    // Loop through order items
    foreach ( $order->get_items() as $item_key => $item ) {
        // Get product
        $product = $item->get_product();

        // Product is on backorder
        if ( $product->is_on_backorder() ) {
            // Will only be executed once if the order contains back orders
            if ( $check_for_back_orders == false ) {
                $check_for_back_orders = true;

                // Create new order with backorders
                $backorder_order = wc_create_order();
            }

            // Add product to 'backorder' order
            $backorder_order->add_product( $product, $item['quantity'] );

            // Delete item from original order
            $order->remove_item( $item->get_id() );
        }
    }

    // If current order contains backorders, retrieve the necessary data from the existing order and apply it in the new order
    if ( $check_for_back_orders ) {
        // Recalculate and save original order
        $order->calculate_totals();
        $order->save();
        
        // Obtain necessary information
        // Get address
        $address = array(
            'first_name' => $order->get_billing_first_name(),
            'last_name'  => $order->get_billing_last_name(),
            'email'      => $order->get_billing_email(),
            'phone'      => $order->get_billing_phone(),
            'address_1'  => $order->get_billing_address_1(),
            'address_2'  => $order->get_billing_address_2(),
            'city'       => $order->get_billing_city(),
            'state'      => $order->get_billing_state(),
            'postcode'   => $order->get_billing_postcode(),
            'country'    => $order->get_billing_country()
        );

        // Get shipping
        $shipping = array(
            'first_name' => $order->get_shipping_first_name(),
            'last_name'  => $order->get_shipping_last_name(),
            'address_1'  => $order->get_shipping_address_1(),
            'address_2'  => $order->get_shipping_address_2(),
            'city'       => $order->get_shipping_city(),
            'state'      => $order->get_shipping_state(),
            'postcode'   => $order->get_shipping_postcode(),
            'country'    => $order->get_shipping_country()
        );
        
        // Get order currency
        $currency = $order->get_currency();

        // Get order payment method
        $payment_gateway = $order->get_payment_method();
        
        // Required information has been obtained, assign it to the 'backorder' order
        // Set address
        $backorder_order->set_address( $address, 'billing' );
        $backorder_order->set_address( $shipping, 'shipping' );

        // Set the correct currency and payment gateway
        $backorder_order->set_currency( $currency );
        $backorder_order->set_payment_method( $payment_gateway );

        // Calculate totals
        $backorder_order->calculate_totals();

        // Set order note with original ID
        $backorder_order->add_order_note( 'Automated backorder. Created from the original order ID: ' . $order_id );

        // Optional: give the new 'backorder' order the correct status
        //$backorder_order->update_status( 'backorder' );
    }
}
add_action( 'woocommerce_checkout_order_processed', 'action_woocommerce_checkout_order_processed', 10, 3 );

代码放在活动子主题(或活动主题)的函数.php文件中。

这篇关于拆分WooCommerce订单并创建新订单(如果原始订单中有未交货的产品的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆