WooCommerce – Check Cart Amount and Applied Coupons


WooCommerce – Check cart amount and applied coupons to determine the valid shipping options. For example, if the customer enters a coupon that is on the excluded coupon list, then update the shipping options.  Where is this helpful?  Well, if you offer free shipping on all orders over a set amount (where certain restrictions apply…).  and if one if the restrictions is that you don’t offer free shipping if the customer is using a coupon for 30% off the entire cart.  So, you would want to check the cart for the amount and all applied coupons and if the cart is greater than the specified threshold and a coupon that is in the excluded coupon list is found, return regular shipping options or in my case, it was flat rate shipping…  We are also checking to see if the customer’s cart is greater than a specified amount and if they qualify for free shipping or not.

/* Change shipping based on total cost purchased and or applied coupons are excluded. */
add_filter( 'woocommerce_shipping_packages', 'hide_flat_rate_if_cart_total_is_greater_than_threshold', 5, 1 );
function hide_flat_rate_if_cart_total_is_greater_than_threshold( $packages ) {
    $threshold1 = 249;
    $applied_coupons = WC()->session->get( 'applied_coupons', array() );
    $amount = WC()->cart->cart_contents_total;
    $availableRates = $packages[0]['rates'];
    $excluded_coupons = array('coupon1', 'coupon2', 'coupon3', 'coupon4', 'coupon5', 'coupon6', 'cooupon7', 'eight', 'nine', 'ten');

    $isExcludedCoupon = false;
    $map = array_map(function($c) use($excluded_coupons, &$isExcludedCoupon ){
        if( in_array($c, $excluded_coupons) ){
            $isExcludedCoupon = true;
        }
        return $c;
    }, $applied_coupons);

    $flatRateKey = '';
    array_map(function($r) use($availableRates, &$flatRateKey){
        $id = $r->get_id();
        $pos = substr_count($id, 'flat_rate');

        if($pos == 1 ){
            $flatRateKey = $id;
        }

        return $r;
    }, $availableRates);

    if ( $amount > $threshold1 && !$isExcludedCoupon) {
        unset($packages[0]['rates'][$flatRateKey]);
    }

    if ($isExcludedCoupon) {
        unset($packages[0]['rates']['woodiscountfree']);
        unset($packages[0]['rates']['free_shipping:2']);
    }

    return $packages;
}

Here are the conditions I needed to check in this function:
// If the cart total is greater than 250 dollars and none of the excluded coupons are applied then the user should get free shipping or pick up at the shop. Remove flat Rate
// Here is the list of excluded coupons: $excluded_coupons = array(‘coupon1’, ‘coupon2’, ‘coupon3’, ‘coupon4’, ‘coupon5’, ‘coupon6’, ‘coupon7’, ‘eight’, ‘nine’, ‘ten’);
// If an excluded coupon is applied, then free shipping should no longer be an option. They should only get presented pickup at the shop or flat rate shipping.
// If the cart is under 250 they get flat rate shipping or free pickup at the shop.
// If a cart is over 250 and they use any other coupon, not in the excluded coupons array, the user should get free shipping or pickup at the shop.
// So the only time Flat Rate should get presented is when the cart is under 250 or the user has applied a coupon in the Excluded coupons array.
// free shipping should be an option to anyone with a cart over 250 and is not using an excluded coupon