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

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();
        }
    }

}

Related posts

Leave a Reply

10 comments

  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;
    }
    
  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;
        }
    
  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 );
    
  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 );
    
  5. You have two options:

    1. WooCommerce Min/Max Quantities extension
    2. 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 );
                }
        }
    
    
  6. Don’t add functions directly to your commerce files…you’ll lose all your code when you update.

    User functions should always be hooked through the functions.php of your theme.

  7. Add this to your child-themes functions.php (tested in 2022, requires PHP 7 or higher):

    add_filter('woocommerce_add_cart_item_data', function($cart_data) {
        wc_empty_cart();
        return $cart_data;
    }, 99);
    

    The “woocommerce_add_cart_item_data” filter fires every time a new item is added to the cart. We use this chance to call “wc_empty_cart” which empties the cart and optionally the persistent cart too. The new items is therefore alone in the cart.

  8. Try this,

    For removing the all products from the cart and adding the last added one,

    //For removing all the items from the cart
    global $woocommerce;
    $woocommerce->cart->empty_cart();
    $woocommerce->cart->add_to_cart($product_id,$qty);
    

    class file is wp-content/plugins/woocommerce/classes/class-wc-cart.php.

    You can add the above code on the add to cart function in functions.php.

    Hope its works..

  9. Eu coloco na function.php do tema, o que faço ou no woocomerce

    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 ) {
                    wc_add_notice( 'The product is already in cart', 'error' );
                    return false;
                }
            }
        }
    
        return $valid;
    
    }
    add_filter( 'woocommerce_add_to_cart_validation', 'check_if_cart_has_product', 10, 3 );