如果选择了一个特定的支付网关,我很难为一系列用户角色申请费用。
如果我不检查用户角色,我编写的代码就可以正常工作,但一旦我尝试这样做,它就不会工作了。
我已经删除了(注释)代码中的用户角色if
语句,并请求帮助使其工作。
我需要检查用户角色是否与我的数组匹配,如果匹配,请检查支付网关。如果支付网关也匹配,则申请费用。
这是我的代码:
add_action( 'woocommerce_cart_calculate_fees', 'custom_fee', 20, 1 );
function custom_fee ($cart){
if (is_admin() && !defined('DOING_AJAX')) return;
if (!is_user_logged_in()) return;
if (!is_checkout() && !is_wc_endpoint_url()) return;
$customer_role = wp_get_current_user();
$roles_to_check = array( 'vendor', 'external' );
$payment_method = WC()->session->get('chosen_payment_method');
// if (!in_array($roles_to_check, $customer_role->roles)) return;
if ('bacs' == $payment_method){
$payment_fee = $cart->subtotal * 0.05;
$cart->add_fee( 'Payment Fee', $payment_fee, true );
}
}
您可以使用下面的解释,并在代码中添加注释
本规范中必须满足的条件包括:
function custom_fee( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( ! ( is_checkout() && ! is_wc_endpoint_url() ) )
return; // Only checkout page
if ( ! is_user_logged_in())
return;
// Get current WP_User Object
$user = wp_get_current_user();
// User roles
$roles = ( array ) $user->roles;
// Roles to check
$roles_to_check = array( 'vendor', 'external', 'administrator' );
// Compare
$compare = array_diff( $roles, $roles_to_check );
// Result is empty
if ( empty ( $compare ) ) {
// Payment method
$payment_method = WC()->session->get('chosen_payment_method');
// Condition equal to
if ( $payment_method == 'bacs' ) {
// Calculate
$payment_fee = $cart->subtotal * 0.05;
// Add fee
$cart->add_fee( 'Payment Fee', $payment_fee, true );
}
}
}
add_action( 'woocommerce_cart_calculate_fees', 'custom_fee', 10, 1 );
编辑
要完成我的答案,请参阅@LoicTheAztec的答案
@7uc1f3r的答案是好的,但它缺少了一些重要的东西。
在电子商务结账中,选择付款方式时,不会刷新结账总额。因此,刷新结帐“订单审查”部分需要一些额外的内容:
// jQuery - Update checkout on payment method change
add_action( 'wp_footer', 'custom_checkout_jquery_script' );
function custom_checkout_jquery_script() {
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;
}
代码functions.php活动子主题(或活动主题)的文件中。测试和工作。
相关:根据WooCommerce中的特定支付方式添加费用