WooCommerce 2.6 - Hiding paid shipping when free shipping is triggered by reaching specific amount WooCommerce 2.6 - Hiding paid shipping when free shipping is triggered by reaching specific amount wordpress wordpress

WooCommerce 2.6 - Hiding paid shipping when free shipping is triggered by reaching specific amount


Please try replacing your existing snippet with the below one. Details of this snippet is described in this article. Let me know if this can be improved.

add_filter('woocommerce_package_rates', 'xa_hide_shipping_rates_when_free_is_available', 10, 2);function xa_hide_shipping_rates_when_free_is_available($rates, $package){    global $woocommerce;    $version = "2.6";    if (version_compare($woocommerce->version, $version, ">=")) {        foreach($rates as $key => $value) {            $key_part = explode(":", $key);            $method_title = $key_part[0];            if ('free_shipping' == $method_title) {                $free_shipping = $rates[$key];                // Unset all rates.                $rates = array();                // Restore free shipping rate.                $rates[$key] = $free_shipping;                return $rates;            }        }    }    else {        if (isset($rates['free_shipping'])) {          // Below code is for unsetting single shipping method/option.            // unset($rates['flat_rate']);            $free_shipping = $rates['free_shipping'];            // Unset all rates.            $rates = array();            // Restore free shipping rate.            $rates['free_shipping'] = $free_shipping;        }    }    return $rates;}


Provided you have removed the legacy shipping methods (shipping methods must be set up using new shipping zones), you can use the following snippet to remove all other shipping methods when free shipping is available. (WooCommerce 2.6+):

  /**   * 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 ); 

From the updated docs


Ok the following code will allow Local Pickup with Free Shipping:

// ##### WOOCOMMERCE - HIDE OTHER SHIPPING METHODS WHEN FREE SHIPPING IS AVAILABLE #####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;}