Need Woocommerce to only allow 1 product in the cart. If a product is already in the cart and another 1 is added then it should remove the previous 1
Solution 1
Unfortunately there is no 'action' hook before WooCommerce adds an item to the cart. But they have a 'filter' hook before adding to cart. That is how I use it:
add_filter( 'woocommerce_add_cart_item_data', 'woo_custom_add_to_cart' );
function woo_custom_add_to_cart( $cart_item_data ) {
global $woocommerce;
$woocommerce->cart->empty_cart();
// Do nothing with the data and return
return $cart_item_data;
}
Solution 2
Based on the accepted answer and the latest Woo version 2.5.1 I updated the function to be slightly cleaner using the code woo uses in class-wc-checkout.php to clear the cart
add_filter( 'woocommerce_add_cart_item_data', '_empty_cart' );
function _empty_cart( $cart_item_data ) {
WC()->cart->empty_cart();
return $cart_item_data;
}
Solution 3
There is a filter/hook that runs before an item is added to the cart as each product goes through validation before it is added.
So when validating a product, we can check if the item if there are already items in the cart and clears those (if the current item is able to be added) and adds an error message.
/**
* When an item is added to the cart, remove other products
*/
function so_27030769_maybe_empty_cart( $valid, $product_id, $quantity ) {
if( ! empty ( WC()->cart->get_cart() ) && $valid ){
WC()->cart->empty_cart();
wc_add_notice( 'Whoa hold up. You can only have 1 item in your cart', 'error' );
}
return $valid;
}
add_filter( 'woocommerce_add_to_cart_validation', 'so_27030769_maybe_empty_cart', 10, 3 );
Solution 4
This worked like a charm for me, removes the previous product and adds the new one with the new product configuration. Cheers
Update: For WooCommerce 3.0.X
function check_if_cart_has_product( $valid, $product_id, $quantity ) {
if(!empty(WC()->cart->get_cart()) && $valid){
foreach (WC()->cart->get_cart() as $cart_item_key => $values) {
$_product = $values['data'];
if( $product_id == $_product->get_id() ) {
unset(WC()->cart->cart_contents[$cart_item_key]);
}
}
}
return $valid;
}
add_filter( 'woocommerce_add_to_cart_validation', 'check_if_cart_has_product', 10, 3 );
For WooCommerce version less than 3.0.X
function check_if_cart_has_product( $valid, $product_id, $quantity ) {
if(!empty(WC()->cart->get_cart()) && $valid){
foreach (WC()->cart->get_cart() as $cart_item_key => $values) {
$_product = $values['data'];
if( $product_id == $_product->id ) {
unset(WC()->cart->cart_contents[$cart_item_key]);
}
}
}
return $valid;
}
add_filter( 'woocommerce_add_to_cart_validation', 'check_if_cart_has_product', 10, 3 );
Solution 5
You have two options:
- WooCommerce Min/Max Quantities extension
- The following code added to your
functions.php
theme file
add_filter ( 'woocommerce_before_cart' , 'allow_single_quantity_in_cart' ); function allow_single_quantity_in_cart() { global $woocommerce; $cart_contents = $woocommerce->cart->get_cart(); $keys = array_keys ( $cart_contents ); foreach ( $keys as $key ) { $woocommerce->cart->set_quantity ( $key, 1, true ); } }
Related videos on Youtube
Swof
Updated on July 09, 2022Comments
-
Swof almost 2 years
I think this code should work but not exactly sure where to place it. Everywhere I have tried has failed so far...
add_action('init', 'woocommerce_clear_cart'); function woocommerce_clear_cart() { global $woocommerce, $post, $wpdb; $url = explode('/', 'http://'.$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]); $slug=$url[4]; $postid = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_status='publish' AND post_name = '$slug'"); if ($postid){ if ($postid == PRODUCTID1 || $postid == PRODUCTID2){ $woocommerce->cart->empty_cart(); } } }
-
Marek Maurizio almost 10 yearsWorked perfectly for me. I also set the option to limit the item's quantity to only one per order.
-
Stuart almost 9 yearsWorked perfectly for me—I had converted the product quantity selector to my own values in a dropdown so needed to limit how many the user added. This allows only one row of a single line of product.
-
stinkysGTI about 8 yearsWorked perfectly for me as well +1
-
Digamber over 6 years@Gauchocode have updated the answer to work with WooCommerce 3.0.X
-
user658182 almost 6 yearsHow can we modify this so that we can also limit the qty to just 1 as well?
-
Maykel Esser about 2 yearsThis is awesome! +1 for this superb solution!