Si vous exploitez une boutique WooCommerce dont des produits sont épuisés pour de bon, ou dont le fournisseur a abandonné toute une gamme, chaque URL retirée exige une réponse réfléchie. Gardez en ligne les fiches en rupture passagère et redirigez un produit abandonné vers son vrai successeur avec une 301 (redirection permanente). Renvoyez 410 Gone seulement s’il n’y a ni successeur, ni trafic, ni lien. Supprimer un produit transforme son adresse web (URL) en 404 (page introuvable), ce qui fait perdre son classement et les liens qu’il avait obtenus. Tout rediriger vers la page d’accueil semble propre, mais Google peut traiter les redirections hors sujet comme des soft 404 et les retirer quand même. Les étapes ci-dessous trient le catalogue et confirment la réponse de chaque URL.
Ce que vous allez accomplir
- Classer chaque produit en rupture dans l’une de quatre issues, avec une règle que vous pouvez reprendre à chaque saison.
- Garder indexables les produits qui reviennent, avec des données produit qui disent à Google la vérité sur la disponibilité.
- Mettre en place les réponses 301 et 410 avec l’extension Redirection, nginx ou Apache.
- Confirmer chaque URL avec curl, le test des résultats enrichis de Google et la Search Console.
Prérequis
- Un accès administrateur à WordPress et à WooCommerce.
- WP-CLI, l’outil en ligne de commande de WordPress, installé sur le serveur et lancé avec l’utilisateur du site. Le projet se trouve sur wp-cli.org.
- Un accès à la propriété du site dans Google Search Console (GSC), l’outil gratuit de Google pour les propriétaires de sites.
- L’extension Redirection installée, ou un accès shell pour modifier la configuration nginx ou Apache.
- Un export des liens entrants de votre outil de référencement naturel (SEO), si vous en avez un. C’est utile, mais facultatif.
Comment ça fonctionne
Chaque URL de produit répond à un robot d’exploration avec un code d’état HTTP (Hypertext Transfer Protocol), un nombre à trois chiffres qui dit ce qui s’est passé. Un 200 signifie « voici la page ». Un 301 signifie « déplacé pour de bon », et il transmet l’essentiel des signaux de classement de l’ancienne page à la nouvelle adresse. Un 404 indique que la page est introuvable, et un 410 qu’elle a été retirée volontairement. Google retire les deux de son index, et le 410 exprime votre intention plus clairement.
Un soft 404 est une URL qui renvoie 200, ou qui redirige, mais dont le contenu semble vide ou sans rapport avec la demande. Les consignes de Google sur les déménagements de site préviennent qu’une redirection de nombreuses anciennes URL vers une seule page non pertinente peut être traitée comme un soft 404. La page d’accueil en est l’exemple type. Une redirection massive de produits disparus vers la racine de la boutique a donc peu de chances de garder leur classement.
WooCommerce ajoute deux subtilités. D’abord, un produit en rupture reste accessible. Repérez l’option qui masque les articles en rupture du catalogue (« Hide out of stock items from the catalog ») sous WooCommerce → Réglages → Produits → Inventaire. Elle les retire seulement des listes de la boutique, des catégories et de la recherche. L’URL de chaque fiche produit continue de renvoyer 200. Ensuite, WooCommerce affiche de base des données structurées Product, un bloc JSON-LD (JavaScript Object Notation for Linked Data) de faits schema.org que lisent les moteurs de recherche. Sa valeur offers.availability vient de l’état du stock : InStock ou OutOfStock, et les versions récentes associent « En réapprovisionnement » (On backorder) à BackOrder. Si Yoast WooCommerce SEO ou Rank Math remplace ce bloc, c’est leur sortie que Google voit; vérifiez-la au lieu de vous fier au badge de stock.
| Situation | Quoi faire | Code HTTP | Ce que Google en fait |
|---|---|---|---|
| En rupture, de retour bientôt | Garder la fiche, afficher une date de retour ou un formulaire d’alerte | 200, schéma OutOfStock ou BackOrder | La garde dans l’index et affiche la disponibilité |
| Abandonné, successeur clair | Rediriger vers le produit successeur | 301 | Transfère les signaux vers la nouvelle URL en quelques semaines |
| Aucun successeur, encore des liens ou du trafic | Page d’archive avec des solutions de rechange, ou 301 vers la catégorie la plus proche | 200 ou 301 | Garde une page utile; une redirection trop large risque un soft 404 |
| Aucun successeur, ni trafic, ni lien | Renvoyer Gone | 410 (ou 404) | La retire de l’index |
| Toute URL redirigée vers l’accueil | À éviter | 301 | Peut la traiter comme un soft 404 |
Étapes
- Listez les produits en rupture. La commande
wp post listtransmet ses arguments supplémentaires à la requête WordPress, ce qui permet de filtrer sur le champ_stock_status. Lancez-la depuis la racine de WordPress :
wp post list --post_type=product --post_status=publish --meta_key=_stock_status --meta_value=outofstock --fields=ID,post_name,post_modified --format=csv
Exemple de sortie :
ID,post_name,post_modified
4812,trail-kettle-1l,2026-09-14 10:22:41
3977,ceramic-pour-over-v1,2026-06-02 16:05:13
2210,canvas-apron-olive,2025-11-28 09:47:30
Si seule la ligne d’en-tête s’affiche, aucun produit publié n’est marqué outofstock. Si vous savez que certains sont épuisés, vérifiez si la gestion du stock est désactivée pour eux; leur état reste alors celui que quelqu’un a choisi à la main. Relancez la commande avec --meta_value=onbackorder pour lister les produits en réapprovisionnement, qui vont dans le premier groupe. Les réglages derrière ces valeurs sont expliqués dans Gestion des stocks et réapprovisionnement WooCommerce.
- Vérifiez les produits variables au niveau des variations. Un produit variable, vendu en tailles ou en couleurs, garde son stock sur chaque variation. Le parent indique
outofstockseulement quand toutes ses variations sont en rupture, si bien qu’une taille épuisée peut se cacher dans un parent « en stock ». Listez les variations d’un parent en remplaçant1par l’identifiant d’un compte administrateur :
wp wc product_variation list 3977 --user=1 --fields=id,sku,stock_status --format=table
Exemple de sortie :
+------+----------+--------------+
| id | sku | stock_status |
+------+----------+--------------+
| 3981 | POV1-WHT | outofstock |
| 3982 | POV1-BLK | outofstock |
+------+----------+--------------+
Ici, chaque ligne concorde avec le parent. Si une variation affiche instock alors que le parent indique outofstock, l’état enregistré du parent est périmé. Ouvrez le produit dans l’administration et cliquez sur Mettre à jour; l’enregistrement resynchronise le parent à partir de ses variations.
- Croisez la liste avec les données de la Search Console. Dans la Search Console, ouvrez Performances → Résultats de recherche et réglez la période sur les 12 derniers mois. Choisissez l’onglet Pages et exportez-le. Le téléchargement contient un fichier
Pages.csvdont la première colonne contient l’URL de la page. Enregistrez les slugs en rupture, puis gardez seulement les URL qui correspondent à l’un d’eux :
wp post list --post_type=product --post_status=publish --meta_key=_stock_status --meta_value=outofstock --field=post_name > oos-slugs.txt
awk -F, 'NR==FNR {oos[$1]=1; next} FNR>1 {u=$1; sub(/\/$/,"",u); n=split(u,p,"/"); if (p[n] in oos) print p[n]","$2","$3}' oos-slugs.txt Pages.csv | sort -t, -k3,3nr
Exemple de sortie :
trail-kettle-1l,214,9630
ceramic-pour-over-v1,37,4122
Les colonnes sont le slug, les clics et les impressions, triées par impressions. Un slug absent de ce résultat n’a eu aucune impression dans la période, ce qui en fait un candidat au 410. Si la commande n’affiche rien alors que vous savez que ces produits reçoivent des visites, ouvrez Pages.csv et confirmez que la première colonne contient des URL complètes séparées par des virgules. Le rapport de la Search Console sur les pages les plus liées (Links → Top linked pages) ajoute les données de liens.
- Gardez les produits qui reviennent en ligne et honnêtes. Pour tout ce qui revient, laissez le produit publié. Réglez État du stock (Stock status) sur « En rupture de stock » (Out of stock), ou autorisez le réapprovisionnement si vous prenez des commandes avant le retour. Écrivez la date prévue en haut de la description courte. Pour les alertes par courriel, ajoutez une extension comme Back In Stock Notifications, puisque WooCommerce n’offre pas ce formulaire de base. Ne réglez pas la Visibilité du catalogue (Catalog visibility) sur l’option qui masque le produit (« Hidden » en anglais), et ne marquez pas la page noindex. La masquer des listes avec l’option d’inventaire ne pose pas de problème, puisque l’URL reste à 200 et indexable. Vérifiez ensuite la disponibilité annoncée par la page :
curl -s https://example.com/product/trail-kettle-1l/ | grep -o '"availability": *"[^"]*"'
Exemple de sortie :
"availability":"https:\/\/schema.org\/OutOfStock"
Les barres obliques échappées sont normales, et l’adresse peut commencer par http ou https selon la version de WooCommerce. Si la ligne indique InStock pour un produit épuisé, ou si deux lignes s’affichent, une deuxième source écrit du schéma; voyez le Dépannage. Si la commande n’affiche rien, la page ne porte aucun schéma produit, ou un cache sert une copie plus ancienne.
- Redirigez les produits abandonnés qui ont un successeur. Choisissez le seul produit qu’achèterait aujourd’hui le client de l’ancien article : le nouveau modèle, ou le même article dans son matériau de remplacement. Dans l’extension Redirection, allez dans Outils → Redirection et ajoutez une règle avec la source
/product/ceramic-pour-over-v1/, la cible/product/ceramic-pour-over-v2/et le code HTTP 301. Sur nginx, la règle équivalente se place dans le blocserverdu site :
location = /product/ceramic-pour-over-v1/ {
return 301 https://example.com/product/ceramic-pour-over-v2/;
}
Sur Apache, ajoutez cette ligne à l’hôte virtuel ou au .htaccess, au-dessus des règles de WordPress :
Redirect 301 /product/ceramic-pour-over-v1/ https://example.com/product/ceramic-pour-over-v2/
Testez et rechargez nginx après la modification :
sudo nginx -t && sudo systemctl reload nginx
Exemple de sortie :
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Une ligne emerg signifie que le rechargement n’a pas eu lieu; corrigez d’abord la ligne signalée. Sur Apache, sudo apachectl configtest doit afficher Syntax OK avant le rechargement. Passez ensuite l’ancien produit en brouillon, pour qu’il quitte le plan de site XML et la recherche de la boutique :
wp post update 3977 --post_status=draft
Exemple de sortie :
Success: Updated post 3977.
Un brouillon conserve les données du produit pour les rapports. Si vous aviez plutôt renommé l’ancien produit pour en faire le nouveau, WordPress garde déjà l’ancien slug dans _wp_old_slug et le redirige. Cela couvre seulement un slug renommé sur le même produit, jamais un successeur distinct.
-
Tranchez pour les produits entre les deux. Ils n’ont pas de successeur, mais reçoivent encore des clics ou des liens. Vous avez deux choix honnêtes. Le premier est une page d’archive : gardez-la publiée et en rupture, commencez la description par « Ce produit n’est plus offert », et liez deux ou trois solutions de rechange actuelles. Schema.org définit aussi une valeur de disponibilité
Discontinued, mais WooCommerce continuera d’afficherOutOfStock, qui reste exact. Le second est une 301 vers la catégorie la plus proche, seulement si la correspondance est étroite. Une bouilloire de camping retirée va vers Bouilloires, pas vers Cuisine ni vers la page d’accueil. Si le client qui arrive là ne comprend pas pourquoi, la cible est trop large. -
Renvoyez 410 pour le reste. Ces produits n’ont ni successeur, ni clic en 12 mois, ni lien. WordPress ne renvoie jamais de 410 de lui-même; un produit à la corbeille ou en brouillon renvoie 404, ce qui est acceptable. Pour un 410 explicite dans Redirection, ajoutez une règle pour l’URL source et ouvrez ses options avancées. Réglez l’action en cas de correspondance (« When matched ») sur « Error (404) », puis choisissez 410 dans la liste des codes HTTP. Les libellés peuvent varier légèrement selon la version de l’extension. Sur nginx :
location = /product/canvas-apron-olive/ {
return 410;
}
Sur Apache, Redirect gone /product/canvas-apron-olive/ fait la même chose. Une fois la règle active, mettez le produit à la corbeille :
wp post delete 2210
Exemple de sortie :
Success: Trashed post 2210.
Sans --force, le produit va à la corbeille et peut être restauré. Un effet secondaire à connaître : pour une URL qui renvoie 404, WordPress peut deviner une publication au slug semblable et y rediriger. Si canvas-apron-olive-xl existe, l’URL retirée peut aboutir là. La règle 410 l’empêche. Renvoyer false depuis le filtre do_redirect_guess_404_permalink, offert depuis WordPress 5.5, désactive ces redirections devinées pour tout le site.
Valider le résultat
Demandez les en-têtes de chaque URL traitée. Une redirection vers un successeur doit ressembler à ceci :
curl -sI https://example.com/product/ceramic-pour-over-v1/
Exemple de sortie :
HTTP/2 301
date: Wed, 04 Nov 2026 14:12:09 GMT
content-type: text/html; charset=UTF-8
location: https://example.com/product/ceramic-pour-over-v2/
Un produit retiré doit répondre HTTP/2 410, et un serveur plus ancien peut afficher HTTP/1.1 410 Gone. Si vous voyez plutôt HTTP/2 200, un cache répond avant votre règle; voyez le Dépannage. Suivez ensuite la redirection jusqu’au bout et comptez les sauts :
curl -sIL -o /dev/null -w '%{http_code} %{num_redirects} %{url_effective}\n' https://example.com/product/ceramic-pour-over-v1/
Exemple de sortie :
200 1 https://example.com/product/ceramic-pour-over-v2/
Vous voulez un 200 final après exactement 1 redirection. Un 2 ou plus indique une chaîne. Pour les pages qui reviennent et les pages d’archive, collez l’URL dans le test des résultats enrichis de Google et confirmez un élément Product avec la disponibilité OutOfStock ou BackOrder. Enfin, lancez l’Inspection de l’URL dans la Search Console sur le successeur et cliquez sur Demander une indexation. Quelques semaines plus tard, les anciennes URL devraient apparaître comme redirigées ou introuvables dans le rapport Pages.
Dépannage
Une chaîne de redirections apparaît quand le successeur est retiré à son tour. La version un pointe vers la version deux, qui pointe maintenant vers la version trois. Chaque saut retarde le transfert et perd des signaux. Modifiez la règle la plus ancienne pour qu’elle pointe directement vers le produit actuel, puis recomptez les sauts. Un ménage complet est expliqué dans Trouver et corriger les chaînes de redirections WordPress.
L’ancienne page à 200 revient sans cesse. Une extension de cache de pages ou un CDN (réseau de diffusion de contenu) sert une copie enregistrée avant que PHP s’exécute. Une règle de Redirection ne se déclenche alors jamais. Cherchez des en-têtes comme cf-cache-status: HIT ou x-litespeed-cache: hit dans la sortie de curl -sI. Videz cette URL dans le cache et dans le CDN, puis testez de nouveau.
Le schéma indique toujours InStock. Deux lignes de disponibilité veulent souvent dire que WooCommerce et une extension SEO affichent tous deux des données Product, ou que l’une d’elles lit un autre champ. Désactivez la source en double dans les réglages WooCommerce de l’extension SEO, videz le cache, puis vérifiez de nouveau avec le test des résultats enrichis.
Une règle de Redirection ne se déclenche jamais. La source correspond rarement à l’identique. Les causes fréquentes sont une barre oblique finale manquante, une base de produit comme /shop/ au lieu de /product/, ou un groupe désactivé. Vérifiez les options de barre oblique et de casse de la règle, et consultez le journal de l’extension pour voir l’URL réellement reçue.
La Search Console signale une page d’archive comme soft 404. Google a jugé la page trop mince pour être utile. Ajoutez du vrai contenu : ce qu’était le produit, pourquoi il a été retiré et deux ou trois solutions de rechange actuelles avec des liens. Si la page ne peut pas offrir cela, passez à une 301 vers la catégorie ou à un 410.
Quand cette approche n’est pas la bonne
Les produits saisonniers qui reviennent chaque année doivent garder leur URL en permanence, même après des mois en rupture. La page accumule de l’historique à chaque saison, et une redirection le ferait perdre.
Les gros catalogues qui renouvellent des milliers d’UGS (unités de gestion de stock) de fournisseurs chaque mois ne se prêtent pas à des choix URL par URL. Fixez la règle une fois dans votre processus d’importation. Servez ensuite les 410 par motif avec une map nginx plutôt qu’avec des blocs location un par un, comme le montre Redirections avec le module map de nginx.
Un produit rappelé doit garder sa page visible avec l’avis de rappel, à 200, quel que soit son trafic. Ici, l’information de sécurité compte plus que le classement.
Si vous diffusez aussi des annonces Google Shopping, Merchant Center lit votre flux de produits séparément de vos pages. Gardez à jour la valeur availability de chaque article dans le flux, et retirez les articles abandonnés du flux quand vous retirez leurs pages.
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.