Проверьте роль пользователя WooCommerce и платежный шлюз, и если они совпадают - примените комиссию - PullRequest
3 голосов
/ 29 мая 2020

Мне трудно применить плату за массив ролей пользователей, если и когда выбран конкретный c платежный шлюз.

Написанный мной код отлично работает, если я не проверю

Я удалил (прокомментировал) оператор роли пользователя 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 ]

1 голос
/ 07 августа 2020

Ответ @ 7uc1f3r хорош, но что-то важное отсутствует в it.

В кассе WooCommerce при выборе способа оплаты итоговые суммы кассы не обновляются. Поэтому требуется что-то дополнительное, чтобы обновить sh раздел «просмотр заказа» оформления заказа:

// 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 файл вашей активной дочерней темы (или активной темы). Протестировано и работает.

Связано: Добавить плату в зависимости от c способов оплаты в WooCommerce

1 голос
/ 29 мая 2020

Вы можете использовать следующее объяснение с комментариями, добавленными в код

Условия, которые должны быть выполнены в этом коде:

  • только для определенных ролей пользователей
  • чеки по способу оплаты
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 );

ИЗМЕНИТЬ

Чтобы закончить мой ответ, см. ответ от @ LoicTheAzte c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...