Мета
Бачити WooCommerce як систему: що зберігається в постах, що в окремих таблицях і хто цим керує.
Ключові поняття
WC()— головний об'єкт плагіна:WC()->cart,WC()->session,WC()->customer,WC()->mailer()- Товари — пости типу
productіproduct_variation+ таблицяwc_product_meta_lookupдля швидких фільтрів - Замовлення — HPOS-таблиці
wc_orders,wc_order_addresses,wc_order_operational_data,wc_orders_meta - Кошик гостя — у
woocommerce_sessions, а не в cookie - Фонові задачі — таблиці Action Scheduler (
actionscheduler_actions,actionscheduler_logs) - Атрибути — таксономії
pa_*, категорії —product_cat, видимість — таксономіяproduct_visibility
Схема
erDiagram
wp_posts ||--o{ wp_postmeta : "product / product_variation"
wp_posts ||--|| wc_product_meta_lookup : "ціна, залишок, SKU"
wc_orders ||--o{ wc_order_addresses : "billing / shipping"
wc_orders ||--|| wc_order_operational_data : "службові дані"
wc_orders ||--o{ wc_orders_meta : "мета замовлення"
wc_orders ||--o{ woocommerce_order_items : "позиції"
woocommerce_order_items ||--o{ woocommerce_order_itemmeta : "кількість, сума, product_id"
woocommerce_sessions }o--|| wc_orders : "кошик → checkout"
Код
Подивитися таблиці WooCommerce у своїй базі:
SHOW TABLES LIKE '%wc\_%';
SHOW TABLES LIKE '%woocommerce\_%';
SHOW TABLES LIKE '%actionscheduler\_%';
Типові помилки
| Симптом | Причина | Виправлення |
|---|---|---|
| Фільтр за ціною дуже повільний | meta_query по _price у wp_postmeta | Фільтрувати через wc_get_products() / lookup-таблицю |
Замовлення «не знайдено» через get_post() | Увімкнений HPOS: замовлень немає в wp_posts | wc_get_order( $id ) |
| База росте без причини | Старі сесії та логи Action Scheduler | Перевірити очищення сесій і retention логів |
Слабка і сильна відповідь
Питання: Де WooCommerce зберігає замовлення?
Слабка відповідь. У
wp_postsз типомshop_order, а дані — уwp_postmeta.
Сильна відповідь. Залежить від налаштування. На нових сайтах з 8.2 — в HPOS-таблицях (
wc_ordersі пов'язані). На старих може бутиwp_postsабо режим синхронізації. Тому в коді я ніколи не звертаюсь до таблиць напряму, лише черезwc_get_order()і CRUD.
Чому друга сильніша: Кандидат знає поточний стан, пам'ятає про обидва сховища і робить висновок для коду.
Практичне завдання
Відкрийте базу тестового магазину. Знайдіть одне замовлення в wc_orders, його адреси в wc_order_addresses і позиції в woocommerce_order_items. Намалюйте схему цих зв'язків від руки або в Mermaid. У терміналі нижче спробуйте команди wp wc для перегляду даних.
Питання з інтерв'ю
Денормалізована таблиця з ціною, залишком, SKU, рейтингом товару. WooCommerce використовує її для сортування і фільтрів, щоб не робити повільні JOIN по wp_postmeta.
У таблиці woocommerce_sessions. У cookie лежить лише ключ сесії. Для залогіненого користувача кошик додатково зберігається в user meta, щоб відновитися на іншому пристрої.
WP-Cron залежить від відвідувань і не має статусів та повторів. Action Scheduler зберігає задачі в БД, виконує їх пачками, логує помилки. На ньому працюють webhooks, аналітика, частина емейлів і міграції.