WooCommerce - Округление общих цен перед размещением заказа при использовании цен с 4 десятичными знаками

Итак, в настоящее время я работаю над веб-сайтом, на котором продаются крупы и специи оптом.

Единица на 1 продукт - 1 грамм. Я установил минимальную сумму заказа, скажем, 100 единиц (100 грамм) для продукта. Но цена за 1 грамм может быть очень низкой (иногда 0,0045 доллара, то есть даже полцента за 1 грамм).

Я также установил минимум для размещения заказа, и общая сумма корзины должна быть не менее 15 долларов.

Иногда общая сумма корзины представляет собой сумму с четырьмя десятичными знаками, например 20,5517 долларов США. Я хочу, чтобы промежуточная сумма и общая цена, указанные в корзине, были округлены до двух знаков после запятой. Но мне нужно сохранять цены на товары с четырьмя десятичными знаками, потому что это единственный способ оставаться конкурентоспособным с моими ценами.

В основном мне нужно, чтобы серверная часть сохраняла цены с 4 знаками после запятой и показывала 4 знака после запятой на продуктах (именно так он уже настроен), но я хочу, чтобы общая сумма была округлена до того, как клиент сможет заплатить через PayPal.

Кто-нибудь может мне с этим помочь?

Спасибо


person byaafra    schedule 19.07.2017    source источник


Ответы (1)


Вот решение. Но вам придется внести все необходимые изменения в шаблоны, связанные с woocommerce.

Итак, сначала, если вы не знаете, как правильно настраивать шаблоны WooCommerce, прочтите это:
Структура шаблона + переопределение шаблонов с помощью темы

Теперь с помощью настраиваемой функции ниже, которая будет выполнять работу с отображаемыми ценами в формате html (изменение цен с 4 десятичных знаков до 2 знаков после запятой и сохранение тегов html вокруг), вы сможете внести необходимые изменения в шаблоны, связанные с woocommerce:

function wc_shrink_price( $price_html ){
    // Extract the price (without formatting html code)
    $price = floatval(preg_replace('/[^0-9\.,]+/', '', $price_html));

    // Round price with 2 decimals precision
    $shrink_price = round($price, 2); 

    // Replace old existing price in the original html structure and return the result
    return str_replace($price, $shrink_price, $price_html);
}

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

Этот код протестирован и работает


ПРИМЕР ИСПОЛЬЗОВАНИЯ:

В шаблоне woocommerce cart/cart_totals.php в строке 33 у вас есть этот Исходный код:
(для итоговой отображаемой цены)

<td data-title="<?php esc_attr_e( 'Subtotal', 'woocommerce' ); ?>"><?php wc_cart_totals_subtotal_html(); ?></td>

Если вы ищете wc_cart_totals_subtotal_html() вы увидите, что использует этот метод WC_Cart: WC()->cart->get_cart_subtotal()
Таким образом, вы можете заменить его следующим образом:

<td data-title="<?php esc_attr_e( 'Subtotal', 'woocommerce' ); ?>">
<?php 
    // Replacement function by a WC_Cart method
    $subtotal_html_price = WC()->cart->get_cart_subtotal();

    // Here we use our custom function to get a formated html price with 2 decimals
    echo wc_shrink_price( $subtotal_html_price );
?>
</td>

Итак, как видите, вам нужно будет сделать что-то подобное для всех цен корзины.
Шаблоны корзины и оформления заказа находятся в cart и _10 _ подпапки…
Пора поработать!


person LoicTheAztec    schedule 19.07.2017
comment
Спасибо за ответ, это мне очень помогает! Попробую это сделать, как только вернусь домой, и дам вам знать, сработает ли это для меня. Но похоже, это должно быть правильное решение! - person byaafra; 19.07.2017
comment
@ FrédéricByarelle-Bréard Я размышляю над этим с момента вашего первого вопроса, и я не вижу другого более простого способа ... Так что это даст вам некоторую домашнюю работу :) - person LoicTheAztec; 19.07.2017
comment
Да, немного домашней работы, но это будет хороший опыт, и я уже узнал что-то новое о том, как работает woocommerce, и теперь я всегда буду смотреть на шаблоны вместо того, чтобы искать плагины :) - person byaafra; 19.07.2017
comment
Есть 2 основных способа: 1-й - это хуки (действие и фильтры)… Если вы не можете сделать это с помощью доступных хуков, вы можете переопределить шаблоны (2-й способ). Как вы увидите, даже в шаблонах WC у вас есть несколько доступных хуков для настройки без изменения этих шаблонов ... - person LoicTheAztec; 19.07.2017
comment
Это не сработало для меня, но опять же, я слишком новичок, чтобы понять, что мне делать дальше. Я попытался заменить другие функции в шаблонах cart_totals и checkout, используя метод WC_Cart, как вы сделали для другого .... сайт продолжал работать, и ничего не было сломано, но я никогда не мог отображать только 2 десятичных знака ... Но я Не могу поверить, что таких вариантов нет, должен быть более простой способ сделать это. Я просто хочу, чтобы отображаемые итоги в корзине и на кассе имели 2 десятичных знака вместо 4 :( - person byaafra; 20.07.2017