Separated cart items in Woocommerce when quantity is more than 1

I am using "WooCommerce - Treat cart items separate if quantity is more than 1" answer code and it works great if you are using cart.

But in my case I redirect people directly to the checkout, so it does not work the same way for the cart resume at the bottom at the checkout. Also when product is added to cart multiple times, it doesn't give separated items.

Upvotes: 2

Views: 2800

Answers (1)

LoicTheAztec
LoicTheAztec

Reputation: 253784

The following code will also handle ajax add to cart and same items added multiple times (+ jumping cart redirection to checkout):

// Split items by their quantity units
add_action( 'woocommerce_add_to_cart', 'split_cart_items_by_quantity', 10, 6 );
function split_cart_items_by_quantity( $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data ) {
    if ( $quantity == 1 ) return;

    // Keep the product but set its quantity to 1
    WC()->cart->set_quantity( $cart_item_key, 1 );

    // Loop through each unit of item quantity
    for ( $i = 1; $i <= $quantity -1; $i++ ) {
        // Make each quantity item unique and separated
        $cart_item_data['unique_key'] = md5( microtime() . rand() . "Hi Mom!" );

        // Add each item quantity as a separated cart item
        WC()->cart->add_to_cart( $product_id, 1, $variation_id, $variation, $cart_item_data );
    }
}

// Make added cart item as a unique and separated (works with ajax add to cart too)
add_filter( 'woocommerce_add_cart_item_data', 'filter_add_cart_item_data', 10, 4 );
function filter_add_cart_item_data( $cart_item_data, $product_id, $variation_id, $quantity ) {
    if ( ! isset($cart_item_data['unique_key']) ) {
        // Make this item unique
        $cart_item_data['unique_key'] = md5( microtime().rand() . "Hi Dad!"  );
    }
    return $cart_item_data;
}

// Redirect to checkout jumping cart
add_action( 'template_redirect', 'cart_redirect_to_checkout' );
function cart_redirect_to_checkout(){
    if( is_cart() ){
        wp_safe_redirect( wc_get_checkout_url() );
        exit();
    }
}

Code goes in function.php file of your active child theme (or active theme). Tested and work.

This code add support for:

  • Ajax added to cart items
  • Same products added to cart multiple times

Based on: WooCommerce - Treat cart items separate if quantity is more than 1

Upvotes: 3

Related Questions