1

If I have a stock count of 2 and I allow backorders and a client adds a quantity of 5 to the cart, the cart shows 1 line item with a quantity of 5 on backorder.

Is there a way to split this cart entry into 2, one line with the quantity in stock and the second with the backorder amount?

So if I have 2 in stock and the user adds 5 to the cart they will see two line items:

Product name - Qty: 2

Product name (backorder) - Qty: 3

1 Answer 1

0

Here is a plugin that does this in case someone else needs it. Just save this in

<?php
/*
Plugin Name: WC Split Cart Backorders 
Plugin URI: https://www.creativemonarchy.com
Description: A simple plugin that helps you split the WooCommerce in stock and backorder stock items for the same product in your cart.
Author: Sohrab Iravani
Version: 1.0
Author URI: https://www.creativemonarchy.com
Requires at least: 4.9
Tested up to: 5.2.3
Text Domain: wc_split_cart_backorder
Domain Path: /languages/
*/

// Split in stock orders and backorders in the cart
add_action( 'woocommerce_add_to_cart', 'split_bkorders', 10, 6 );
function split_bkorders( $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data ) {
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $quantity;
        $product = $cart_item['data'];
        $stock_qty = $product->get_stock_quantity();
        $item_qty  = $cart_item['quantity'];
        if ($quantity > $stock_qty && $stock_qty > 0) {
            WC()->cart->set_quantity( $cart_item_key, $stock_qty );
            $backorder = $item_qty - $stock_qty;
            $cart_item_data['unique_key'] = md5( microtime() . rand() . "xxx" );
            $cart_item_data['pr_field'] = 'backorder';
            WC()->cart->add_to_cart( $product_id, 1, $variation_id, $variation, $cart_item_data );
            $count = 0;
            foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
                if ($count == 1) {
                    WC()->cart->set_quantity( $cart_item_key, $backorder );
                    break;
                }
                $count++;
            }
        } elseif ($stock_qty < 0) {
            $cart_item_data = 'backorder';
            WC()->cart->cart_contents[$cart_item_key]['pr_field'] = $cart_item_data;
        }
        break;
    }
}
// Add custom field "backorder" to cart item
function plugin_republic_get_item_data( $item_data, $cart_item_data ) {
    if( isset( $cart_item_data['pr_field'] ) ) {
        $item_data[] = array(
            'key' => __( 'Type', 'plugin-republic' ),
            'value' => wc_clean( $cart_item_data['pr_field'] )
        );
    }
    return $item_data;
}
// Add custom field "backorder" to everywhere
add_filter( 'woocommerce_get_item_data', 'plugin_republic_get_item_data', 10, 2 );
function plugin_republic_checkout_create_order_line_item( $item, $cart_item_key, $values, $order ) {
    if( isset( $values['pr_field'] ) ) {
        $item->add_meta_data(
            __( 'Type', 'plugin-republic' ),
            $values['pr_field'],
            true
        );
    }
}
add_action( 'woocommerce_checkout_create_order_line_item', 'plugin_republic_checkout_create_order_line_item', 10, 4 );
// Disable default backorder notification in cart
function inline_css() {
    echo "<style>.backorder_notification{display: none;}</style>";
}
add_action( 'wp_head', 'inline_css', 0 );
// Disable quanity edit in cart
add_filter( 'woocommerce_cart_item_quantity', 'wc_cart_item_quantity', 10, 3 );
function wc_cart_item_quantity( $product_quantity, $cart_item_key, $cart_item ){
    if( is_cart() ){
        $product_quantity = sprintf( '%2$s <input type="hidden" name="cart[%1$s][qty]" value="%2$s" />', $cart_item_key, $cart_item['quantity'] );
    }
    return $product_quantity;
}
// Create new order status "Partial Order"
add_filter( 'woocommerce_register_shop_order_post_statuses', 'bbloomer_register_custom_order_status' );
function bbloomer_register_custom_order_status( $order_statuses ){
    $order_statuses['wc-partial-order'] = array(
        'label'                     => _x( 'Partial Order', 'Order status', 'woocommerce' ),
        'public'                    => false,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop( 'Partial Order <span class="count">(%s)</span>', 'Partial Order <span class="count">(%s)</span>', 'woocommerce' ),
    );
    return $order_statuses;
}
add_filter( 'wc_order_statuses', 'bbloomer_show_custom_order_status' );
function bbloomer_show_custom_order_status( $order_statuses ) {
    $order_statuses['wc-partial-order'] = _x( 'Partial Order', 'Order status', 'woocommerce' );
    return $order_statuses;
}
add_filter( 'bulk_actions-edit-shop_order', 'bbloomer_get_custom_order_status_bulk' );
function bbloomer_get_custom_order_status_bulk( $bulk_actions ) {
    $bulk_actions['mark_partial-order'] = 'Change status to partial order';
    return $bulk_actions;
}
// Update mix order to Partial Order
add_filter( 'woocommerce_thankyou_order_received_text', 'misha_thank_you_title', 20, 2 );
function misha_thank_you_title( $thank_you_title, $order ){
    $items = $order->get_items();
    $backorders = 0;
    $order_count = 0;
    foreach ( $items as $item_id => $item ) {
        if (wc_get_order_item_meta( $item_id, 'Type', true) == 'backorder') {
            $backorders++;
        }
        $order_count++;
    }
    if ($backorders > 0) {
        if ($order_count == $backorders) {
            $order->update_status('backordered', 'order_note');
        } else {
            $order->update_status('partial-order', 'order_note');
        }
    }
}
?>

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.