WooCommerce 结帐时根据用户 ID、用户角色和付款方式收取额外费用

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

我有一段代码可以为特定用户角色 (b2bcustomer) 的结账添加少量费用。一切正常。

现在我希望这个用户角色 (b2bcustomer) 中的一个特定用户 ID 不被收取费用。

我尝试完成下面的代码,但是这个用户 ID 的费用仍然被收取。有什么建议吗?

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, '');
   
  }
 
}

一些 comments/suggestions 关于您的代码 attempt/question

  • 不需要使用global $woocommerce;,因为$cart被传递给了回调函数
  • 您可以对条件进行分组,但为了清楚起见,也可以将它们一一列出。 同样的条件肯定没必要重复几次
  • 但最重要的是,考虑到所选择的付款方式。在 WooCommerce 结账中选择付款方式时,结账总计不会刷新。因此需要一些额外的东西来刷新结帐“订单审查”部分

所以你得到:

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