Представьте: вы запустили интернет-магазин на WooCommerce, заказы пошли, всё работает. А потом менеджер просит «быстро выгрузить все заказы за квартал с именами клиентов и названиями товаров». Или сайт начал подтормаживать, и хостер говорит — «смотрите, таблица wp_postmeta раздулась до 2 ГБ». Или вы решили переехать на новую тему, а старые заказы вдруг стали отображаться криво.
Все эти ситуации — про одно и то же: база данных WooCommerce. И если вы хотя бы примерно понимаете, как она устроена, многие проблемы перестают быть пугающими. Давайте разберёмся — без воды, но и без излишнего занудства.
Почему владельцам магазина вообще стоит знать про базу данных
Не буду убеждать вас стать программистом. Но вот три причины, по которым базовое понимание структуры WooCommerce пригодится:
- Диагностика проблем. Когда сайт тормозит или данные теряются, понимание структуры помогает объяснить задачу разработчику и не платить за «разведку» лишние часы.
- Миграция и бэкапы. Переезд на другой хост, резервное копирование, синхронизация с CRM — всё это напрямую связано с тем, как данные лежат в базе.
- Интеграции. Подключение 1С, складского учёта, аналитики — разработчик будет работать именно с таблицами, и полезно хотя бы на уровне «это таблица заказов, а это — товаров».
WooCommerce хранит данные в базе MySQL (или MariaDB), которую использует WordPress. При установке плагин создаёт несколько дополнительных таблиц, а часть данных записывает в уже существующие таблицы WordPress. Именно эта «двухслойная» архитектура часто вызывает путаницу.
Общая картина: на чём держится WooCommerce
Стандартный WordPress работает примерно с 11 таблицами. WooCommerce добавляет к ним ещё несколько — но не так много, как можно было бы ожидать. Вся «магия» происходит за счёт гибкого (и местами чересчур гибкого) механизма метаданных.
Если совсем просто: WordPress хранит контент в таблице wp_posts, а дополнительные свойства — в таблице wp_postmeta. WooCommerce пошёл тем же путём. Товар — это «пост особого типа», заказ — тоже «пост особого типа», а все характеристики (цвет, размер, цена, статус оплаты) — это «мета-данные».
Это удобно с точки зрения разработки, но создаёт определённые последствия для производительности. Но об этом — чуть позже.
Основные таблицы WooCommerce
При активации WooCommerce в базе данных создаются следующие таблицы (префикс по умолчанию — wp_, но на вашем сайте он может быть другим):
| Таблица | Назначение |
|---|---|
wp_woocommerce_sessions |
Сессии покупателей: корзина, просмотренные товары, временные данные |
wp_woocommerce_api_keys |
API-ключи для доступа к REST API (интеграции, мобильные приложения) |
wp_woocommerce_attribute_taxonomies |
Глобальные атрибуты товаров (цвет, размер, материал) |
wp_woocommerce_downloadable_product_permissions |
Права на скачивание цифровых товаров |
wp_woocommerce_order_items |
Состав заказов: какие товары включены |
wp_woocommerce_order_itemmeta |
Детали позиций заказа: цена, количество, скидка |
wp_woocommerce_payment_tokens |
Токены платёжных систем (для повторных оплат) |
wp_woocommerce_payment_tokenmeta |
Метаданные платёжных токенов |
wp_woocommerce_log |
Логи отладки WooCommerce |
wp_wc_webhooks |
Настройки вебхуков (уведомления внешних систем) |
wp_wc_download_log |
Журнал скачиваний цифровых товаров |
wp_wc_product_meta_lookup |
Быстрый поиск по цене, рейтингу, количеству продаж |
wp_wc_tax_rate_classes |
Классы налоговых ставок |
wp_woocommerce_tax_rates |
Сами налоговые ставки |
wp_woocommerce_tax_rate_locations |
Привязка налоговых ставок к локациям |
Звучит много, но на практике вас как владельца магазина волнуют в первую очередь три вещи: товары, заказы и покупатели. Давайте посмотрим, где они живут.
Где хранятся товары WooCommerce
Вот тут начинается самое интересное. WooCommerce не создал отдельную таблицу для товаров. Товары — это записи в стандартной таблице WordPress wp_posts с типом product (простой товар) или product_variation (вариация товара).
Все свойства товара лежат в wp_postmeta:
_price— цена- _regular_price — обычная цена
- _sale_price — цена со скидкой
- _sku — артикул
- _stock — остаток
- _stock_status — статус наличия (in stock / out of stock)
- _weight, _length, _width, _height — физические параметры
- _thumbnail_id — ID главного изображения
Каждое такое свойство — это отдельная строка в wp_postmeta с полями post_id, meta_key и meta_value. Один товар с 30 характеристиками = 30 строк в этой таблице. А теперь представьте магазин с 10 000 товарами… Именно поэтому wp_postmeta часто становится самым «тяжёлым» местом базы.
Таксыономии: категории, теги и атрибуты
Категории товаров, теги и атрибуты (цвет, размер) хранятся отдельно — в таблицах таксономий WordPress: wp_terms, wp_term_taxonomy, wp_term_relationships. Связь с товарами устанавливается через wp_term_relationships, где указано, какой термин к какому посту относится.
Глобальные атрибуты (те, что вы создаёте через «Товары → Атрибуты») дополнительно регистрируются в таблице wp_woocommerce_attribute_taxonomies.
Где хранятся заказы WooCommerce
Заказы — ещё один случай, где WooCommerce использует таблицу wp_posts. Каждый заказ — это запись с типом shop_order. Статус заказа (processing, completed, on-hold и так далее) хранится в поле post_status этой же таблицы.
А вот всё остальное — снова в wp_postmeta:
_order_total— итоговая сумма- _customer_user — ID покупателя (если авторизован)
- _billing_first_name, _billing_last_name, _billing_email, _billing_phone — данные для выставления счёта
- _shipping_address_1, _shipping_city и так далее — адрес доставки
- _payment_method — способ оплаты
- _order_currency — валюта
Состав заказа (какие товары куплены) хранится в отдельной таблице wp_woocommerce_order_items. А детали каждой позиции — цена за единицу, количество, налоги — в wp_woocommerce_order_itemmeta.
Получается, чтобы «собрать» полную картину одного заказа, WooCommerce делает запросы минимум к трём таблицам. И это нормально — просто нужно понимать, откуда берётся нагрузка при выводе списков заказов.
Купоны
Купоны — тоже «посты» в wp_posts, тип shop_coupon. Условия и ограничения (минимальная сумма, допустимые товары, лимит использований) — в wp_postmeta.
Как таблицы связаны между собой
Вот здесь уместно взглянуть на архитектуру целиком. WooCommerce использует два основных подхода к связям:
Связь «пост — метаданные» (один ко многим)
Это основная модель. Один товар (строка в wp_posts) связан с множеством строк в wp_postmeta через поле post_id. Один заказ — аналогично. Это классическая связь «один ко многим».
Визуально это выглядит так:
wp_posts(id=42, type=product) →wp_postmeta(post_id=42, meta_key=»_price», meta_value=»1500″)wp_posts(id=42, type=product) →wp_postmeta(post_id=42, meta_key=»_sku», meta_value=»SHIRT-BL-M»)wp_posts(id=42, type=product) →wp_postmeta(post_id=42, meta_key=»_stock», meta_value=»15″)
Связь «заказ — позиции заказа»
Заказ (строка в wp_posts) связан с позициями через wp_woocommerce_order_items по order_id. Каждая позиция, в свою очередь, связана с метаданными через wp_woocommerce_order_itemmeta.
Связь «товар — таксономии»
Связь между товарами и категориями/тегами проходит через таблицу wp_term_relationships. Это связь «многие ко многим» — один товар может быть в нескольких категориях, одна категория содержит множество товаров.
Связь «заказ — покупатель»
Поле _customer_user в wp_postmeta связывает заказ с пользователем в таблице wp_users. Если покупатель не авторизовался, это поле равно 0 — заказ «гостевой».
Проблема производительности: почему магазины тормозят
Архитектура EAV (Entity-Attribute-Value), которую использует WordPress и WooCommerce, — гибкая, но не самая быстрая. Главная проблема — таблица wp_postmeta.
Представьте: у вас 5 000 товаров и 20 000 заказов. У каждого товара — 20-30 мета-полей, у каждого заказа — 15-20. Итого: сотни тысяч строк в одной таблице. Когда WooCommerce строит каталог с фильтрацией по цене, он вынужден делать JOIN между wp_posts и wp_postmeta — и на больших объёмах это ощутимо.
Решения, которые помогают:
- Таблица
wp_wc_product_meta_lookup— появилась в WooCommerce 3.6 специально для ускорения фильтрации по цене, рейтингу, популярности. Это «кэш» части метаданных товаров в нормализованном виде. - Хороший хостинг с быстрым SSD — на больших магазинах это критически важно.
- Кэширование объектов (Redis или Memcached) — снижает число запросов к базе.
- Регулярная очистка — удаление устаревших сессий, ревизий постов, transient-записей.
- Индексы — правильные индексы в таблицах ускоряют выборки в разы.
Сессии покупателей: невидимый потребитель ресурсов
Таблица wp_woocommerce_sessions хранит данные о том, что покупатель положил в корзину, какие товары просмотрел и так далее. Каждый неавторизованный посетитель получает сессию, и она записывается в базу.
На магазинах с высоким трафиком эта таблица может разрастаться до десятков тысяч записей. WooCommerce по умолчанию очищает сессии через 48 часов, но если крон не настроен или работает нерегулярно — мусор накапливается.
Практический совет: проверяйте размер этой таблицы раз в месяц. Если она перевалила за 100 000 строк при среднем трафике — скорее всего, автоматическая очист
Добавить комментарий