Moto Bid
Moto Bid

Reputation: 13

Hide all Flat rate Shipping methods for specific shipping classes in WooCommerce

I'm setting up a website with shipping but i have items that are collection on for all shipping zone and item that can be sent in all shipping zone.

So I have set up shipping classes for all the zones.

I am using "Hide shipping method for specific shipping classes in woocommerce" answer code and it is what I need.

But instead of putting in each flat_rate id is there a way I can target all the Flat Rate shipping methods, so when I add an other flat rate shipping setting, it will work for it, without having me making changes into the code.

I hope you understand what I am after. Any help is appreciated.

Upvotes: 1

Views: 780

Answers (1)

LoicTheAztec
LoicTheAztec

Reputation: 253978

To use it for all "flat rate" Shipping methods and some other defined shipping methods, you will use the following instead:

add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // HERE define your shipping class to find
    $class = 92;

    // HERE define the shipping methods you want to hide (others than "flat rate")
    $method_key_ids = array('local_pickup:3');

    $found = false;

    // Checking in cart items
    foreach( $package['contents'] as $cart_item ){
        // If we find the shipping class
        if( $cart_item['data']->get_shipping_class_id() == $class ){
            $found = true;
            break; // Stop the loop
        }
    }

    if( ! $found ) 
        return $rates;

    // Loop through shipping methods
    foreach( $rates as $rate_key => $rate ) {
        // Targetting "Flat rate" and other defined shipping mehods
        if( 'flat_rate' === $rate->method_id || in_array($rate->id, $method_key_ids) ) {
            unset($rates[$rate_key]);
        }
    }   

    return $rates;
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.

Refresh the shipping caches: (required)

  1. This code is already saved on your active theme's function.php file.
  2. The cart is empty
  3. In a shipping zone settings, disable / save any shipping method, then enable back / save.

Upvotes: 0

Related Questions