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);
Решение может быть не самое изысканное, но рабочее (проверено).