Как исключить родительский товар из похожих в pdoPage
При выводе похожих товаров в карточке через pdoPage (или pdoResources) часто возникает ситуация, когда в списке отображается сам родительский товар. Это происходит, потому что запрос по умолчанию выбирает все ресурсы, включая текущий. Разберём, как настроить сниппет, чтобы исключить родительский элемент.
Почему родительский товар попадает в список
Параметр &parents задаёт ID ресурса, из которого выбираются дочерние элементы. Если указать &parents=[[+id]], то pdoPage будет искать товары, находящиеся внутри текущего ресурса. Однако сам текущий ресурс (родитель) тоже может быть выбран, если он не является контейнером или если его ID совпадает с одним из дочерних. Проблема усугубляется, когда у родительского товара нет дочерних - тогда в списке появится только он сам.
Основное решение: параметр &showHidden
Самый простой способ исключить родительский товар - установить &showHidden=`0` (по умолчанию 1). Этот параметр управляет отображением скрытых ресурсов. Если родительский товар не помечен как скрытый, этот метод не сработает. В таком случае используйте фильтрацию через &where.
Использование &where для исключения ID
Добавьте в вызов сниппета условие, которое исключает текущий ресурс по его ID. Например:
&where=`{"id:!=":[[+id]]}`Этот фильтр гарантирует, что товар с ID, равным текущему, не попадёт в выборку. Полный код будет выглядеть так:
[[!pdoPage?
&parents=`[[+id]]`
&element=`msProducts`
&depth=`0`
&tpl=`tpl.msProducts`
&includeTVs=`1`
&includeContent=`1`
&sortby=`menuindex`
&sortdir=`ASC`
&where=`{"id:!=":[[+id]]}`
]]Альтернативные методы фильтрации
Если вы используете pdoResources вместо msProducts, принцип тот же. Для msProducts также можно ограничить выборку по классу товара или по дополнительным полям через &tvFilters. Например, исключить товары с определённым значением ТВ-параметра:
&tvFilters=`featured==1`Проверка на наличие дочерних товаров
Иногда родительский товар выводится, потому что у него нет дочерних. Убедитесь, что в категории есть хотя бы один товар. Если категория пуста, pdoPage выведет сам родительский ресурс. В таких случаях используйте &showUnpublished=`0` и &showDeleted=`0` для дополнительной фильтрации.
Рекомендации по SEO-оптимизации вывода
Для улучшения ранжирования страницы с похожими товарами используйте уникальные заголовки и мета-описания для каждого товара. Убедитесь, что ссылки на похожие товары ведут на правильные URL, а в тексте анкоров используются ключевые слова. Также добавьте микроразметку Product для каждого товара в списке.
Если вы используете пагинацию через pdoPage, настройте канонические URL и заголовки для страниц 2+.