If you’d like to see this feature added to WooCommerce core, visit our Ideas Board and add your vote to it. The more popular an idea becomes, the more of a priority it is for our developers to review.
Adding code
Before adding snippets, clear your WooCommerce cache. Go to WooCommerce > System Status > Tools > WooCommerce Transients > Clear transients
Add this code to your child theme’s functions.php
file or via a plugin that allows custom functions to be added, such as the Code snippets plugin. Please don’t add custom code directly to your parent theme’s functions.php
file as this will be wiped entirely when you update the theme.
Snippets for WC 3.0+
Hides everything but free_shipping
if it’s available and is 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; | |
break; | |
} | |
} | |
return ! empty( $free ) ? $free : $rates; | |
} | |
add_filter( ‘woocommerce_package_rates’, ‘my_hide_shipping_when_free_is_available’, 100 ); |
You can also use this free plugin https://wordpress.org/plugins/wc-hide-shipping-methods/.
Snippets for WC 2.5
/** | |
* woocommerce_package_rates is a 2.1+ hook | |
*/ | |
add_filter( ‘woocommerce_package_rates’, ‘hide_shipping_when_free_is_available’, 10, 2 ); | |
/** | |
* Hide shipping rates when free shipping is available | |
* | |
* @param array $rates Array of rates found for the package | |
* @param array $package The package array/object being shipped | |
* @return array of modified rates | |
*/ | |
function hide_shipping_when_free_is_available( $rates, $package ) { | |
// Only modify rates if free_shipping is present | |
if ( isset( $rates[‘free_shipping’] ) ) { | |
// To unset a single rate/method, do the following. This example unsets flat_rate shipping | |
unset( $rates[‘flat_rate’] ); | |
// To unset all methods except for free_shipping, do the following | |
$free_shipping = $rates[‘free_shipping’]; | |
$rates = array(); | |
$rates[‘free_shipping’] = $free_shipping; | |
} | |
return $rates; | |
} |
How do I show only Local Pickup and Free Shipping?
This can be done by using this free plugin https://wordpress.org/plugins/wc-hide-shipping-methods/ or with the following code snippet
/** | |
* Hide shipping rates when free shipping is available, but keep “Local pickup” | |
* Updated to support WooCommerce 2.6 Shipping Zones | |
*/ | |
function hide_shipping_when_free_is_available( $rates, $package ) { | |
$new_rates = array(); | |
foreach ( $rates as $rate_id => $rate ) { | |
// Only modify rates if free_shipping is present. | |
if ( ‘free_shipping’ === $rate->method_id ) { | |
$new_rates[ $rate_id ] = $rate; | |
break; | |
} | |
} | |
if ( ! empty( $new_rates ) ) { | |
//Save local pickup if it’s present. | |
foreach ( $rates as $rate_id => $rate ) { | |
if (‘local_pickup’ === $rate->method_id ) { | |
$new_rates[ $rate_id ] = $rate; | |
break; | |
} | |
} | |
return $new_rates; | |
} | |
return $rates; | |
} | |
add_filter( ‘woocommerce_package_rates’, ‘hide_shipping_when_free_is_available’, 10, 2 ); |
Show only free shipping in all states except…
Show only free shipping in all states except the exclusion list. Hide free shipping if the customer is in one of the states listed:
/** | |
* Hide ALL shipping options when free shipping is available and customer is NOT in certain states | |
* | |
* Change $excluded_states = array( ‘AK’,’HI’,’GU’,’PR’ ); to include all the states that DO NOT have free shipping | |
*/ | |
add_filter( ‘woocommerce_package_rates’, ‘hide_all_shipping_when_free_is_available’ , 10, 2 ); | |
/** | |
* Hide ALL Shipping option when free shipping is available | |
* | |
* @param array $available_methods | |
*/ | |
function hide_all_shipping_when_free_is_available( $rates, $package ) { | |
$excluded_states = array( ‘AK’,’HI’,’GU’,’PR’ ); | |
if( isset( $rates[‘free_shipping’] ) AND !in_array( WC()->customer->shipping_state, $excluded_states ) ) : | |
// Get Free Shipping array into a new array | |
$freeshipping = array(); | |
$freeshipping = $rates[‘free_shipping’]; | |
// Empty the $available_methods array | |
unset( $rates ); | |
// Add Free Shipping back into $avaialble_methods | |
$rates = array(); | |
$rates[] = $freeshipping; | |
endif; | |
if( isset( $rates[‘free_shipping’] ) AND in_array( WC()->customer->shipping_state, $excluded_states ) ) { | |
// remove free shipping option | |
unset( $rates[‘free_shipping’] ); | |
} | |
return $rates; | |
} |
Enable Shipping Methods on a per Class / Product Basis, split orders, or other scenarios?
Need more flexibility? Take a look through our premium Shipping Method extensions.