WooCommerce - Automatically add or remove products to cart

I work in the WooCommerce store, where we would like to provide each customer with a freebie (e-book) that will be displayed in the basket after you add the product to the basket.

Example:
You add "product1" to the cart, and now 2 products will be shown in the cart. "product1" and "freebie." When you remove the product from the basket, the freebie will be removed again.

I got this code:

add_action( 'woocommerce_add_to_cart', 'check_freebie_exists', 10, 6 ); function check_freebie_exists($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) { if($product_id == 1234) { // obviously replace this with the product that triggers the freebie /* or you could use if(has_term($cat_id, 'product_cat', $product_id)) { to check if a product is in a particular product_cat or you could check anything else related to the product */ $hasfreebie = false; // loop through the cart to check the freebie is not already there global $woocommerce; $cart = $woocommerce->cart->get_cart(); foreach($cart as $key => $values) { if($values['data']->id == $your_freebie_product_id) { $hasfreebie = true; break; } } if(!$hasfreebie) { $woocommerce->cart->add_to_cart($your_freebie_product_id); } } } add_action( 'woocommerce_cart_item_removed', 'remove_freebie', 10, 2 ); function remove_freebie( $cart_item_key, $cart ) { $hasmaster = false; $freebiekey = NULL; foreach($cart as $key => $values) { if($values['data']->id == 1234) { // check that we have the product that should trigger the freebie $hasmaster = true; } elseif($values['data']->id == $your_freebie_product_id) { $freebiekey = $key; } } if(!$hasmaster && $freebiekey) { $cart->remove_cart_item($freebiekey); } } 

But it still does not work.

What am I doing wrong?

Any help would be really appreciated.

Thanks.

+6
source share
1 answer

- Updated - (tested and works for all products)

I updated your code to make it work. This code is verified and fully functional:

 add_action( 'woocommerce_add_to_cart', 'check_add_freebie', 10, 6 ); function check_add_freebie($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) { $item_special = $product_id; $freebie_item_id = 99; // the freebie product // just for our special product if($product_id == $item_special) { $cart_items = WC()->cart->get_cart(); // Iterating through each item in cart foreach ($cart_items as $cart_item ){ // If freebie product is in cart if( $cart_item['data']->id == $freebie_item_id ) { $has_freebie = true; break; } // If freebie product is NOT in cart else $has_freebie = false; } // If freebie product is NOT in cart, we add it. if(!$has_freebie) WC()->cart->add_to_cart($freebie_item_id); } } add_action( 'woocommerce_cart_item_removed', 'remove_freebie', 10, 2 ); function remove_freebie( $cart_item_key, $product_id) { $item_special = $product_id; $freebie_item_id = 99; // the freebie product $hasmaster = false; $freebiekey = NULL; // Iterating through each item in cart foreach( WC()->cart->get_cart() as $item_key => $item ) { if ( $item['data']->id == $item_special ) $hasmaster = true; // Special product is in cart elseif ( $item['data']->id == $freebie_item_id ) $freebiekey = $item_key; // Freebie product is in cart } // AS freebie product is in cart, it removed too if( !$hasmaster && !empty($freebiekey) ) WC()->cart->remove_cart_item($freebiekey); } 

the code goes in the function.php file of your active child theme (or theme), as well as in any plug-in file.

This code has been verified and works.

+2
source

All Articles