WooCommerce — худшее решение для магазина
WooCommerce начинает невероятно тормозить уже около 500 товаров: база на postmeta огромная и неоптимизированная. WordPress и так медленный движок. Поможем перейти на нормальную CMS или быстрый фреймворк.
WooCommerce — худшее решение для магазина. Его ставят, потому что «это просто плагин к WordPress», а потом каталог упирается в потолок. Магазин невероятно тормозит, как только число товаров приближается к 500. Дальше каждая новая карточка делает хуже и витрину, и админку.
Почему 500 товаров уже много
Пятьсот простых карточек звучат скромно. Для WooCommerce это не пятьсот строк в таблице товаров. Каждая карточка — запись в wp_posts плюс десятки строк в wp_postmeta: цена, остаток, артикул, вес, габариты, картинки, атрибуты. Вариативный товар умножает это на число вариантов: цвет и размер превращаются в отдельные записи и ещё одну пачку мета-полей.
Каталог, фильтр, сортировка по цене и блок «похожие товары» собираются запросами к этой куче. Пока товаров мало, MySQL успевает. Ближе к 500 карточкам, особенно с вариациями и фильтрами, запросы раздуваются: база перебирает мета-поля вместо того, чтобы читать нормальную таблицу товаров. Страница категории открывается секундами, админка при сохранении карточки тоже.
База огромная и не под магазин
У нормального магазина есть таблицы товаров, цен, остатков и заказов со своими индексами. У WooCommerce ядро каталога — универсальные таблицы WordPress, придуманные под посты блога.
- 01wp_posts хранит и статьи, и товары, и вариации, и вложения. Тип записи — просто метка, а не отдельная схема.
- 02wp_postmeta — длинный список «ключ — значение». Цена, склад и артикул лежат здесь же, рядом с настройками каких угодно плагинов. Индекс по такому устройству плохо помогает фильтру «красные кроссовки до 5 000».
- 03Категории и атрибуты сидят в таблицах таксономий. Фильтр по двум свойствам — это ещё несколько соединений.
- 04Заказы, сессии корзины, задачи Action Scheduler и транзиенты дописывают свои таблицы и раздувают базу даже после того, как витрину почистили.
- 05Служебные lookup-таблицы WooCommerce появились позже как заплатка: ядро само признало, что по
postmetaкаталог не ищется. Заплатка не превращает блоговую схему в складскую.
В итоге база выглядит огромной уже на небольшом ассортименте. В ней мало полезных строк и много повторов одной и той же карточки, разрезанной на десятки записей. Оптимизировать это точечно почти нечем: структура не про товары.
WordPress и так тормозной
WooCommerce не стоит на быстром движке. WordPress на каждый запрос заново поднимает ядро и все плагины — об этом статья как ускорить сайт на WordPress. Если вместо сайта уже белый экран — что делать при критической ошибке. Магазин добавляет сверху сессию корзины, пересчёт цен, остатки и скрипты витрины, и всё это открывается даже на страницах, где человек ничего не покупает.
Зачем пользоваться связкой, в которой медленный движок плюс магазин, собранный как плагин к блогу? Кэш страниц чуть скрывает витрину для гостя. Корзина, фильтры, личный кабинет и админка снова гоняют всю эту базу. Плагин кэша не перепишет схему таблиц.
Куда переходить
Напишите нам — поможем уйти с WooCommerce на нормальную CMS или на быстрый фреймворк.
- 01Нормальная CMS для магазина — OpenCart: товары, цены и остатки лежат в своих таблицах, а не в мета-полях записей блога.
- 02Быстрый фреймворк — Nuxt, Next или Laravel. Каталог и корзина делаются под ваш ассортимент, на запрос не стартует стопка плагинов WordPress.
Заберём карточки, адреса и редиректы, чтобы поиск не потерял категории. Как проходит перенос — на странице перенос сайта. Опишите магазин в заявке: сколько товаров и вариаций, и скажем, на чём его собирать.