【问题标题】:Check WooCommerce User Role and Payment Gateway and if they match - Apply fee检查 WooCommerce 用户角色和支付网关,如果它们匹配 - 应用费用
【发布时间】:2020-09-16 15:13:35
【问题描述】:

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

如果我不检查用户角色,我编写的代码可以正常工作,但是一旦我尝试这样做,它就不会。

我已删除(注释)代码中的用户角色 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 );
    }
}

【问题讨论】:

    标签: php wordpress woocommerce checkout hook-woocommerce


    【解决方案1】:

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

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

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

    【讨论】:

    • 你如何让它在“check,-out/order-pay”上工作?
    【解决方案2】:

    @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

    【讨论】:

      猜你喜欢
      • 2015-08-26
      • 2020-09-27
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 2019-01-29
      • 2018-11-22
      相关资源
      最近更新 更多