Skip to Content
WordPressPartie 10 — WooCommerceArchitecture de WooCommerce

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 dans wp_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 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) et product_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 par wc_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 (jamais get_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ête WP_Query( post_type => 'shop_order' ) ou un accès $wpdb sur wp_posts ne trouvera pas les commandes. Toujours utiliser wc_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

  1. Comment récupérez-vous le prix et le stock d’un produit proprement ?
  2. Avec HPOS activé, pourquoi WP_Query( 'shop_order' ) ne fonctionne-t-il pas, et que faire ?
  3. Quel est le risque de surcharger un template Woo dans son thème, et l’alternative ?

✅ Solution

  1. Via l’objet produit : $p = wc_get_product( $id ); $p->get_price(); $p->get_stock_quantity();jamais get_post_meta('_price') en dur (Woo gère caches/tables/logique).
  2. Parce qu’avec HPOS, les commandes vivent dans des tables dédiées (wc_orders), pas dans wp_posts. Il faut utiliser wc_get_orders() / wc_get_order() (et déclarer la compat HPOS de son extension).
  3. 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.