Есть небольшой опыт разработки ИМ, сделали клиентам магазин на ≈600 товаров на wp+woocommerce, работает более-менее нормально, но теперь они хотят нечто похожее, но с намного большим количеством товаров. Есть опасения что у woocommerce будут проблемы потому что данные хранятся не оптимально и ядро генерирует очень много запросов к бд.
Нужно подобрать cms которая бы максимально подходила по некоторым требованиям:
Около 1000 товаров на старте и постепенно увеличение до 10-20 тыс.
Сотни категорий, большое количество вариаций по 1-3 атрибутам, 20-30 атрибутов у каждого товара, атрибуты разные у разных групп товаров.
Адекватные возможности для кастомизации. То есть если нужно добавить куда то на страницу ссылку на корзину с количеством товаров, то должна быть возможность через api получить количество и ссылку и потом вывести их в нужном месте в шаблоне, а не подключать для этого плагин который выводит корзину в определенном месте. Или вывести на странице чекаута только нужные поля и создать заказ на основе их.
Хорошее внутреннее api, какая-нибудь обертка вокруг запросов, возможно orm.
Система событий/хуков/чего-то ещё для модификации поведения из своего кода, не трогая ядро и те части которые будут обновляться.
Возможность безболезненного расширения объектов дополнительными полями, например добавить какой-нибудь флаг, вывести его чекбоксом в админке и получить на фронтэнде, возможность создать страницу с настройками для админки , например с номерами телефонов, адресами и т.д.
Возможность вывода товаров разных категорий разными шаблонами.
Новости и статичные страницы, разные шаблоны для статичных страниц.
Нормальные стандартные модули магазина: кабинет пользователя, акции, импорт, кэширование, чпу, работа с сео, разграничение прав, фильтры и т.д.
Возможность интеграции с системой учета, crm, работа с количеством товара.
Тема будет делаться своя, потому что заказчики со временем потребует изменений практически всего, но есть возможность тратить достаточно много денег на плагины.
Есть немного опыта с laravel и octoberCms, но фреймворки для основы брать не хочется, потому что тот функционал что уже есть в CMS скорее всего придется писать с нуля, а опыта чтобы сделать это хорошо не хватит. Да и найти людей для возможных доработок будет проще с cms. Битрикса по понятным причинам хочется избежать, неспециализированные cms типа WP и Joomla тоже. С magento как я понял будет тратиться намного больше средств на хостинг, администрирование, разработку и плагины, плюс в бесплатной редакции урезаны возможности.
Подойдет ли для такого opencart или prestashop? Возможно есть другие варианты?
предварительно - не OpenCart, там тоже многоязычность и многомагазинность сильно усложняют запросы. На 100к товаров с минимальньым набором параметров уже было всё довольно плохо, но спасало кэширование в клиентской части. В админке - не спасало.
SELECT p.product_id,
(SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating,
(SELECT price FROM product_discount pd2
WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '$config_customer_group_id'
AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW())
AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount,
(SELECT price FROM product_special ps
WHERE ps.product_id = p.product_id AND ps.customer_group_id = '$config_customer_group_id'
AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW())
AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special
FROM product p
LEFT JOIN product_description pd ON (p.product_id = pd.product_id)
LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id)
WHERE pd.language_id = '$config_language_id' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '$config_store_id'
GROUP BY p.product_id
Это базовый запрос на получение продуктов, без дополнительных фильтров, которые еще больше усложняют запрос.
Чтобы отвинтить многоязычность и многомагазинность надо будет править (делал):
1. модель товара в клиенте и админке
2. экранные формы клиента и админки
3. логику корзины, там тоже встречалось.
Я выкинул из этого запроса product_to_store, а текст описания перетащил из product_description в product.
Получилось крайне неплохо по скорости.
В итоге за денёк можно это всё отвинтить, но это вмешательство в ядро, так что обновления потом будут сложнее - руками накатывать в случае разницы и некоторые плагины могут себя неправильно вести.
DELETE FROM product WHERE product_id = '$product_id';
DELETE FROM product_attribute WHERE product_id = '$product_id';
DELETE FROM product_description WHERE product_id = '$product_id';
DELETE FROM product_discount WHERE product_id = '$product_id';
DELETE FROM product_filter WHERE product_id = '$product_id';
DELETE FROM product_image WHERE product_id = '$product_id';
DELETE FROM product_option WHERE product_id = '$product_id';
DELETE FROM product_option_value WHERE product_id = '$product_id';
DELETE FROM product_related WHERE product_id = '$product_id';
DELETE FROM product_related WHERE related_id = '$product_id';
DELETE FROM product_reward WHERE product_id = '$product_id';
DELETE FROM product_special WHERE product_id = '$product_id';
DELETE FROM product_to_category WHERE product_id = '$product_id';
DELETE FROM product_to_download WHERE product_id = '$product_id';
DELETE FROM product_to_layout WHERE product_id = '$product_id';
DELETE FROM product_to_store WHERE product_id = '$product_id';
DELETE FROM product_recurring WHERE product_id = '$product_id';
DELETE FROM review WHERE product_id = '$product_id';
DELETE FROM seo_url WHERE query = 'product_id=$product_id';
DELETE FROM coupon_product WHERE product_id = '$product_id';
вот связанные таблицы вокруг продукта. Да. Гибко. Не всегда быстро. Складывал до миллиона товаров - автозапчасти, минимум характеристик.