I am looking for the right hook in WooCommerce because I need to add a promotional product to the cart when a certain cart amount of is reached, such as 100 conventional units.
I have also used the hook 'init'
but I do not think it’s right.
Here is my code:
function add_free_product_to_cart(){ global $woocommerce; $product_id = 2006; $found = false; if ( sizeof( $woocommerce->cart->get_cart() ) > 0 ) { foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) { $_product = $values['data']; if ( $_product->id == $product_id ) $found = true; } if(!$found) { $maximum = 100; $current = WC()->cart->subtotal; if($current > $maximum){ $woocommerce->cart->add_to_cart( $product_id ); } } } } add_action( 'woocommerce_add_to_cart', 'add_free_product_to_cart' );
which hook I should use for that purpose?
Or could you give me a related link to to some similar problem?
Thanks
Advertisement
Answer
As you are targeting a certain cart amount to add a promotional product in the cart, you could use
woocommerce_before_calculate_totals
hook to achieve this with a custom built function.
You have also to remove that promo item if customer update the cart (which is embed in that custom function too).
Here is the code:
add_action( 'woocommerce_before_calculate_totals', 'adding_promotional_product', 10, 1 ); function adding_promotional_product( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return; $promo_id = 99; // <=== <=== <=== Set HERE the ID of your promotional product $targeted_cart_subtotal = 100; // <=== Set HERE the target cart subtotal $has_promo = false; $subtotal = 0; if ( ! $cart->is_empty() ){ // Iterating through each item in cart foreach ($cart->get_cart() as $item_key => $cart_item ){ $product_id = version_compare( WC_VERSION, '3.0', '<' ) ? $cart_item['data']->id : $cart_item['data']->get_id(); // If Promo product is in cart if( $product_id == $promo_id ) { $has_promo = true; $promo_key= $item_key; } else { // Adding subtotal item to global subtotal $subtotal += $cart_item['line_subtotal']; } } // If Promo product is NOT in cart and target subtotal reached, we add it. if( ! $has_promo && $subtotal >= $targeted_cart_subtotal ) { $cart->add_to_cart( $promo_id ); // echo 'add'; // If Promo product is in cart and target subtotal is not reached, we remove it. } elseif( $has_promo && $subtotal < $targeted_cart_subtotal ) { $cart->remove_cart_item( $promo_key ); } } }
This code goes on function.php file of your active child theme (or theme) or in any plugin file.
This code its tested and works.
Related thread: WooCommerce – Auto add or auto remove a freebie product from cart
Code updated on (2018-10-01)