How to merge Woocommerce current and persistent cart?

Last Updated: May 11, 2020

Add the following code in your functions.php

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function wc_custom_user_redirect( $redirect, $user ) {
if($_COOKIE['_redirect_url'] == '') {
if (sizeof(WC()->cart->get_cart()) != 0) {
return home_url('checkout');
}else{
return home_url('my-account');
}
}else{
$redirect = $_COOKIE['_redirect_url'];
}
// declaration
$final_items_key = array();
// get current cart sessions
global $woocommerce;
$items = $woocommerce->cart->get_cart();
$current_items = array();
foreach($items as $item => $values) {
$product_id = $values['data']->get_id();
$quantity = $values['quantity'];
$current_items[$product_id] = array(
'product_id' => $product_id,
'quantity' => $quantity,
);
$final_items_key[$product_id] = $product_id;
}
// persistent cart
$persistent_cart = get_user_meta( $user->ID, '_woocommerce_persistent_cart_' . get_current_blog_id(), true );
$persistent_cart_items = $persistent_cart['cart'];
$persistent_items = array();
foreach ($persistent_cart_items as $item){
$product_id = $item['product_id'];
$quantity = $item['quantity'];
$persistent_items[$product_id] = array(
'product_id' => $product_id,
'quantity' => $quantity,
);
$final_items_key[$product_id] = $product_id;
}
// check final keys
$final_items = array();
foreach ($final_items_key as $key){
$product_id = $key;
$quantity = 0;
// check current sessions
if (!empty($current_items[$product_id])){
$quantity+= $current_items[$product_id]['quantity'];
}
// check persitent cart
if (!empty($persistent_items[$product_id])){
$quantity+= $persistent_items[$product_id]['quantity'];
}
// final item
$final_items[$product_id] = array(
'product_id' => $product_id,
'quantity' => $quantity,
);
}
// empty session but retain persistent cart
WC()->cart->empty_cart();
// add previous cart items
foreach ($final_items as $item){
$woocommerce->cart->add_to_cart($item['product_id'], $item['quantity']);
}
// save to persistent again
WC_Cart::persistent_cart_update();
return $redirect;
}
add_filter( 'woocommerce_login_redirect', 'wc_custom_user_redirect', 10, 2 );
function wc_custom_user_redirect( $redirect, $user ) { if($_COOKIE['_redirect_url'] == '') { if (sizeof(WC()->cart->get_cart()) != 0) { return home_url('checkout'); }else{ return home_url('my-account'); } }else{ $redirect = $_COOKIE['_redirect_url']; } // declaration $final_items_key = array(); // get current cart sessions global $woocommerce; $items = $woocommerce->cart->get_cart(); $current_items = array(); foreach($items as $item => $values) { $product_id = $values['data']->get_id(); $quantity = $values['quantity']; $current_items[$product_id] = array( 'product_id' => $product_id, 'quantity' => $quantity, ); $final_items_key[$product_id] = $product_id; } // persistent cart $persistent_cart = get_user_meta( $user->ID, '_woocommerce_persistent_cart_' . get_current_blog_id(), true ); $persistent_cart_items = $persistent_cart['cart']; $persistent_items = array(); foreach ($persistent_cart_items as $item){ $product_id = $item['product_id']; $quantity = $item['quantity']; $persistent_items[$product_id] = array( 'product_id' => $product_id, 'quantity' => $quantity, ); $final_items_key[$product_id] = $product_id; } // check final keys $final_items = array(); foreach ($final_items_key as $key){ $product_id = $key; $quantity = 0; // check current sessions if (!empty($current_items[$product_id])){ $quantity+= $current_items[$product_id]['quantity']; } // check persitent cart if (!empty($persistent_items[$product_id])){ $quantity+= $persistent_items[$product_id]['quantity']; } // final item $final_items[$product_id] = array( 'product_id' => $product_id, 'quantity' => $quantity, ); } // empty session but retain persistent cart WC()->cart->empty_cart(); // add previous cart items foreach ($final_items as $item){ $woocommerce->cart->add_to_cart($item['product_id'], $item['quantity']); } // save to persistent again WC_Cart::persistent_cart_update(); return $redirect; } add_filter( 'woocommerce_login_redirect', 'wc_custom_user_redirect', 10, 2 );
function wc_custom_user_redirect( $redirect, $user ) {
    if($_COOKIE['_redirect_url'] == '') {
       
        if (sizeof(WC()->cart->get_cart()) != 0) {
            return home_url('checkout');
        }else{
            return home_url('my-account');  
        }
    }else{
        $redirect = $_COOKIE['_redirect_url'];
    }
    
    
    
    // declaration 
    $final_items_key = array();
   
   
    // get current cart sessions 
    global $woocommerce;
    
    $items = $woocommerce->cart->get_cart();
    $current_items = array();
    foreach($items as $item => $values) { 
        $product_id =  $values['data']->get_id();
        $quantity = $values['quantity'];
        
        $current_items[$product_id] = array(
            'product_id' => $product_id,    
            'quantity' => $quantity,    
        );
        
        $final_items_key[$product_id] = $product_id;
    } 
    
    // persistent cart
    $persistent_cart = get_user_meta( $user->ID, '_woocommerce_persistent_cart_' . get_current_blog_id(), true );
    $persistent_cart_items  = $persistent_cart['cart'];
    $persistent_items = array();
    foreach ($persistent_cart_items as $item){
        
        $product_id =  $item['product_id'];
        $quantity = $item['quantity'];
        
        $persistent_items[$product_id] = array(
            'product_id' => $product_id,    
            'quantity' => $quantity,    
        );
        
        $final_items_key[$product_id] = $product_id;
    }
    
    
    // check final keys
    $final_items = array();
    foreach ($final_items_key as $key){
        $product_id = $key;
        $quantity = 0;
        
        // check current sessions
        if (!empty($current_items[$product_id])){
            $quantity+= $current_items[$product_id]['quantity'];
        }
        
        // check persitent cart
        if (!empty($persistent_items[$product_id])){
            $quantity+= $persistent_items[$product_id]['quantity'];
        }
        
        // final item
        $final_items[$product_id] = array(
            'product_id' => $product_id,    
            'quantity' => $quantity,    
        );
        
    }
   
    // empty session but retain persistent cart
    WC()->cart->empty_cart(); 
    
    // add previous cart items
    foreach ($final_items as $item){
        $woocommerce->cart->add_to_cart($item['product_id'], $item['quantity']);
    }
    
    // save to persistent again
    WC_Cart::persistent_cart_update();
   
    return $redirect;
}
add_filter( 'woocommerce_login_redirect', 'wc_custom_user_redirect', 10, 2 );

 

Add your feedback or comment below: