Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Где хранятся данные

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 скрывают хранение и остаются прежними.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.