Aller au contenu

Gestion des stocks et réapprovisionnement WooCommerce : les réglages qui décident de ce que vos clients peuvent acheter

Guide pratique de la gestion des stocks et du réapprovisionnement dans WooCommerce — l'écran Inventaire, le stock au produit ou à la variation, les trois modes de réapprovisionnement, Conserver le stock (minutes) et un audit WP-CLI de tout le catalogue.

WooCommerce décide de ce qu’un client a le droit d’acheter à partir de quatre valeurs, pas d’une seule : l’interrupteur global Gestion des stocks, l’indicateur _manage_stock propre au produit, sa quantité _stock et son mode _backorders. Alignez ces quatre valeurs et le catalogue se comporte correctement. Laissez-les diverger — un produit parent qui gère le stock pendant que ses variations portent elles aussi des quantités, ou un _stock à 0 posé à côté d’un _stock_status à instock — et la boutique vend ce qu’elle n’a pas, ou cache ce qu’elle a. Ce guide parcourt l’écran Inventaire de haut en bas, précise exactement ce que chaque mode de réapprovisionnement change sur la page produit, dans le panier, à la caisse et sur la commande, et se termine par un audit WP-CLI que vous pouvez lancer sur l’ensemble du catalogue.

Ce que vous allez accomplir

  • Régler les options d’inventaire globales — Gestion des stocks, Conserver le stock (minutes), seuils, destinataires des notifications, visibilité en rupture, format d’affichage — et savoir ce que chacune vous coûte.
  • Décider, produit par produit, si le stock vit sur le parent ou sur les variations, et empêcher les deux de se contredire.
  • Choisir un mode de réapprovisionnement en connaissance de cause, avec une idée claire de ce que le client voit à chaque étape.
  • Lire directement _stock, _stock_status et _backorders, repérer les lignes où ils divergent et réparer le miroir wc_product_meta_lookup.
  • Modifier le stock en lot depuis la liste des produits ou par CSV sans sauter silencieusement la moitié du catalogue.

Prérequis

WooCommerce 8.0 ou plus récent sur WordPress 6.4+, PHP 8.1+, et un compte administrateur. Les versions plus anciennes de WooCommerce se comportent de la même façon pour les réglages décrits ici, mais les notifications de stock faible et de rupture sont devenues des entrées à part dans WooCommerce → Réglages → Courriels dans les versions récentes ; sur les installations plus anciennes, elles sont envoyées directement et seul l’écran Inventaire les contrôle.

Un accès shell avec WP-CLI disponible comme wp, exécuté sous l’utilisateur du site depuis la racine WordPress. Chaque sous-commande wp wc passe par les contrôleurs REST, qui vérifient les capacités : ces commandes exigent donc un drapeau --user= nommant un administrateur. --user=1 est utilisé partout — remplacez-le par votre propre identifiant d’administrateur.

Une note sur le schéma. Le stockage haute performance des commandes change l’endroit où vivent les commandes (wp_wc_orders au lieu de wp_posts), mais les produits ne sont pas touchés : _stock, _stock_status, _manage_stock et _backorders restent dans wp_postmeta dans tous les cas. Toutes les requêtes produit ci-dessous fonctionnent sur n’importe quelle boutique.

Comment ça fonctionne

La résolution du stock suit un ordre fixe. L’option globale Gestion des stocks (woocommerce_manage_stock) est un interrupteur maître : désactivée, les champs de quantité disparaissent de l’administration et chaque produit retombe sur un simple statut en stock / en rupture. Activée, chaque produit doit encore s’y inscrire individuellement par sa propre méta _manage_stock. Un produit dont _manage_stock vaut no ignore complètement sa valeur _stock — le nombre peut rester là depuis une configuration antérieure sans rien signifier.

Quand un produit gère bel et bien son stock, _stock porte la quantité et _stock_status porte l’état dérivé : instock, outofstock ou onbackorder. Le mot important est dérivé. WooCommerce recalcule _stock_status à partir de la quantité et du mode de réapprovisionnement chaque fois qu’il enregistre le produit par sa propre couche de données. Écrivez _stock en SQL brut et rien n’est recalculé — c’est de loin la cause la plus fréquente d’un produit affiché « En stock » à zéro unité, ou « Rupture de stock » à quarante.

Il existe une deuxième copie de cet état. La table wc_product_meta_lookup recopie stock_quantity et stock_status dans des colonnes indexées pour que les requêtes de catalogue, le tri et les filtres n’aient pas à joindre wp_postmeta à répétition. Les pages boutique lisent le miroir. Si le miroir est périmé, la page produit et la page de catégorie se contredisent — un signal de diagnostic utile en soi.

Schéma montrant que WooCommerce ne touche pas au stock à l'ajout au panier, garde une ligne de réservation à la caisse, réduit le stock à la commande payée et le remonte à l'annulation

Conserver le stock (minutes) (woocommerce_hold_stock_minutes) gouverne l’intervalle entre « le client a lancé la caisse » et « la commande a été payée ». WooCommerce écrit une ligne de réservation de courte durée pour qu’un deuxième acheteur ne puisse pas réclamer la même unité pendant qu’un paiement est en vol, et il programme l’annulation automatique des commandes pending impayées plus vieilles que ce délai. C’est l’annulation qui fait revenir le stock : annuler une commande qui avait déjà réduit le stock remet la quantité en place, en s’appuyant sur la valeur _reduced_stock enregistrée sur chaque ligne de commande, ce qui restitue exactement ce qui avait été pris.

Étape par étape

  1. Lisez ce à quoi la boutique est réellement réglée. L’écran d’administration affiche des étiquettes ; voici les valeurs derrière.
wp option get woocommerce_manage_stock
wp option get woocommerce_hold_stock_minutes
wp option get woocommerce_notify_low_stock_amount
wp option get woocommerce_notify_no_stock_amount
wp option get woocommerce_stock_email_recipient
wp option get woocommerce_hide_out_of_stock_items
wp option get woocommerce_stock_format

Attendez-vous à yes, un nombre de minutes (60 par défaut), deux seuils (2 et 0 par défaut), une adresse de courriel, yes ou no, puis l’une des trois valeurs du format d’affichage : vide pour « Toujours afficher la quantité », low_amount pour « Afficher la quantité seulement si elle est faible », no_amount pour « Ne jamais afficher la quantité ». Un résultat vide pour woocommerce_stock_format est normal, ce n’est pas une anomalie.

  1. Activez la gestion des stocks et dimensionnez le délai de conservation. Dans WooCommerce → Réglages → Produits → Inventaire, cochez Gestion des stocks. Réglez ensuite Conserver le stock (minutes) sur une durée plus longue que celle de votre moyen de paiement le plus lent à confirmer. Soixante minutes convient pour les cartes ; si vous acceptez le virement bancaire ou le chèque, ces commandes restent impayées pendant des jours et un délai de 60 minutes les annulera dans votre dos. Mettez 0 pour désactiver complètement l’annulation automatique — le comportement de réservation part avec.
wp option update woocommerce_manage_stock yes
wp option update woocommerce_hold_stock_minutes 90

Le succès ressemble à Success: Updated 'woocommerce_manage_stock' option. pour chacune.

  1. Fixez les seuils et dites qui doit être prévenu. Le Seuil de stock faible déclenche une notification quand un produit descend à cette quantité ; le Seuil de rupture de stock est la quantité à laquelle, ou en dessous de laquelle, un produit est traité comme épuisé — normalement 0, mais montez-le à 2 si vous voulez garder en permanence un coussin invendable. Le Destinataire des notifications accepte une liste séparée par des virgules, et c’est le champ qu’on oublie quand la personne qui a monté la boutique quitte l’entreprise.
wp option update woocommerce_notify_low_stock_amount 5
wp option update woocommerce_stock_email_recipient "inventory@example.com,ops@example.com"

Chaque produit peut redéfinir le seuil de stock faible par son propre champ Seuil de stock faible, stocké dans _low_stock_amount ; laissez-le vide pour hériter de la valeur de la boutique.

  1. Choisissez la visibilité en rupture et le format d’affichage de façon délibérée. Cocher Visibilité en rupture de stock masque les produits épuisés des listes boutique, catégorie et recherche. Cela ne les dépublie pas : l’adresse du produit répond toujours, ce qui garde vivants les liens existants et les résultats des moteurs de recherche au lieu de les transformer en 404. C’est en général ce que vous voulez. Le Format d’affichage du stock décide si le client voit « 12 en stock » ou simplement « En stock » : c’est une décision de mise en marché, car un compte exact crée un sentiment d’urgence mais révèle aussi votre position d’inventaire à la concurrence.

  2. Réglez le stock d’un produit simple. Trois champs comptent dans l’onglet Inventaire : la case Gestion des stocks, la Quantité et Réapprovisionnement.

wp wc product update 431 --manage_stock=true --stock_quantity=24 --user=1
wp post meta get 431 _stock
wp post meta get 431 _stock_status

Vous devriez voir 24 puis instock. Passer par wp wc product update plutôt que par wp post meta update est justement le point : la commande fait transiter le produit par la couche de données, donc _stock_status et la table miroir sont tous les deux recalculés.

  1. Décidez où vit le stock d’un produit variable — parent ou variations, jamais les deux. C’est ici que la plupart des boutiques s’embrouillent. Si vous cochez Gestion des stocks sur le produit parent, le parent porte une seule quantité partagée et chaque variation y puise ; les champs de quantité des variations sont ignorés. Si vous laissez plutôt le parent sans gestion et cochez Gérer le stock ? sur chaque variation, chacune porte son propre _stock et le _stock_status du parent est dérivé du fait qu’au moins un enfant soit achetable. Mélanger les deux — une quantité oubliée sur le parent, datant d’avant l’ajout des variations — donne un produit qui paraît en stock sur la page de catégorie et qui refuse l’ajout au panier.
wp post meta get 512 _manage_stock
wp wc product_variation list 512 --user=1 --fields=id,sku,manage_stock,stock_quantity,stock_status --format=table

Si le parent affiche yes, chaque ligne de ce tableau devrait montrer manage_stock à faux. Si le parent affiche no ou rien du tout, ce sont les variations qui commandent.

  1. Choisissez un mode de réapprovisionnement. _backorders accepte exactement trois valeurs, et la différence entre les deux permissives tient entièrement à ce qu’on dit au client.

Comparaison des trois modes de réapprovisionnement WooCommerce — Ne pas autoriser, Autoriser avec avis client, Autoriser — sur la page produit, l'ajout au panier, la caisse et le statut de stock

wp wc product update 431 --backorders=notify --user=1
wp post meta get 431 _backorders

Attendez-vous à notify. Dès que la quantité passe sous zéro dans l’un ou l’autre des modes Autoriser, _stock devient négatif et _stock_status passe à onbackorder — un nombre négatif ici est correct, c’est votre décompte de réapprovisionnement. Avec Autoriser, rien de tout cela n’atteint le client : la page produit affiche toujours « En stock » et la ligne de commande ne porte aucune mention, si bien que votre équipe d’expédition l’apprend par le bon de préparation. Avec Autoriser, avec avis client, la page produit, le panier et la ligne de commande indiquent tous que l’article est en réapprovisionnement. Ne retenez Autoriser que lorsque le réapprovisionnement est invisible pour le client par conception, comme pour un article fabriqué sur commande.

  1. Modifiez le stock en lot sur tout le catalogue. Depuis Produits, sélectionnez des lignes, puis Actions groupées → Modifier. Le panneau expose Réapprovisionnement ?, En stock ? et un contrôle Qté en stock dont le menu propose Remplacer par, Augmenter le stock existant de et Diminuer le stock existant de — ce sont les deux derniers qui méritent d’être connus, parce qu’ils appliquent un écart plutôt que d’aplatir tous les produits à la même valeur. Les changements de quantité sont ignorés, silencieusement, pour les produits qui ne gèrent pas leur stock : voilà pourquoi l’étape 6 vient avant. Pour des volumes plus grands, l’importateur CSV dans Produits → Importer prend en charge les colonnes Stock, In stock?, Backorders? et Low stock amount ; la mécanique de l’importateur est couverte dans l’import de produits par CSV.

Valider que ça fonctionne

Sortez l’état d’inventaire du catalogue en une passe et lisez-le :

wp wc product list --user=1 --per_page=100 \
  --fields=id,name,manage_stock,stock_quantity,stock_status,backorders \
  --format=csv > /tmp/stock-audit.csv

Cherchez ensuite le désaccord qui génère vraiment des billets de soutien — la méta et le miroir désynchronisés :

wp db query "SELECT l.product_id, l.stock_quantity, l.stock_status, m.meta_value AS meta_status
  FROM $(wp config get table_prefix)wc_product_meta_lookup l
  JOIN $(wp config get table_prefix)postmeta m
    ON m.post_id = l.product_id AND m.meta_key = '_stock_status'
  WHERE l.stock_status <> m.meta_value"

Un résultat vide est la condition de réussite. Chaque ligne renvoyée est un produit dont la fiche et la liste de catalogue se contrediront.

Enfin, vérifiez que le balayage des commandes impayées est bel et bien programmé : si WP-Cron est cassé, Conserver le stock (minutes) ne se déclenche jamais.

wp cron event list --fields=hook,next_run_relative | grep cancel_unpaid

Vous devriez voir woocommerce_cancel_unpaid_orders avec une prochaine exécution à l’intérieur de votre délai.

Dépannage

Les quantités des variations ne changent rien. Le produit parent a _manage_stock à yes. Décochez Gestion des stocks sur le parent, enregistrez, puis ressaisissez les quantités par variation. La valeur _stock restée sur le parent demeure en base mais cesse d’être consultée.

Un produit affiche « En stock » à zéro unité. Quelque chose a écrit _stock en dehors de la couche de données — une mise à jour SQL brute, une vieille intégration de synchronisation, ou un outil en lot qui a contourné l’objet produit. Réenregistrez le produit une fois par wp wc product update pour forcer le recalcul, puis reconstruisez le miroir depuis WooCommerce → État → Outils → Régénérer les tables de correspondance produit, ou :

wp wc tool run regenerate_product_lookup_tables --user=1

Si c’est un système externe qui écrit, corrigez à la source — voyez garder l’inventaire WooCommerce synchronisé avec un système externe.

Les courriels de stock faible n’arrivent jamais. Vérifiez trois choses dans l’ordre : woocommerce_notify_low_stock vaut yes, woocommerce_stock_email_recipient est une boîte que quelqu’un lit, et le site sait réellement envoyer du courriel (wp eval 'var_dump( wp_mail( "vous@example.com", "test", "test" ) );' qui renvoie bool(true) prouve la remise au transport, pas la livraison). Les notifications ne se déclenchent aussi que pour les produits qui gèrent leur stock : un catalogue où la plupart des produits ont _manage_stock désactivé paraîtra muet même quand tout fonctionne.

Les commandes impayées s’annulent trop vite. Conserver le stock (minutes) s’applique à toute commande pending impayée, virement bancaire et chèque compris. Montez largement le délai au-delà de votre méthode la plus lente, ou mettez 0 et annulez les commandes dormantes selon votre propre calendrier.

Le stock n’est pas revenu après un remboursement. L’annulation restitue le stock automatiquement ; le remboursement, non, sauf si vous utilisez la commande de remise en stock du formulaire de remboursement. C’est un mécanisme distinct — voyez remboursements partiels et remise en stock.

Quand ce n’est pas la bonne approche

Si deux acheteurs peuvent réalistement viser la dernière unité dans la même seconde — un lancement, une vente éclair, une mise en vente de billets — la configuration seule ne vous sauvera pas. C’est un problème de concurrence, avec ses propres modes de défaillance et ses propres correctifs ; les réglages présentés ici rétrécissent la fenêtre sans la fermer, et le guide sur la condition de course du stock est le bon point de départ.

Si les quantités font autorité dans un progiciel de gestion ou dans un système d’entrepôt, ne les gérez pas du tout dans WooCommerce. Laissez le système externe posséder le nombre et le pousser ; deux systèmes également convaincus de détenir la vérité divergeront en moins d’une semaine.

Et si vous vendez un service, une réservation ou quoi que ce soit où « combien en reste-t-il » signifie en réalité « combien de plages à quelle date », les quantités de stock sont le mauvais modèle : la disponibilité est un problème d’horaire, pas d’inventaire. La documentation officielle WooCommerce sur la gestion des produits et la référence WP-CLI post meta couvrent les champs sous-jacents si vous devez aller plus loin.

Un WordPress qui rapporte vraiment mérite un opérateur — Stack Harbor opère cette pile sous WordPress Entreprise ; réservez une consultation d’infrastructure.