Aw: Метод getCategory - определение (и фиксация) основной категории товара и мультикатегорийность
Повторю пример из видео. К примеру, у нас категории:
- Авто (id 1)
- - Лада (ВАЗ) (id 53)
- - Мерседес (id 3)
- Семейные автомобили (id 4)
Здесь смысл категорий не важен )) У меня товар "Лада калина", которая должна быть в основной категории "Лада (ВАЗ)" и в дополнительной категории "Семейные автомобили", потому что это универсал. И здесь же в соседней категории мы продаём Mercedes-Benz All-Terrain E-класса. У него основная категория должна быть "Мерседес" и второстепенная "Семейные автомобили", потому что кузов универсал.
Url Лады калины всегда по всему сайту должен быть:
site.com/avto/lada-vaz/lada-kalina
Url Мерседеса E-класса всегда по всему сайту должен быть:
site.com/avto/mercedes/mercedes-benz-all-terrain-e-class
Даже когда я перехожу в категорию "Семейные автомобили", я должен увидеть там 2 товара с url
site.com/avto/lada-vaz/lada-kalina и
site.com/avto/mercedes/mercedes-benz-all-terrain-e-class соответственно. Эта категория отображает товары как сущности тегов (кстати, com_tags есть же, там всё уже сделано). А значит у меня на сайте не должно быть товара
site.com/semeinye-adtomobili/lada-vaz/lada-kalina.. Иначе на сайте возникают кучи дублей товаров, так как они доступны по сути по любым url.
Как это завязано на id категорий (речь о сторонних расширениях).
Если я с помощью $product->getCategory() получаю id категории, то из-за использования $db->loadResult() для Лады Калины будет приходить category_id = 4 (так как он меньше 53), а для Мерседеса category_id = 3 (так как он меньше 4). И в итоге основной категорией для Лады Калины окажется "Семейные автомобили".
Сортировка в SQL-запросе здесь не спасёт ситуацию, так как она изменит приходящие в ответе id, но не изменит логику работы.
Находясь в пределах джумшоппинга может быть и есть шанс получить правильный url (нет, видео в конце поста показывает), но если я вставляю плагином товар(ы) в com_content? Какая-нибудь статья о том "Что подарить мужу на Новый 2023 год"? Такие разделы часто ведутся в магазинах, которые собирают органический трафик по инфо-запросам. И там будет ссылка на товар с неверным по смыслу url. Да, он будет открываться, но по логике вещей товар должен находится совершенно в другом месте. А потом я вдруг решил создать новую категорию "Универсалы", убрать из "семейных" калину. У новой категории id будет 240 и тогда все ссылки на этот товар по всему сайту изменятся на то, что нужно было в самом начале, так как 53 меньше 240.
Решением проблемы может быть (имхо) лишь добавление отдельного поля в админке в форму редактирования/создания товара для указания основной (канонической) категории товара и коррекция структуры базы данных.
Вариант 1-й - добавить столбец category_id в #__jshopping_products. Туда пишем каноническую категорию, остальные (или все, не так важно) пишем как писали в #__jshopping_products_to_categories.
Вариант 2-й - добавить столбец в #__jshopping_products_to_categories что-то вроде canon_category или main_category, куда пишется каноническая категория, остальные - как было. И соответственно в моделях и Tables проверять наличие этого признака.
1-й вариант удобнее при обновлении: можно юзеру показать кнопку в админке и описание проблемы, а в php-скрипте циклом пройтись по всем товарам, брать тот же $product->getCategory и писать в таблицу товаров. Ситуация на фронте сайта сохранится та же самая, что и до обновления. Поле в этом столбце не должно быть пустым. Если товаров несколько (десятков) тысяч, то можно разбивать их на порции и постепенно обрабатывать, делая выборку товаров, где до сих пор пустое поле нового столбца.
Со вторым вариантом хранения id основной категории мне это видится сложнее. Но это уже детали реализации.
Видео про дубли товаров
https://cloud.mail.ru/public/VvHM/5mZK8LNk3
Joomla developer. https://web-tolk.ru JoomShopping Bitrix24 integration, custom developing.