WooCommerce Guide

Migrer une boutique WooCommerce vers HPOS sans perdre une commande

Le stockage des commandes haute performance (HPOS) est la norme des nouvelles boutiques WooCommerce depuis la version 8.2. Les boutiques plus anciennes stockent encore leurs commandes dans les tables des articles WordPress. Méthode de bascule, pièges des extensions et plan de retour.

Dégradé bleu nuit évoquant la base de données des commandes WooCommerce

Pendant plus de dix ans, WooCommerce a rangé ses commandes comme des articles de blog : une ligne dans wp_posts, et une trentaine de lignes de métadonnées dans wp_postmeta. Le système a l’avantage de la simplicité. Il a surtout l’inconvénient de mélanger les commandes avec tout le reste du site, dans une table de métadonnées qui grossit sans fin et que chaque requête doit parcourir.

Le High-Performance Order Storage (HPOS) corrige ce défaut de conception. Les commandes disposent de leurs propres tables, indexées pour les recherches qu’une boutique fait réellement : par client, par statut, par date. Depuis WooCommerce 8.2, publiée en octobre 2023, HPOS est activé par défaut sur toute nouvelle installation. Les boutiques créées avant cette date, elles, tournent encore souvent sur l’ancien stockage, et c’est à elles que s’adresse ce guide.

Ce que HPOS change dans la base

HPOS introduit quatre tables dédiées : wc_orders pour la commande elle-même, wc_order_addresses pour les adresses de facturation et de livraison, wc_order_operational_data pour les données de fonctionnement, et wc_orders_meta pour les métadonnées propres aux extensions. Les colonnes les plus consultées (statut, total, client, dates) deviennent de vraies colonnes indexées au lieu de paires clé-valeur.

Avant et après HPOS : des tables génériques de WordPress aux tables dédiées aux commandes Stockage historique wp_posts articles, pages, produits… et commandes wp_postmeta ~30 lignes clé / valeur par commande _billing_email, _order_total, _customer_user, _shipping_city… pas d’index sur les valeurs HPOS wc_orders — statut, total, client, dates wc_order_addresses wc_order_operational_data wc_orders_meta — extensions colonnes typées et indexées
Les commandes quittent les tables génériques de WordPress pour des tables conçues pour elles.

Le gain se mesure surtout sur les boutiques qui ont accumulé plusieurs dizaines de milliers de commandes : liste des commandes en administration, recherche par e-mail client, rapports, exports. Sur une boutique récente de quelques centaines de commandes, la différence reste peu visible. L’intérêt est ailleurs : c’est désormais le socle sur lequel WooCommerce développe, et l’ancien stockage n’est plus qu’un mode de compatibilité.

Le vrai risque : les extensions, pas WooCommerce

La migration des données elle-même est prise en charge par WooCommerce. Le danger vient des extensions et du code sur mesure qui lisent les commandes directement dans wp_postmeta, avec get_post_meta() ou une requête SQL écrite à la main. Une fois HPOS actif, ce code lit des tables qui ne sont plus mises à jour. Il ne plante pas : il renvoie des données périmées, ce qui est bien pire.

Les extensions compatibles le déclarent explicitement à WooCommerce. L’écran WooCommerce > Réglages > Avancé > Fonctionnalités refuse d’ailleurs l’activation tant qu’une extension active est marquée incompatible. Ce garde-fou ne couvre pas le code du thème, les extraits ajoutés dans functions.php ni les scripts d’export maison : ceux-là doivent être relus à la main, en cherchant tout accès direct aux métadonnées de commande.

La méthode en six étapes

  1. Copie de préproduction. Toute la bascule se répète d’abord sur une copie de la boutique, avec une vraie base de commandes.
  2. Audit du code. Recherche de get_post_meta, WP_Query sur shop_order et requêtes SQL sur wp_posts dans le thème et les extensions maison. Chaque occurrence passe par l’API wc_get_order().
  3. Mode compatibilité. Dans Fonctionnalités, activer la synchronisation des données entre les deux stockages, en gardant l’ancien stockage comme référence.
  4. Synchronisation complète. Sur une grosse base, la lancer en ligne de commande plutôt que d’attendre les tâches planifiées : wp wc hpos count_unmigrated, puis wp wc hpos sync, puis wp wc hpos verify_data.
  5. Bascule. Passer HPOS en stockage principal, synchronisation toujours active. Les deux jeux de tables restent alignés, ce qui garde un retour arrière instantané.
  6. Période d’observation. Quelques semaines de commandes réelles, exports comptables compris, avant de désactiver la synchronisation.

La documentation officielle détaille chacun de ces écrans dans son guide consacré au High-Performance Order Storage, y compris la déclaration de compatibilité à ajouter dans une extension maison.

Garder une porte de sortie

Tant que la synchronisation reste active, revenir à l’ancien stockage se fait depuis le même écran, sans perte. C’est la raison pour laquelle la période d’observation compte davantage que la bascule elle-même : elle laisse le temps à un export mensuel, à une facture ou à un connecteur de logistique de révéler une lecture directe oubliée. La synchronisation a un coût en écriture, modeste, qu’il est raisonnable de payer quelques semaines.

Ce qu’il faut retenir

  • HPOS est la norme des nouvelles boutiques depuis WooCommerce 8.2 ; l’ancien stockage n’est plus qu’un mode de compatibilité.
  • Le risque ne vient pas des données mais du code qui lit les commandes en direct dans wp_postmeta.
  • La synchronisation entre les deux stockages rend la bascule réversible : elle doit rester active pendant l’observation.

Sur les boutiques que je reprends, le problème n’est presque jamais une extension du marché : elles sont à jour depuis longtemps. C’est l’export comptable écrit il y a cinq ans par un prestataire disparu, qui lit _order_total directement en SQL. Il continue de tourner après la bascule et produit des chiffres faux sans aucune erreur. Je commence donc toujours par là, avant même d’ouvrir l’écran des fonctionnalités. — Simon Janvier

Votre boutique tourne encore sur l’ancien stockage des commandes ? L’audit offert passe en revue les extensions et le code maison qui bloqueraient la bascule. Demander l’audit e-commerce