Chapitre 10.1 — Architecture de WooCommerce
⏱️ TL;DR — WooCommerce est bâti sur WordPress : les produits sont un CPT (
product) avec des métadonnées, les commandes sont désormais stockées dans des tables dédiées (HPOS — High-Performance Order Storage) plutôt que danswp_posts, le panier/session vit côté client+serveur, et l’accès aux données passe par des objets (WC_Product,WC_Order,WC_Cart) et des data stores (couche d’abstraction). Les templates Woo sont surchargeables par le thème. Comprendre cette architecture, c’est savoir où intervenir proprement.
🎯 Objectifs
- Situer produits, commandes, panier dans l’architecture.
- Comprendre HPOS et pourquoi c’est important.
- Utiliser les objets CRUD (
WC_Product,WC_Order) plutôt que le SQL brut. - Repérer les templates surchargeables.
1. WooCommerce = une couche sur WordPress
WooCommerce réutilise les briques de WordPress (CPT, meta, hooks, taxonomies, REST) et ajoute une couche e-commerce (panier, checkout, paiement, commandes) avec ses propres abstractions.
2. Les produits
- Un produit est un CPT
product(types : simple, variable, groupé, externe). - Ses données : prix, stock, SKU, dimensions… en métadonnées (+ tables Woo pour certaines).
- Ses classements : taxonomies
product_cat(catégories) etproduct_tag(étiquettes), plus des attributs (couleur, taille) qui génèrent les variations.
On manipule un produit via l’objet WC_Product (pas get_post directement) :
$product = wc_get_product( $product_id );
$prix = $product->get_price();
$stock = $product->get_stock_quantity();
$product->set_regular_price( 19.90 );
$product->save(); // persiste via le data store⚠️ Piège n°1 — lire/écrire les meta produit « à la main ». N’utilisez pas
get_post_meta( $id, '_price', … )en dur : passez parwc_get_product()et ses getters/setters (get_price,set_stock_quantity,save). Woo gère des caches, des tables et de la logique (variations, taxes) que l’accès meta direct contourne — source de bugs (prix non recalculés, stock incohérent).
3. Les commandes et HPOS
Historiquement, les commandes étaient des CPT (shop_order) dans wp_posts. WooCommerce a introduit HPOS (High-Performance Order Storage) : les commandes vivent dans des tables dédiées (wc_orders, wc_order_addresses…), bien plus performantes à grande échelle.
- On manipule une commande via
WC_Order(jamaisget_post) :
$order = wc_get_order( $order_id );
$total = $order->get_total();
$items = $order->get_items();
$order->update_status( 'completed', 'Traité automatiquement' );⚠️ Piège n°2 — supposer que les commandes sont dans
wp_posts. Avec HPOS activé (le défaut sur les nouvelles installs), une requêteWP_Query( post_type => 'shop_order' )ou un accès$wpdbsurwp_postsne trouvera pas les commandes. Toujours utiliserwc_get_orders()/wc_get_order(). Votre extension doit déclarer sa compatibilité HPOS (ch. 10.4), sinon elle est désactivée ou bugue.
4. Panier, session, checkout
WC_Cart: le panier de la session courante (WC()->cart), avec les articles, totaux, remises.WC_Session: la session (panier persistant, données temporaires), gérée par cookie + base.- Le checkout orchestre : validation, création de la commande, appel de la passerelle de paiement (ch. 10.5), statut, e-mails.
Ces objets sont accessibles via l’instance globale WC() (ex. WC()->cart, WC()->session, WC()->customer).
5. Les templates (surchargeables)
WooCommerce fournit des templates (templates/…) pour l’affichage (fiche produit, boucle, panier, checkout). Le thème peut les surcharger en les copiant dans votre-theme/woocommerce/… (même logique que la surcharge de templates, ch. 6.3) :
wp-content/themes/mon-theme/woocommerce/single-product/price.php
→ surcharge templates/single-product/price.php de WooCommerce⚠️ Piège n°3 — surcharge de template obsolète. En copiant un template Woo, vous figez sa version : si WooCommerce le met à jour (nouvelle logique, sécurité), votre copie ne bénéficie pas du changement. WooCommerce signale les templates surchargés périmés (Statut → Système). Préférez les hooks (ch. 10.2) à la surcharge de template quand c’est possible ; ne surchargez que si nécessaire, et maintenez vos copies.
💡 Pour un dev React — Voyez WooCommerce comme un domaine e-commerce modélisé au-dessus de WordPress : des entités (Product, Order, Cart) avec une couche d’accès (
WC_Product/data stores) qui encapsule la persistance — un peu comme un ORM/service layer. La règle « ne touchez pas la base directement, passez par les objets » est exactement votre discipline (repository/service). Et HPOS = une migration de schéma vers des tables optimisées : votre code parle aux objets, pas aux tables, donc il survit à la migration.
✏️ Exercices
- Comment récupérez-vous le prix et le stock d’un produit proprement ?
- Avec HPOS activé, pourquoi
WP_Query( 'shop_order' )ne fonctionne-t-il pas, et que faire ? - Quel est le risque de surcharger un template Woo dans son thème, et l’alternative ?
✅ Solution
- Via l’objet produit :
$p = wc_get_product( $id ); $p->get_price(); $p->get_stock_quantity();— jamaisget_post_meta('_price')en dur (Woo gère caches/tables/logique). - Parce qu’avec HPOS, les commandes vivent dans des tables dédiées (
wc_orders), pas danswp_posts. Il faut utiliserwc_get_orders()/wc_get_order()(et déclarer la compat HPOS de son extension). - Le template copié se fige : il ne reçoit plus les mises à jour de WooCommerce (logique, sécurité) → risque de bugs/failles. Alternative : utiliser les hooks WooCommerce (ch. 10.2) plutôt que surcharger, et si on surcharge, maintenir la copie à jour.
🧠 Quiz de révision
1. Qu’est-ce qu’un produit WooCommerce techniquement ?
Un CPT product avec métadonnées et taxonomies (product_cat, product_tag), manipulé via WC_Product.
2. Qu’est-ce que HPOS ?
Le High-Performance Order Storage : les commandes dans des tables dédiées (pas wp_posts), plus performantes.
3. Comment manipuler une commande ?
Via wc_get_order() / WC_Order (getters/setters), jamais via get_post/SQL direct.
4. Comment surcharge-t-on un template Woo ?
En le copiant dans votre-theme/woocommerce/… (mais préférer les hooks, et maintenir la copie).
5. Où accède-t-on au panier courant ?
Via WC()->cart (WC_Cart), et WC()->session pour la session.
Chapitre suivant : Les hooks WooCommerce.