Как настроить отображение товаров в нескольких категориях 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. Если же нужна полноценная связь многие-ко-многим, обратитесь к разработчику для установки специализированного компонента.

    Часто задаваемые вопросы