WooCommerce – Автоматическое добавление или автоматическое удаление продукта в корзину

Я работаю в магазине WooCommerce, где мы хотели бы предоставить каждому клиенту халяву (электронную книгу), которая будет отображаться в корзине, после того, как вы добавите продукт в корзину.

Пример:
Вы добавляете «product1» в корзину, и теперь в корзине будет показано 2 продукта. «продукт1» и «халява». Когда вы удалите продукт из корзины, халява снова будет удалена.

Я получил этот код:

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

Но пока это не работает.

Что я делаю неправильно?

Любая помощь будет действительно оценена.

Благодарю.

– Обновлено – (проверено и работает для всех продуктов)

Я обновил ваш код, чтобы он работал. Этот код проверен и полностью работоспособен:

 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's removed too if( !$hasmaster && !empty($freebiekey) ) WC()->cart->remove_cart_item($freebiekey); } 

код идет в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.

Этот код проверен и работает.