Как в корзине Woocommerce получить подытог без скидки по акциям

Во многих магазинах в корзине для клиента отображается полная стоимость всех товаров в корзине без учета скидок и рядом указывается скидка, т.е. сумма, которую человек экономит при покупке, ну и в конце естественно итоговая стоимость к оплате. Примерно это должно выглядеть так:

Подытог1000 руб.
Скидка- 250 руб.
Итого750 руб.

В WooCommerce это реализовано очень топорно. В графу "подытог" выводится сумма уже за минусом скидок по акции, а сумма скидки даже не показывается, т.е. человек не может видеть реальную стоимость товаров и оценить экономию при покупке, что конечно же очень плохо. Клиент видит такую картину:

Подытог750 руб.
Итого750 руб.

Как получить значения скидок и нормальный подытог

Ниже я привожу функцию, которая поможет вам получить 3 значения:

  • общая стоимость товаров по обычной цене (до вычета скидок и купонов)
  • скидка на товары по акции
  • общая скидка (акции + купоны)

На выходе получаем массив со значениями, которые потом можно использовать в своём шаблоне.

function wpgid_get_cart_subtotal_and_discount() {

    global $woocommerce;

    $discount_total = 0;
        // Перебираем товары по акции и суммируем скидку
        foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values) {
            $_product = $values['data'];
            if ( $_product->is_on_sale() && !empty($_product->get_sale_price()) && is_numeric($_product->get_sale_price() ) ) {
                $regular_price = $_product->get_regular_price();
                $sale_price = $_product->get_sale_price();
                $discount = ($regular_price - $sale_price) * $values['quantity'];
                $discount_total += $discount;
            }
        }
        // Записываем значения в переменные в зависимости от того есть скидки или их нету
        if ( $discount_total > 0 || $woocommerce->cart->discount_cart > 0 ) {
            $discount = $discount_total + $woocommerce->cart->discount_cart;
            $discount_sale = $discount_total;
            $subtotal = $discount_total + $woocommerce->cart->get_subtotal();
        } else {
            $discount = '';
            $discount_sale = '';
            $subtotal =  $woocommerce->cart->get_subtotal();
        }

        // Собираем значения в массив
        $array = [
            'subtotal'      => $subtotal,
            'discount_all'  => $discount,
            'discount_sale' => $discount_sale,
            
        ];

    return $array;

}
Дима
С движком WordPress познакомился в 2015 году и сразу начал его осваивать. Очень понравилось копаться в коде и создавать что-то новое. Создаю темы и плагины WP в первую очередь для себя, но возможно мои наработки и куски кода кому-то пригодятся, поэтому создал этот блог.
Комментарии - 2
  • Миша
    Миша

    Отличная идея! Обыскал весь инет не нашел решения.
    Использовал Ваш код - к сожалению он не работает. Не выводит результаты. Можете приложить результаты скриншотом?

    Ответить
    • Дима
      Дима

      Я привел лишь функцию, которая на выходе дает вам три значения описанные выше. Я выводил немного топорно на своем сайте, без использования фильтров, напрямую в шаблон, но это не очень правильно, лучше делать всё через фильтры. Если не ошибаюсь за вывод подытога отвечает следующий фильтр:

      
      woocommerce_cart_subtotal
      
      Ответить
Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

PHP JS HTML CSS