Как настроить отображение товаров в нескольких категориях miniShop2
Владельцы интернет-магазинов на MODX Revolution часто сталкиваются с задачей: один и тот же товар должен быть виден в двух или более категориях. Встроенными средствами miniShop2 это не реализовать напрямую, но существуют проверенные методы для решения этой проблемы. В этой статье мы подробно разберём, как сделать товары доступными в нескольких разделах каталога, используя штатные возможности и небольшие доработки.
Почему товар нельзя просто привязать к двум категориям?
Архитектура miniShop2 построена на связи «один товар - одна основная категория». Поле parent в ресурсе товара хранит ID только одной родительской категории. Это стандартное поведение MODX, и через админку изменить его нельзя. Однако существуют обходные пути, которые позволяют эмулировать множественную привязку.
Способ 1: Использование дополнительных полей (TV-параметры)
Самый простой метод без написания сложного кода - создать TV-параметр типа «Список категорий» (с мультивыбором). Затем в чанке вывода товара или в сниппете msProducts добавить фильтрацию по этому параметру. Например, вы создаёте TV additional_categories и в нужных категориях выводите товары, у которых в этом поле указан ID текущей категории.
[[!msProducts?
&parents=`0`
&tvFilters=`additional_categories==[[*id]]`
&showUnpublished=`0`
&limit=`12`
]]Этот подход не требует правок ядра и подходит для небольших магазинов.
Способ 2: Дублирование товаров с уникальными ID
Если вам нужно, чтобы товар физически находился в двух категориях (например, для разных ЧПУ), можно создать копию товара. Но это ведёт к дублированию контента и проблемам с учётом остатков. Рекомендуется только для статических товаров без отслеживания количества.
Способ 3: Кастомный сниппет через getResources
Более гибкий вариант - написать свой сниппет, который собирает товары из нескольких категорий. Используйте getResources или pdoResources, указав в параметре &parents ID нескольких категорий через запятую. Пример для pdoResources:
[[!pdoResources?
&parents=`2,5,8`
&class=`msProduct`
&limit=`10`
&tpl=`tpl.product.row`
]]Такой подход выводит товары сразу из нескольких разделов, но не меняет основную категорию.
Способ 4: Расширение через ms2Gallery или mSearch2
С помощью mSearch2 можно настроить индексацию товаров по дополнительным полям и выводить их в результатах поиска, имитируя множественную категоризацию. Также существуют сторонние компоненты, например msMultiCat, которые добавляют связь многие-ко-многим, но они требуют установки и настройки.
Практические рекомендации
- Для простых магазинов используйте TV-параметр с фильтрацией - это безопасно и быстро.
- Для крупных каталогов рассмотрите установку msMultiCat или написание кастомного расширения.
- Не дублируйте товары без острой необходимости - это усложняет управление и SEO.
- Тестируйте на staging-сервере перед внедрением на боевой сайт.
Заключение
Хотя miniShop2 не позволяет штатно привязать товар к нескольким категориям, существуют эффективные обходные пути. Выберите метод, который соответствует вашему уровню подготовки и требованиям проекта. В большинстве случаев достаточно TV-параметра или использования pdoResources. Если же нужна полноценная связь многие-ко-многим, обратитесь к разработчику для установки специализированного компонента.