Я использую 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 и веб-служб.
Чтобы изменить только десятичные дроби суммы комиссии, отображаемой на странице оформления заказа 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 вашей дочерней темы (или в плагине). Он должен работать.