Содержание
Как вывести плашку «NEW» для товаров, добавленных за последние 10 дней в uCoz
Задача
Необходимо, чтобы у товара в интернет-магазине автоматически появлялась плашка «NEW» (или «Новинка»), если товар был добавлен в течение последних 10 дней.
В день добавления метка должна появляться сразу, а на 11-й день — исчезать без ручных действий.
Почему простое вычитание не работает
Многие пробуют написать что-то вроде:
<?if(($DATE$ - $ADD_DATE$) <= 864000)?><span>New</span><?endif?>
Но это не работает, потому что $ADD_DATE$ — это строка в формате дд-мм-гггг (например, 23-10-2025), а не число.
Язык шаблонов uCoz умеет вычитать только числовые значения, поэтому даты нужно сначала разобрать на составляющие и привести к числу.
Как работает решение
Мы используем функции:
- substr() — чтобы вытащить из $ADD_DATE$ день, месяц и год;
- int() — чтобы преобразовать их в числа;
- стандартные переменные $DAY$, $MONTH$, $YEAR$ — чтобы получить текущую дату.
Дальше идёт три проверки:
-
Тот же месяц и год.
Разница между текущим днём и днём добавления ≤ 10. -
Соседний месяц.
Если товар добавлен в конце прошлого месяца, а сейчас уже новый — проверяем разницу через длину месяца (28–31 день) и високосные года. -
Переход декабря → январь.
Отдельная проверка для смены года.
Плюс отдельно учтены случаи, когда $ADD_DATE$ отображается словами «Сегодня» или «Вчера».
Готовое условие для шаблона
Код вставляется в шаблон списка товаров и карточки товара (в зависимости от дизайна):
<?if( ($ADD_DATE$='Сегодня' or $ADD_DATE$='Вчера') || ( int(substr($ADD_DATE$,6,4)) = $YEAR$ && int(substr($ADD_DATE$,3,2)) = $MONTH$ && $DAY$ - int(substr($ADD_DATE$,0,2)) >= 0 && $DAY$ - int(substr($ADD_DATE$,0,2)) <= 10 ) || ( int(substr($ADD_DATE$,6,4)) = $YEAR$ && $MONTH$ = int(substr($ADD_DATE$,3,2)) + 1 && $DAY$ + ( 31 - ( (int(substr($ADD_DATE$,3,2))=4) or (int(substr($ADD_DATE$,3,2))=6) or (int(substr($ADD_DATE$,3,2))=9) or (int(substr($ADD_DATE$,3,2))=11) ) - ( (int(substr($ADD_DATE$,3,2))=2) * (3 - ( (int(substr($ADD_DATE$,6,4))%400=0) or ( (int(substr($ADD_DATE$,6,4))%4=0) and (int(substr($ADD_DATE$,6,4))%100!=0) ) )) ) ) - int(substr($ADD_DATE$,0,2)) <= 10 ) || ( int(substr($ADD_DATE$,6,4)) + 1 = $YEAR$ && int(substr($ADD_DATE$,3,2)) = 12 && $MONTH$ = 1 && $DAY$ + 31 - int(substr($ADD_DATE$,0,2)) <= 10 ) )?> <span class="label new">⚡ NEW</span> <?endif?>
Как это работает на практике
- В день добавления (Сегодня) товар получает плашку ⚡ NEW.
- На следующий день (Вчера) — плашка остаётся.
- Затем каждый день идёт обратный отсчёт: 9, 8, 7, …
- После 10 дней с момента добавления метка автоматически исчезает.
Условие корректно работает для:
- всех 12 месяцев года,
- переходов между месяцами,
- високосных годов,
- смены года (декабрь → январь).
Пример использования
<div class="product-card"> <?if( ($ADD_DATE$='Сегодня' or $ADD_DATE$='Вчера') || (...) )?><span class="label new">⚡ NEW</span><?endif?> <img src="$PHOTO$" alt="$ENTRY_TITLE$"> <h3>$ENTRY_TITLE$</h3> <div class="price">$PRICE$ $CURRENCY$</div> </div>
Итого
✔ Метка появляется в день выгрузки
✔ Держится ровно 10 календарных дней
✔ Исчезает автоматически
✔ Работает для всех месяцев и годов
✔ Поддерживает даты вида «Сегодня» и «Вчера»
Лицензия: CC BY-SA 4.0
Автор: Юрий Герук
Комментарии