-
-
Save mikejolley/7ced4986b0b9c4b1fffedbe3e6bb6860 to your computer and use it in GitHub Desktop.
<?php | |
/** | |
* 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 ); |
Hello
I have an online store where anyone who makes purchases over €30 can benefit from the “Free Shipping” or “Local Pickup” service at one of the two existing stores.
I integrated the PHP code to hide the shipping fees when the “Free Shipping” service is available (for purchases over €30) and also the “Local Pickup” option is visible… Everything worked perfectly.
The PHP code that I integrated, was this:
/**
- 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 );
However, the “Free Shipping” option is visible, but only one of the two pick-up locations.
Apart from making the “Free Shipping” option visible, is there any possibility to make all pick-up locations visible and not just one? There are currently two physical stores where “Local Pickup” is possible
Thanks.
@Sjouw Tank you very much! It really helped me as I had to show "Local Pickup" with free shipping. I used the 'My custom shipping option name' === $rate->label' and it worked perfectly. :)
@masjo Brilliant! Still works awesome in 2022! God bless you!