3

With WooCommerce, I am looking to see if it's possible to remove a specific item (from cart), if another specific item is in the cart.

My web shop has a free version of a product which gives to customer a basic access to site content. The paid version will open up more access to content. This way if the free version is already in the cart, and the paid version gets added to cart, then the free version will be removed from cart.

I tried looking at possible options and plugins but most of them have conditions based on pricing and things like that.

double-beep
  • 5,031
  • 17
  • 33
  • 41
mimirmike
  • 41
  • 1
  • 4
  • 1
    Welcome to Stackoverflow. Unfortunatly Stackoverflow is neither a code writing service nor a tool finding service therefore your question is unlikely to be answered. What you want to do is possible. For sure. You have to go into the source code of Woocommerce and find the correct action hook / filter hook where you can trigger an action to remove the product. – Blackbam Jan 24 '17 at 16:28

1 Answers1

8

Yes is possible with a custom function hooked for example in woocommerce_add_to_cart hook:

add_action( 'woocommerce_add_to_cart', 'check_product_added_to_cart', 10, 6 );
function check_product_added_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {

    // Set HERE your targeted product ID
    $target_product_id = 31;
    // Set HERE the  product ID to remove
    $item_id_to_remove = 37;

    // Initialising some variables
    $has_item = false;
    $is_product_id = false;

    foreach( WC()->cart->get_cart() as $key => $item ){
        // Check if the item to remove is in cart
        if( $item['product_id'] == $item_id_to_remove ){
            $has_item = true;
            $key_to_remove = $key;
        }

        // Check if we add to cart the targeted product ID
        if( $product_id == $target_product_id ){
            $is_product_id = true;
        }
    }

    if( $has_item && $is_product_id ){
        WC()->cart->remove_cart_item($key_to_remove);

        // Optionaly displaying a notice for the removed item:
        wc_add_notice( __( 'The product "blab bla" has been removed from cart.', 'theme_domain' ), 'notice' );
    }
}

This code goes in function.php file of your active child theme (or theme) or also in any plugin file.

This code is tested and works.

LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399