Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
[General Snippets][Hide other shipping methods when “Free Shipping” is available] Hides all other shipping methods but free_shipping if it’s available. Compatible with Shipping zones.
* Hide shipping rates when free shipping is available.
* Updated to support WooCommerce 2.6 Shipping Zones.
* @param array $rates Array of rates found for the package.
* @return array
function my_hide_shipping_when_free_is_available( $rates ) {
$free = array();
foreach ( $rates as $rate_id => $rate ) {
if ( 'free_shipping' === $rate->method_id ) {
$free[ $rate_id ] = $rate;
return ! empty( $free ) ? $free : $rates;
add_filter( 'woocommerce_package_rates', 'my_hide_shipping_when_free_is_available', 100 );

This comment has been minimized.

Copy link

faiyazalam commented Mar 16, 2018

Warning! I found out that woocommerce_package_rates hook is not fired everytime, but only when you change items or quantity of items in your cart.



This comment has been minimized.

Copy link

stratboy commented Mar 30, 2018

@faiyazalam this is not true to me, using woocommerce 3.3.4, on wp4.9.4, Bistro theme.


This comment has been minimized.

Copy link

Mr-Alexander commented Feb 23, 2019

On line #18, where you call the add_filter( ... ), you are missing the arguments for $accepted_args, it should be specified to 2, since the filter is called with 2 arguments:

from wp-content/plugins/woocommerce/includes/class-wc-shipping.php

$package['rates'] = apply_filters( 'woocommerce_package_rates', $package['rates'], $package );

add_filter( 'woocommerce_package_rates', 'my_hide_shipping_when_free_is_available', 100, 2 );

Hope I am not missing anything.


This comment has been minimized.

Copy link

ibby89 commented Jul 24, 2019

Does not seem to be working anymore with Table Rate Shipping when the rules allow free shipping.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.