wordpresswoocommercecheckoutuser-rolesfee

Extra fee based on user ID, user role and payment method in WooCommerce checkout


I have a piece of code that adds a small fee to the checkout for a certain user role (b2bcustomer). Everything works OK.

Now I would like one particular user ID in this user role (b2bcustomer) not to be charged a fee.

I tried to complete the code below, but the fee for this user ID is still charged. Any advice?

Code in functions.php:

add_action( 'woocommerce_cart_calculate_fees', 'b2b_fee_for_gateway' );
   
function b2b_fee_for_gateway() {
$user_id = get_current_user_id(); /*added*/
    
    if(is_checkout() && WC()->customer->get_role() != current_user_can( 'b2bcustomer' ) && ($user_id != 1083)) /*added && ($user_id != 1083)*/
    return;
   
    global $woocommerce;
   
    $chosen_gateway = $woocommerce->session->chosen_payment_method;
  
    if ( $chosen_gateway != 'cod' && current_user_can( 'b2bcustomer' ) && ($user_ID != 1083)) 
       
    $surcharge = 10;   
        $woocommerce->cart->add_fee( 'B2B processing cost', $surcharge, true, '');
   
  }
 
}

Solution

  • Some comments/suggestions regarding your code attempt/question

    So you get:

    function action_woocommerce_cart_calculate_fees( $cart ) {
        if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    
        // 1. Only for 'b2bcustomer' user role
        if ( ! current_user_can( 'b2bcustomer' ) ) return;
    
        // 2. Exclude certain user ID
        if ( get_current_user_id() == 1083 ) return;
    
        // 3. Only for 'cod' payment method
        if ( WC()->session->get( 'chosen_payment_method' ) != 'cod' ) return;
        
        // Fee
        $surcharge = 10;   
    
        // Applying
        $cart->add_fee( __( 'B2B processing cost', 'woocommerce' ), $surcharge, true, '' );
    }
    add_action( 'woocommerce_cart_calculate_fees', 'action_woocommerce_cart_calculate_fees', 10, 1 );
    
    // jQuery - Update checkout on method payment change
    function action_wp_footer() {
        if ( is_checkout() && ! is_wc_endpoint_url() ) :
        ?>
        <script type="text/javascript">
        jQuery( function($){
            $( 'form.checkout' ).on( 'change', 'input[name="payment_method"]', function() {
                $( document.body ).trigger( 'update_checkout' );
            });
        });
        </script>
        <?php
        endif;
    }
    add_action( 'wp_footer', 'action_wp_footer' );