Cart / Checkout: Free Shipping Based on Frequency and Type
Conditionally remove Free Shipping as an option in the cart/checkout based on the values for Frequency and Frequency Type.
Important: Always test customizations to your site on a staging environment before making changes to your live / production site. If you are not experienced with testing changes on a staging site, here is a good article to review.
* Removes Free Shipping Based On Frequency & Type requirement * For example this function requires the cart to have at least one. * item with a Frequency of 2 and Type of Months ( i.e. Every 2 Months ) * * @param array $rates Array of shipping rates found for the package. * @return array Filtered Shipping rates */ function xx_remove_free_shipping_conditional( $rates ){ $cart = WC()->cart; // Don't bother if empty if ( empty( $cart ) ) return $rates; // Loop through the cart checking for Free Shipping Autoship frequency & Type. $free_shipping = false; foreach ( $cart->get_cart() as $item ) { $free_shipping = ( isset( $item['autoship_frequency'] ) && ( $item['autoship_frequency'] == 2 ) && isset( $item['autoship_frequency_type'] ) && ( 'Months' == $item['autoship_frequency_type'] ) ); } // If the cart meets the requirements then they get free shipping. if ( $free_shipping ) return $rates; // They don't qualify so remove it. foreach ( $rates as $rate_id => $rate ) { if ( 'autoship_free_shipping' === $rate->method_id ) { unset( $rates[ $rate_id ] ); break; } } return $rates; } add_filter( 'woocommerce_package_rates', 'xx_remove_free_shipping_conditional', 101 , 1 );