Search code examples
phpwordpresswoocommercecartshipping-method

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.


Solution

  • 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.