Hide other shipping methods when “Free Shipping” is available

You are here:

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.

Was this article helpful?
Dislike 0
Views: 10