Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
WooCommerce - Hide shipping rates when free shipping is available.
* 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 );
Copy link

Domi-ml commented Dec 3, 2020


I would like to use the original code to display free shipping when I don't need to show flat rate anymore : it doesn't work.
I've tried on my local site to remove every other things from my functions.php : it still does not work.

What could be wrong ? I've tried to write my own filter before finding this one, and I couldn't understand what could be wrong.

Still my site is running normally offline and online, with all the other functions and plugins.

Copy link

jvorld commented Sep 17, 2021

The code for free shipping + local pickup didn't work for me, but I found a solution in the WooCommerce docs. Might be helpful for some.

Copy link

bdonkor commented Nov 8, 2021

You have saved me out of a 1-week headache, I am grateful

Copy link

Mona88888 commented Mar 14, 2022

What code to use if you want the shipping price to appear only for class specific and not based on amount spent?

Copy link

I used the php coding and this is what happen to my Wordpress account = Parse error: syntax error, unexpected '*', expecting end of file in /home/customer/www/ on line 3

Fatal error: Exception thrown without a stack frame in Unknown on line 0

I am unable to login or see my account or website. HELP HELP HELP

Copy link

KoolPal commented Jul 29, 2022

add_filter('woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2);
function hide_shipping_when_free_is_available($rates, $package) {
$free_yn = 0;
$pickup_yn = 0;
foreach($rates as $key => $value) {
$key_part = explode(":", $key);
$method_title = $key_part[0];
if ('free_shipping' == $method_title) {
// check if free shipping rate exists
$free_yn = 1;
$free_shipping = $rates[$key];
$free_key = $key;
if ('local_pickup' == $method_title) {
// check if local pickup rate exists
$pickup_yn = 1;
$local_pickup = $rates[$key];
$pickup_key = $key;
if ($free_yn == 1) {
// Unset all rates.
$rates = array();
// Restore free shipping rate.
$rates[$free_key] = $free_shipping;
if ($pickup_yn == 1) {
// Restore local pickup rate.
$rates[$pickup_key] = $local_pickup;
return $rates;
return $rates;

@masjo Brilliant! Still works awesome in 2022! God bless you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment