检查WooCommerce用户角色和支付网关,以及它们是否匹配-收取费用

时间:2020-05-29 05:37:40

标签: php wordpress woocommerce checkout hook-woocommerce

如果选择了特定的支付网关,我将努力为一系列用户角色收取费用。

如果不检查用户角色,我编写的代码会很好,但是一旦尝试这样做,它就不会生效。

我已删除(注释)了代码中的用户角色if语句,我正在寻求帮助使其工作。

我需要检查用户角色是否与我的array匹配,如果匹配,请检查支付网关。如果付款网关也匹配,请收取费用。

这是我的代码:

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

2 个答案:

答案 0 :(得分:1)

您可以使用以下解释,并在代码中添加注释

此代码中必须满足的条件:

  • 仅适用于某些用户角色
  • 检查付款方式
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 );

编辑

要完成我的回答,请参阅answer中的LoicTheAztec

答案 1 :(得分:1)

@ 7uc1f3r的答案是好的,但是它缺少重要的内容

在选择付款方式的WooCommerce结帐中,结帐总额不会刷新。因此,需要其他一些内容才能刷新结帐“订单查看”部分:

// 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文件中。经过测试,可以正常工作。

相关:Add fee based on specific payment methods in WooCommerce

相关问题