Как вывести плашку «NEW» для товаров в uCoz

Юрий Герук 2025-11-14 21

Содержание

    Как вывести плашку «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$ — чтобы получить текущую дату.

    Дальше идёт три проверки:

    1. Тот же месяц и год.
      Разница между текущим днём и днём добавления ≤ 10.
    2. Соседний месяц.
      Если товар добавлен в конце прошлого месяца, а сейчас уже новый — проверяем разницу через длину месяца (28–31 день) и високосные года.
    3. Переход декабря → январь.
      Отдельная проверка для смены года.

    Плюс отдельно учтены случаи, когда $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

     

    Автор: Юрий Герук

    Комментарии