skip to Main Content

I have a code to hide shipping for non-wholesale customers, please help me redo it, I need to hide the shipping option for wholesale customers.

/**
 * Removes shipping methods for non-wholesale customers.
 * Please be sure to clear your WooCommerce store's cache.
 * Adjust 'flat_rate:2' to match that of your wholesale shipping method.
 */
 
function my_wcs_remove_shipping_non_wholesale( $rates, $package ){
    global $current_user;

    $is_wholesale = get_user_meta( $current_user->ID, 'wcs_wholesale_customer', true );

    if ( ! $is_wholesale ) {
        foreach( $rates as $method ) {
            if ( $method->id == 'flat_rate:2' ) {
                unset( $rates[$method->id] );           
            }
        }
    }
    
    return $rates;
}
add_filter( 'woocommerce_package_rates', 'my_wcs_remove_shipping_non_wholesale', 10, 2 );

2

Answers


  1. You don’t need to have 2 functions, one for Wholesale customers and an other for non Wholesale customers… you can merge both in the same function as follows:

    add_filter( 'woocommerce_package_rates', 'shipping_methods_based_on_wholesale_customer', 10, 2 );
    function shipping_methods_based_on_wholesale_customer( $rates, $package ){
        $is_wholesale = get_user_meta( get_current_user_id(), 'wcs_wholesale_customer', true );
        
        // Set the shipping methods rate ids in the arrays:
        if( $is_wholesale ) {
            $shipping_rates_ids = array('flat_rate:1', 'flat_rate:4'); // To be removed for NON Wholesale users
        } else {
            $shipping_rates_ids = array('flat_rate:2'); // To be removed for Wholesale users
        }
    
        // Loop through shipping rates fro the current shipping package
        foreach( $rates as $rate_key => $rate ) {
            if ( in_array( $rate_key, $shipping_rates_ids) ) {
                unset( $rates[$rate_key] ); 
            }
        }
        
        return $rates;
    }
    

    Code goes in functions.php file of the active child theme (or active theme). It should works.

    Don’t forget to empty the cart after saving the code, to refresh cached shipping data

    Login or Signup to reply.
  2. So for everybody, like me, where the code didn’t work. With the help of @Howard E here is the adjusted code 2022 which now works:

    add_filter( 'woocommerce_package_rates', 'shipping_methods_based_on_wholesale_customer', 10, 2 );
    function shipping_methods_based_on_wholesale_customer( $rates, $package ) {
       $user  = wp_get_current_user();
       $roles = (array) $user->roles;
       // Set the shipping methods rate ids in the arrays.
       if ( ! in_array( 'wholesale_customer', $roles, true ) ) {
          $shipping_rates_ids = array( 'flat_rate:10', 'flat_rate:7' ); // To be removed for NON Wholesale users.
       } else {
          $shipping_rates_ids = array( 'flat_rate:13', 'flat_rate:15' ); // To be removed for Wholesale users.
       }
       // Loop through shipping rates from the current shipping package.
       foreach ( $rates as $rate_key => $rate ) {
          if ( in_array( $rate_key, $shipping_rates_ids, true ) ) {
             unset( $rates[ $rate_key ] );
          }
       }
       return $rates;
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search