Используйте 2 десятичных знака для суммы скидки в Woocommerce с настройками 0 десятичных знаков

Я использую 0 десятичных знаков под wc-settings&tab=general, что отлично подходит для моего варианта использования. Но теперь добавляем скидку для конкретного способа оплаты, которая на данный момент установлена ​​на уровне 10 процентов.

Для товара стоимостью 12 долларов США значение скидки округляется до 1, что в итоге дает 11 вместо 10,8 из-за настроек 0 десятичных знаков, упомянутых ранее.

Ближе всего я придумал следующий фильтр, но в результате стоимость доставки выросла с 23 до 23,23 долларов США. Есть идеи, как применить два десятичных знака только к сумме скидки, не мешая чему-либо еще?

// Change woo settings from 0 at the moment in backend to 2 decimals for wallet payment
add_filter( 'wc_get_price_decimals', 'custom_price_decimals_for_wallet_s0dgPHq2',10,1);
function custom_price_decimals_for_wallet_s0dgPHq2( $decimals ) {
    
    // Check if we are on the front-end and WooCommerce session is available
    if ( !is_admin() && WC()->session && isset(WC()->session->chosen_payment_method) ) {
        // Only change decimal places if the chosen payment method is wallet
        if ( WC()->session->chosen_payment_method === 'wallet' ) {                  
        
            // Set to 2 decimals for wallet payments
            $decimals = 2;
            return $decimals;
        }           
        // Return the default value for other cases
        return $decimals;
    }   
}

Вот мой код скидки:

add_filter( 'woocommerce_cart_calculate_fees', 'discount_based_on_payment_method_e643e', 10, 1 );
function discount_based_on_payment_method_e643e( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( ! ( is_checkout() && ! is_wc_endpoint_url() ) )
        return;
    
    $targeted_payment_method = 'wallet'; // Here define the desired payment method

    global $abc_options;
    $wallet_pay_discount_amount = $abc_options['wallet_payment_discount_amount_value'];
    $wallet_pay_discount_amount_formated = $wallet_pay_discount_amount / 100; // results in 0.10 for 10% and so on
    
    if ( WC()->session->get('chosen_payment_method') === $targeted_payment_method ) {
        $cart_subtotal = WC()->cart->get_subtotal();
        $discount = $cart_subtotal * $wallet_pay_discount_amount_formated;

        $fee_description = '~ ' . $wallet_pay_discount_amount . '% ' . __('Discount Wallet Payment', 'nm-ffk');

        
        $cart->add_fee($fee_description, -$discount);
    }
}   

🤔 А знаете ли вы, что...
PHP можно использовать для создания API и веб-служб.


1
50
1

Ответ:

Решено

Чтобы изменить только десятичные дроби суммы комиссии, отображаемой на странице оформления заказа WooCommerce, используйте следующую замену кода:

// Add a negative fee (discount) in Checkout page
add_action( 'woocommerce_cart_calculate_fees', 'discount_based_on_payment_method_e643e', 10, 1 ); // Action hook!
function discount_based_on_payment_method_e643e( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( ! ( is_checkout() && ! is_wc_endpoint_url() ) )
        return;
    
    $payment_id = 'wallet'; // The targeted payment method ID
    
    if ( WC()->session->get('chosen_payment_method') === $payment_id ) {
        global $abc_options;

        $discount_rate   = $abc_options['wallet_payment_discount_amount_value'];
        $discount_amount = WC()->cart->get_subtotal() * $discount_rate / 100;
        $fee_description = '~ ' . $discount_rate . '% ' . __('Discount Wallet Payment', 'nm-ffk');

        $cart->add_fee($fee_description, -$discount_amount);
    }
} 

// Update checkout on payment method change
add_action( 'woocommerce_checkout_init', 'update_checkout_on_payment_method_change' );
function update_checkout_on_payment_method_change() {
    wc_enqueue_js("$('form.checkout').on( 'change', 'input[name=payment_method]', function(){
        $(document.body).trigger('update_checkout');
    });");
}

// Display 2 decimals for fees amounts on Checkout page
add_filter( 'woocommerce_cart_totals_fee_html', 'filter_woo_cart_totals_fee_html', 10, 2 );
function filter_woo_cart_totals_fee_html( $fee_html, $fee ){
    $args = array( 'decimals' => 2 );
    return WC()->cart->display_prices_including_tax() ? wc_price( $fee->total + $fee->tax, $args ) : wc_price( $fee->total, $args );
}

Код находится в файле function.php вашей дочерней темы (или в плагине). Протестировано и работает с WooCommerce Checkout Legacy (короткий код). Не тестировалось с новым блоком оформления заказа.


Добавление:

Для заказов клиентов и уведомлений по электронной почте (невозможно в заказе администратора):

// Display 2 decimals for fees amounts on Customer orders and email notifications
add_filter( 'woocommerce_get_order_item_totals', 'filter_woo_order_item_fee_totals', 10, 3 );
function filter_woo_order_item_fee_totals( $total_rows, $order, $tax_display ){
    // Loop through total rows
    foreach ( $total_rows as $key => $data ) {
        // Loop through order fees
        foreach ( $order->get_fees() as $id => $fee ) {
            if ( $key === 'fee_'.$id ) {
                $args = array( 'currency' => $order->get_currency(), 'decimals' => 2 );
                $total_rows[$key]['value'] = wc_price( 'excl' === $tax_display ? (float) $fee->get_total() : (float) $fee->get_total() + (float) $fee->get_total_tax(), $args );
            }
        }
    }
    return $total_rows;
}

Код находится в файле function.php вашей дочерней темы (или в плагине). Он должен работать.


Интересные вопросы для изучения

Ожидаемый тип «объект». Найден массив <строка, смешанный>. (Интелефенсе 1006). Кто-нибудь может мне помочь?Страница индивидуальных заказов WooCommerce добавляет настраиваемое поле роли клиентаСумма стоимости высоты с того же идентификатораДобавить выбранное значение переключателя в качестве данных пользовательского элемента корзины через Ajax. Добавить в корзину в цикле продуктов WooCommerceКак я могу получить Refresh_token из Big Commerce?Страница индивидуальных заказов WooCommerce добавляет настраиваемое поле роли клиентаДобавить выбранное значение переключателя в качестве данных пользовательского элемента корзины через Ajax. Добавить в корзину в цикле продуктов WooCommerceWoocommerce Проблема с крючками для одного продукта: заменить кнопку «Добавить в корзину»Создание пользовательской кнопки добавления в корзину для переменных продуктов с вариациями в WooCommerceПочему изображение с водяным знаком так сильно увеличивается в размере в WordPress?