phpwordpresswoocommerceshipping-methodusermetadata

Show or hide shipping methods based on user meta data in WooCommerce


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

Solution

  • 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