
🔄 Шорткод недавно просмотренных товаров WooCommerce: готовый код и настройка
Посетитель заходит в магазин, просматривает пять товаров, закрывает вкладку, и через минуту забывает о сайте. Знакомая картина для любого владельца WooCommerce. Блок «вы недавно смотрели» решает эту проблему: один клик по знакомой карточке возвращает посетителя обратно в воронку.
WooCommerce из коробки пишет ID просмотренных товаров в куку woocommerce_recently_viewed. Эти данные уже лежат на сервере вашего магазина, для них не нужен отдельный плагин отслеживания. Остаётся прочитать куку и вывести товары. Ниже, готовый шорткод, который делает это за 30 строк современного PHP.
💡 Быстрый обзор:
- Поймите, как WooCommerce хранит просмотры в cookie, один короткий абзац теории
- Скопируйте шорткод
[recently_viewed_products]вfunctions.phpдочерней темы или Code Snippets - Разместите блок на странице корзины, в сайдбаре товара или после пустого поиска, и возвращайте посетителей
Как WooCommerce хранит историю просмотров
Когда посетитель открывает страницу товара, WooCommerce silently дописывает ID этого товара в куку woocommerce_recently_viewed. Формат: строка с разделителем |, например 123|456|789. Самая старая запись слева, самая свежая справа. Кука сессионная: живёт до закрытия браузера.
Нам не нужно писать свой трекинг просмотров. WooCommerce уже собирает данные. Задача шорткода: прочитать строку, разбить на ID, отфильтровать только существующие и опубликованные товары и отдать их встроенному механизму [products].
Такой подход даёт нативную вёрстку WooCommerce: адаптивную сетку, учёт остатков и цен, кнопку «В корзину», всё, что умеет штатный шорткод [products], без повторной реализации шаблона вывода.
Готовый код: шорткод [recently_viewed_products]
Добавьте этот код в functions.php дочерней темы или через плагин Code Snippets. Он регистрирует шорткод [recently_viewed_products] с двумя параметрами: per_page и columns.
1 /** 2 * Shortcode: [recently_viewed_products per_page="5" columns="4"] 3 * 4 * Displays products recently viewed via the native WooCommerce cookie. 5 * Uses the built-in [products] shortcode for rendering — no custom WP_Query. 6 */ 7 add_shortcode( 'recently_viewed_products', 'sd_recently_viewed_products' ); 8 9 function sd_recently_viewed_products( $atts ) { 10 $atts = shortcode_atts( array( 11 'per_page' => 5, 12 'columns' => 4, 13 ), $atts ); 14 15 // Read the WooCommerce cookie 16 $cookie = ! empty( $_COOKIE['woocommerce_recently_viewed'] ) 17 ? wp_unslash( $_COOKIE['woocommerce_recently_viewed'] ) 18 : ''; 19 20 if ( empty( $cookie ) ) { 21 return '<p>' . esc_html__( 'You have not viewed any products yet.', 'textdomain' ) . '</p>'; 22 } 23 24 // Parse and sanitize product IDs 25 $viewed_ids = array_filter( array_map( 'absint', explode( '|', $cookie ) ) ); 26 27 if ( empty( $viewed_ids ) ) { 28 return ''; 29 } 30 31 // Keep only the N most recent items (oldest first in cookie, so slice from start) 32 $viewed_ids = array_slice( $viewed_ids, 0, (int) $atts['per_page'] ); 33 34 $ids_string = implode( ',', $viewed_ids ); 35 36 return '<h3>' . esc_html__( 'Recently Viewed Products', 'textdomain' ) . '</h3>' 37 . do_shortcode( 38 "[products ids=\"$ids_string\" columns=\"{$atts['columns']}\" orderby=\"post__in\"]" 39 ); 40 }
Куда вставлять код
**Дочерняя тема **functions.php, лучший вариант. Код переживает обновления родительской темы и хранится в системе контроля версий вместе с остальной кастомизацией сайта.
Плагин Code Snippets, если дочерней темы нет. Установите Code Snippets на WordPress.org из каталога, создайте новый сниппет, вставьте код и активируйте. Работает с любой темой.
Не вставляйте код в functions.php родительской темы: потеряете при первом же обновлении.
Построчный разбор
shortcode_atts()сливает пользовательские параметры с дефолтами, стандартная функция WordPress для обработки атрибутов шорткода. В отличие от устаревшегоextract(), она не создаёт переменные из массива и не засоряет область видимости.wp_unslash()убирает экранирующие слеши из значения куки, стандартная практика при чтении суперглобалов в WordPress.explode('|', ...)разбивает строку123|456|789на массив строковых ID.array_map('absint', ...)превращает каждый ID в целое неотрицательное число, защита от мусора в куке.array_filter()выкидывает нули и пустые значения: товары, которых больше нет в базе, исключаются на уровне ID.array_slice()оставляет только N последних просмотров. Кука пишет старые ID первыми, свежие последними, поэтому обрезаем с начала массива.implode(',', ...)собирает строку123,456,789для параметраidsвстроенного шорткода.do_shortcode('[products ids="..."]')запускает родной механизм WooCommerce: миниатюры, названия, цены, кнопка «В корзину», всё в стандартной вёрстке темы. Товарыout of stockавтоматически не показываются.
Не нужно вручную собирать <ul><li><a>.... Встроенный [products] уже умеет всё это и обслуживается командой WooCommerce.
Как использовать шорткод: параметры и примеры
Разместите [recently_viewed_products] в любом месте, где WordPress обрабатывает шорткоды: страница, запись, текстовый виджет, блок Shortcode в редакторе.
Параметр | По умолчанию | Назначение |
|---|---|---|
|
| Сколько товаров показать |
|
| Число колонок в сетке |
Примеры:
[recently_viewed_products per_page="3" columns="3"], компактная строка из трёх товаров для сайдбара[recently_viewed_products per_page="8" columns="4"], два ряда по четыре товара для страницы корзины
Если посетитель ещё не смотрел ни одного товара, шорткод выводит нейтральное сообщение «You have not viewed any products yet», его можно заменить на свой текст в строке с esc_html__().
На практике настройка занимает три минуты. В видео выше, пошаговый разбор работы с шорткодами WooCommerce и их размещения на сайте.
Где разместить шорткод: что работает

Страница корзины, самое сильное место. Посетитель уже собрал товары, но перед оформлением видит напоминание о том, что смотрел раньше. Для магазинов с 50+ товарами это возвращает заметную часть брошенных просмотров обратно в корзину.
Сайдбар страницы товара. Покупатель сравнивает несколько моделей, блок «вы смотрели» держит альтернативы перед глазами. Особенно хорошо работает в магазинах электроники и одежды, где сравнение является частью процесса выбора.
После пустого поиска. Лучший fallback: «Ничего не нашли, но вот что вы проверяли раньше». Вместо пустой страницы посетитель видит знакомые товары и с большей вероятностью остаётся на сайте.
Добавьте шорткод в текстовый виджет сайдбара или через блок Shortcode в редакторе Gutenberg. В хуки темы (woocommerce_after_cart, woocommerce_before_shop_loop), только если уверенно редактируете шаблоны.
⁉️🤔 Частые вопросы
Работает ли шорткод с кешированием?
Шорткод зависит от PHP-куки
woocommerce_recently_viewed, которая читается на стороне сервера. Если страница кешируется на уровне HTTP (через Varnish, NGINX FastCGI Cache или плагин вроде WP Rocket), контент шорткода тоже закешируется, и один посетитель может увидеть «чужие» просмотренные товары. Решение: исключите страницы с шорткодом из кеша либо подключите WooCommerce-совместимый режим кеширования (ESI или фрагментное кеширование).
Можно ли вывести просмотренные товары без шорткода, через хук?
Да. Функция
sd_recently_viewed_products()возвращает строку, её можно вызвать напрямую в любом хуке темы:echo sd_recently_viewed_products( array( 'per_page' => 4 ) );. Подойдут хукиwoocommerce_after_cart,woocommerce_after_single_productиwoocommerce_before_shop_loop. Учитывайте кеширование, если страница кешируется целиком.
Сколько товаров хранится в куке?
По умолчанию WooCommerce хранит ID последних 10 просмотренных товаров. Это задаётся в коде WooCommerce и не настраивается через интерфейс. Шорткод через параметр
per_pageопределяет, сколько из этих 10 показывать.
Чем этот подход лучше отдельного плагина?
Код из 30 строк не добавляет лишних запросов к базе, используется та же кука, которую WooCommerce уже записала. Отдельный плагин часто тянет свой механизм отслеживания (дополнительные cookie, JS-события, таблицы в базе). Для типового магазина шорткод покрывает сценарий полностью, без раздувания админки.
Почему используется [products], а не свой WP_Query?
Встроенный
[products]даёт адаптивную сетку темы, цены, кнопку «В корзину», учёт остатков и статусаout of stock, бесплатно. При ручномWP_Queryпришлось бы всё это реализовывать заново и поддерживать при обновлениях WooCommerce.
Шорткод за 30 строк: стоит ли оно того
Кука woocommerce_recently_viewed, это данные, которые ваш магазин уже собирает. Шорткод из 30 строк превращает их в работающий блок «вы недавно смотрели» без плагинов и лишних запросов к базе.
- Если у вас магазин на 50+ товаров, разместите шорткод на странице корзины и попробуйте A/B-тест с контрольной группой без блока.
- Если используете агрессивное кеширование, исключите страницу с шорткодом или подключите фрагментное кеширование.
- Если посетитель не смотрел товары, шорткод молча выводит нейтральное сообщение и не ломает вёрстку.
Добавьте [recently_viewed_products] на свой сайт и проверьте в инкогнито-окне браузера: откройте пару товаров, затем зайдите на страницу с шорткодом. Если блок показывает не то, что вы смотрели, проверьте настройки кеширования, скорее всего причина в них. Какой способ вывода просмотренных товаров используете вы, шорткод, плагин или хук темы? Напишите в комментариях.



