Przy każdej obniżce ceny trzeba podać informację o najniższej cenie tego towaru z ostatnich trzydziestu dni przed wprowadzeniem obniżki. Nie o cenie regularnej, nie o cenie sprzed tygodnia i nie o tej przekreślonej, którą pokazuje motyw.
To rozróżnienie wygląda na drobiazg, dopóki nie zrobisz drugiej promocji w ciągu miesiąca. Wtedy robi się z niego problem.
Przekreślona cena to nie to samo
WooCommerce ma dwa pola: cenę regularną i promocyjną. Przekreślona cena na karcie produktu to po prostu cena regularna - czyli to, ile produkt kosztuje dziś poza promocją. Najniższa cena z 30 dni to zapis historyczny: ile produkt kosztował najmniej w konkretnym oknie czasu.
Te dwie liczby bywają równe i wtedy nikt nie widzi problemu. Rozjeżdżają się w momencie, w którym cena regularna się zmieniła albo była już wcześniej obniżona.
Historię trzeba zapisywać, zanim będzie potrzebna
Najniższej ceny z trzydziestu dni nie da się odtworzyć po fakcie. WooCommerce nie przechowuje historii cen - zmieniasz pole, stara wartość przepada. Jeśli zaczniesz zapisywać ją dopiero w dniu promocji, pierwsze trzydzieści dni będziesz zgadywać.
Zapis warto podpiąć pod moment faktycznej zmiany ceny, a nie pod każdy zapis produktu:
add_action( 'woocommerce_update_product', function ( $product_id, $product ) {
$poprzednia = get_post_meta( $product_id, '_cena_ostatnio', true );
$obecna = $product->get_price();
// Wiersz dopisujemy tylko przy zmianie. Inaczej każdy zapis produktu -
// także zmiana opisu czy zdjęcia - dokłada do tabeli kopię tej samej ceny.
if ( '' !== $obecna && (string) $poprzednia !== (string) $obecna ) {
tw_zapisz_cene( $product_id, (float) $obecna );
update_post_meta( $product_id, '_cena_ostatnio', $obecna );
}
}, 10, 2 );
Warianty mają własne ceny, więc potrzebują własnych wierszy. Produkt zmienny bez historii wariantów pokaże najniższą cenę „od”, która nie odpowiada żadnemu realnie kupowalnemu wariantowi.

Pułapka: druga obniżka w trakcie promocji
To jest miejsce, w którym sklepy mylą się najczęściej - i jedyne, w którym pomyłka wygląda jak sprytny zabieg.
Wyobraź sobie taki przebieg:
| Kiedy | Cena |
|---|---|
| 60 dni temu | 79 zł |
| 40 dni temu | 69 zł |
| dziś | promocja 49 zł |
Poprawna odpowiedź to 69 zł. Cena 79 zł wypadła poza okno trzydziestu dni, więc nie jest już punktem odniesienia.
A teraz ważniejsze: jeśli w trakcie trwającej promocji zejdziesz z 49 zł na 39 zł, punkt odniesienia się nie przesuwa. Nadal jest nim 69 zł. Przyjęcie, że po tygodniu promocji najniższą ceną z 30 dni staje się 49 zł, pozwalałoby schodzić z ceną co tydzień i za każdym razem pokazywać coraz niższą „najniższą cenę” - czyli dokładnie to, czemu przepis miał zapobiec.
Jak to sprawdzić u siebie
Weź jeden produkt, który miał w tym kwartale dwie promocje, i prześledź jego ceny z kalendarzem w ręku. Jeśli liczba na karcie produktu zgadza się z tą, którą wyliczyłeś ręcznie, mechanizm działa. Jeśli pokazuje cenę regularną - nie liczy historii, tylko przepisuje pole.
Gdzie to pokazać
Informacja ma być przy cenie, w miejscu, w którym klient podejmuje decyzję: na karcie produktu i wszędzie tam, gdzie obok ceny promocyjnej stoi przekreślona cena regularna. Jeśli promocje pokazujesz też na listingu kategorii, wiersz powinien być i tam.
Szare, małe i pod ceną to w zupełności wystarczy - chodzi o to, żeby informacja była, a nie żeby krzyczała.
Czego ten wpis nie rozstrzyga
Nie jest to porada prawna. Są sytuacje graniczne - produkty nowe w sklepie krócej niż trzydzieści dni, towary szybko psujące się, programy lojalnościowe i kody rabatowe przypisane do konta - w których odpowiedź zależy od szczegółów, a te warto omówić z prawnikiem swojego sklepu.
Techniczną stronę, czyli tabelę historii cen, liczenie okna i gotowy wiersz pod ceną, mamy spakowane w Komplecie zgodności sklepu. Jeśli wolisz napisać to sam, powyższe trzy akapity o drugiej obniżce są najważniejszą częścią zadania.
Nowa wtyczka? Dowiesz się pierwszy.
Premiery, poradniki i promocje - raz na jakiś czas, bez zasypywania skrzynki.