What I'm trying to achieve here is the following:
- Automatically add BonusProduct0 to cart when subtotal reaches 65
- Automatically replace BonusProduct0 with BonusProduct1 when subtotal reaches 80
- Automatically replace BonusProduct1 with BonusProduct2 when subtotal reaches 100
- Remove all any bonus product that happens to be in the cart when subtotal goes below 65
- Have the bonus products either zero-priced and unaccessible or normally priced and automatically reset their price when added to cart based on above conditions
Working code.
function add_product_if_not_there($product_id) {
$found = false;
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
$_product = $values['data'];
if ( $_product->get_id() == $product_id ) {
$found = true;
break;
}
}
if (!$found)
WC()->cart->add_to_cart( $product_id );
}
function remove_product_if_there($product_id) {
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
$_product = $values['data'];
if ( $_product->get_id() == $product_id ) {
WC()->cart->remove_cart_item( $cart_item_key );
break;
}
}
}
abstract class FreeCookiesBundles
{
const NoCookiesBundle = 0;
const TwoCookiesBundle = 2;
const ThreeCookiesBundle = 3;
const FourCookiesBundle = 4;
const TwoCookiesBundleId = 4920;
const ThreeCookiesBundleId = 4921;
const FourCookiesBundleId = 4922;
}
function bonus_add_product_to_cart() {
global $woocommerce;
if ( is_admin() )
return ;
$free_product_ids = array(FreeCookiesBundles::TwoCookiesBundleId,
FreeCookiesBundles::ThreeCookiesBundleId,
FreeCookiesBundles::FourCookiesBundleId);
$cookies_bundle = FreeCookiesBundles::NoCookiesBundle;
$cart_total_lvls = array(65, 100, 128);
if ( ($woocommerce->cart->subtotal >= $cart_total_lvls[0]) &&
($woocommerce->cart->subtotal < $cart_total_lvls[1])) {
$cookies_bundle = FreeCookiesBundles::TwoCookiesBundle;
} else if ( ($woocommerce->cart->subtotal >= $cart_total_lvls[1]) &&
($woocommerce->cart->subtotal < $cart_total_lvls[2]) ) {
$cookies_bundle = FreeCookiesBundles::ThreeCookiesBundle;
} else if ( ($woocommerce->cart->subtotal >= $cart_total_lvls[2]) ) {
$cookies_bundle = FreeCookiesBundles::FourCookiesBundle;
}
echo $cookies_bundle;
switch ($cookies_bundle) {
case FreeCookiesBundles::TwoCookiesBundle:
add_product_if_not_there($free_product_ids[0]);
remove_product_if_there($free_product_ids[1]);
remove_product_if_there($free_product_ids[2]);
break;
case FreeCookiesBundles::ThreeCookiesBundle:
add_product_if_not_there($free_product_ids[1]);
remove_product_if_there($free_product_ids[0]);
remove_product_if_there($free_product_ids[2]);
break;
case FreeCookiesBundles::FourCookiesBundle:
add_product_if_not_there($free_product_ids[2]);
remove_product_if_there($free_product_ids[0]);
remove_product_if_there($free_product_ids[1]);
break;
default:
remove_product_if_there($free_product_ids[0]);
remove_product_if_there($free_product_ids[1]);
remove_product_if_there($free_product_ids[2]);
}
}
add_action( 'template_redirect', 'bonus_add_product_to_cart' );