3

Using Hide shipping method for specific shipping classes in woocommerce answer code, I'm trying to hide shipping options based on shipping class.

Large items and small items have their own shipping class on our website and we only want to offer express shipping on small items.

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 method to hide
    $method_key_id = 'flat_rate:7';

    // Checking in cart items
    foreach( WC()->cart->get_cart() as $cart_item ){
        // If we find the shipping class
        if( $cart_item['data']->get_shipping_class_id() == $class ){
            unset($rates[$method_key_id]); // Remove the targeted method
            break; // Stop the loop
        }
    }
    return $rates;
}

I understand how to implement the code, however I don't know where to find the shipping class id, I can only find the slug and shipping class name

// HERE define your shipping class to find

$class = 92;

in the above example, where do I find the Id to replace the 92?

Thanks In advance.

Will

LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
Will Garza
  • 43
  • 1
  • 1
  • 3

1 Answers1

6

To make it work with shipping class "Slugs" you will use WC_Product get_shipping_class() method instead this way:

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 SLUG
    $class_slug = 'large';

    // HERE define the shipping method to hide
    $method_key_id = 'flat_rate:7';

    // Checking in cart items
    foreach( WC()->cart->get_cart() as $cart_item ){
        // If we find the shipping class
        if( $cart_item['data']->get_shipping_class() == $class_slug ){
            unset($rates[$method_key_id]); // Remove the targeted method
            break; // Stop the loop
        }
    }
    return $rates;
}

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

Sometimes, you should may be need to refresh shipping methods going to shipping areas, then disable / save and re-enable / save your "flat rates" shipping methods.

To find the shipping methods IDs and the shipping classes IDs see below…


Finding the shipping class ID.

1) In the database under wp_terms table:

Search for a term name or a term slug and you will get the term ID (the shipping class ID).

2) On Woocommerce shipping settings editing a "Flat rate", with your browser html inspector tool, inspect a shipping Class rate field like:

enter image description here

In the imput name attribute you have woocommerce_flat_rate_class_cost_64. So 64 is the ID for the shipping class.


Get the shipping method rate ID:

To get the related shipping methods rate IDs, something like flat_rate:12, inspect with your browser code inspector each related radio button attribute name like:

enter image description here

LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
  • 1
    The above was super helpful, if anyone else is trying to use this snippet: // HERE define the shipping method to hide $method_key_id = 'flat_rate:7'; to find the Shipping Method id, the easiest way is to go to WooCommerce Settings > Shipping > Shipping zone with the method you want to exclude > right click on the method you want to exclude and choose open in new tab. Then look at the end of the url and use that id. For example the url might be: https://yoursite.com/wp-admin/admin.php?page=wc-settings&tab=shipping&instance_id=18 The id of the shipping method to hide is 18 – Will Garza Dec 14 '18 at 17:55
  • very nice trick how to find the slug in the DOM! – Peter Højlund Palluth Dec 17 '21 at 10:05