Задать вопрос
  • Как вывести общую сумму скидок в Woocommerce?

    @Mircek Автор вопроса
    UPD: проблему решила сама. Оставляю решение — вдруг у кого-то будет та же задача. В коде заменила

    . wc_price( $discount_total + $woocommerce->cart->discount_cart ) .

    на
    . wc_price( $woocommerce->cart->subtotal - $woocommerce->cart->total + $woocommerce->cart->shipping_total + $discount_total ) .
    .

    Что делает новая строка:
    $woocommerce->cart->subtotal - $woocommerce->cart->total — вычитаем из суммы всех товаров итоговую сумму заказа после применения всех скидок
    + $woocommerce->cart->shipping_total — добавляем стоимость доставки (если этого не сделать, то стоимость доставки вычтется из суммы сэкономленных денег)
    + $discount_total — добавляем сумму индивидуальных скидок на товары (если какой-то товар обычно стоит 1000 руб., но сейчас он на распродаже и стоит 800 руб., то эти 200 рублей тоже нужно учесть как сэкономленные).

    И добавляем условие выводить строку «Вы сэкономили: N руб.» только в том случае, если «сумма товаров + доставка» больше, чем «сумма заказа с учётом всех скидок + доставка» или если в заказе есть товар(ы) с индивидуальной скидкой.

    if ( $woocommerce->cart->subtotal + $woocommerce->cart->shipping_total > $woocommerce->cart->total + $woocommerce->cart->shipping_total || $discount_total > 0 )


    Весь готовый код выглядит так (вставлять в functions.php дочерней темы):

    function wc_discount_total_30() {
     
        global $woocommerce;
          
        $discount_total = 0;
          
        foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values) {
              
       $_product = $values['data'];
      
            if ( $_product->is_on_sale() ) {
            $regular_price = $_product->get_regular_price();
            $sale_price = $_product->get_sale_price();
            $discount = ($regular_price - $sale_price) * $values['quantity'];
            $discount_total += $discount;
            }
      
        }    
                
    if ( $woocommerce->cart->subtotal + $woocommerce->cart->shipping_total > $woocommerce->cart->total + $woocommerce->cart->shipping_total || $discount_total > 0 ) {
    	    
        echo '<tr class="cart-discount">
        <th>'. __( 'Вы сэкономили:', 'woocommerce' ) .'</th>
        <td data-title=" '. __( 'Saved', 'woocommerce' ) .' ">' 
        . wc_price( $woocommerce->cart->subtotal - $woocommerce->cart->total + $woocommerce->cart->shipping_total + $discount_total ) .'</td>
        </tr>';
    }    
     
    }
     
    // Hook our values to the Basket and Checkout pages
     
    add_action( 'woocommerce_cart_totals_after_order_total', 'wc_discount_total_30', 99);
    add_action( 'woocommerce_review_order_after_order_total', 'wc_discount_total_30', 99);


    Решение может быть не самое изысканное, но рабочее (проверено).
    Ответ написан
    Комментировать