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' );
我有一段代码可以为特定用户角色 (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' );