Где хранятся данные
WooCommerce хранит данные в базе WordPress: часть — в стандартных таблицах, часть — в собственных. Знать таблицы нужно, чтобы понимать, что происходит, но читать и менять данные всегда следует через классы и функции магазина, а не запросами к базе.
Что где лежит
| Данные | Где |
|---|---|
| Товары | Таблица wp_posts, тип записи product |
| Свойства товара (цена, артикул) | wp_postmeta и таблица поиска wp_wc_product_meta_lookup |
| Категории, метки, атрибуты | Таксономии product_cat, product_tag, pa_... |
| Заказы | Собственные таблицы wp_wc_orders, wp_wc_order_addresses, wp_wc_orders_meta |
| Позиции заказа | wp_woocommerce_order_items |
| Покупатели | Пользователи WordPress с ролью customer |
| Настройки | Таблица wp_options, ключи woocommerce_... |
Тип записи — способ WordPress хранить в одной таблице разные сущности: статьи, страницы, товары. Таксономия — способ группировать записи: категории и метки.
HPOS
Раньше заказы тоже были записями в wp_posts. Теперь они хранятся в отдельных таблицах — этот режим называется HPOS (High-Performance Order Storage, быстрое хранилище заказов). В новых магазинах он включён сразу. Проверить можно в «WooCommerce → Настройки → Дополнительно → Функции», блок «Хранение данных заказа».
Практический вывод один: с заказами работают только через wc_get_order() и методы объекта заказа. Функции get_post_meta() и WP_Query заказов не видят.
Объект магазина
Функция WC() возвращает главный объект WooCommerce. Через него доступны корзина, покупатель и сессия текущего посетителя:
$count = WC()->cart->get_cart_contents_count();
$country = WC()->customer->get_billing_country();
$version = WC()->version;Первая строка возвращает число товаров в корзине, вторая — страну покупателя, третья — версию плагина. Корзина и покупатель существуют только на страницах сайта: в панели и в фоновых задачах WC()->cart равен null.
Функции доступа
К остальным данным обращаются функциями с приставкой wc_:
| Функция | Что возвращает |
|---|---|
wc_get_product($id) | Объект товара |
wc_get_products($args) | Список товаров |
wc_get_order($id) | Объект заказа |
wc_get_orders($args) | Список заказов |
wc_price(19.9) | Цену с валютой в HTML |
wc_get_page_permalink('cart') | Адрес страницы магазина |
Каждая из них разбирается в следующих уроках.
Попробовать без плагина
Пока своего плагина нет, код удобно проверять в консоли WP-CLI:
wp eval 'echo wc_get_product(12)->get_name();'Команда выполняет PHP-код внутри загруженного WordPress и печатает название товара с идентификатором 12. Идентификатор виден в списке «Товары» при наведении на строку.
Частая ошибка
Данные читают SQL-запросом: SELECT meta_value FROM wp_postmeta WHERE meta_key = '_price'. Структура таблиц меняется от версии к версии — так уже произошло с заказами при переходе на HPOS, — и такой код перестаёт работать после обновления. Объекты и функции WooCommerce скрывают хранение и остаются прежними.