
Comment supprimer le bouton Ajouter au panier dans WooCommerce
Le bouton «Ajouter au panier» est le mécanisme fondamental de WooCommerce qui fait tourner votre boutique. Mais fondamental ne signifie pas toujours approprié. Un site vitrine sans possibilité de commande, un produit sur mesure nécessitant un devis individuel, un article épuisé qu’il ne faut pas encore dépublier: dans tous ces cas, le bouton Ajouter au panier standard devient gênant.
Vous pourriez adopter une approche radicale et passer le statut du produit en «masqué», mais il disparaît alors du catalogue et cesse d’être indexé. Une solution bien plus propre consiste à garder la fiche produit visible tout en supprimant ou en remplaçant le bouton d’achat. WooCommerce propose pour cela plusieurs hooks et filtres, de la désactivation globale à la suppression ciblée sur un seul produit.
Voici toutes les méthodes qui fonctionnent, de la plus simple à la plus avancée. Chacune a été testée sur la version actuelle de WooCommerce.
💡 Aperçu rapide:
- Tout le site d’un coup: deux appels
remove_actiondansfunctions.php, un pour la grille de produits et un pour la page produit - Page d’accueil et archives: filtre conditionnel
woocommerce_is_purchasableavecis_shop() - Toutes les catégories ou une catégorie spécifique: même filtre avec
is_product_category()ouis_product_category('slug') - Un seul produit: trois méthodes, bascule intégrée dans l’administration, mise à zéro du stock, filtre par
product_id - Pour ceux qui ont besoin d’un bouton: remplacez-le par un texte personnalisé ou un bouton «Demander un devis»
1. Supprimer le bouton sur l’ensemble du site
Si votre boutique fonctionne uniquement comme un catalogue sans intention de vente en ligne, l’approche la plus simple consiste à supprimer le bouton globalement à l’aide de deux hooks dans le functions.php de votre thème actif.
Le premier hook concerne les fiches produits dans la grille (le shortcode [products], la page boutique, les catégories), tandis que le second concerne les pages produit individuelles:
1 // Remove button from card grid 2 remove_action( 3 'woocommerce_after_shop_loop_item', 4 'woocommerce_template_loop_add_to_cart' 5 ); 6 7 // Remove button from product page 8 remove_action( 9 'woocommerce_single_product_summary', 10 'woocommerce_template_single_add_to_cart', 11 30 12 );
Il est préférable de placer ce code non pas directement dans le functions.php de votre thème (ce qui risque de perdre les modifications lors d’une mise à jour), mais via l’extension Code Snippets ou un thème enfant. Avant toute modification, effectuez une sauvegarde; sans elle, vous n’aurez aucun point de restauration.
2. Masquer le bouton sur la page d’accueil et les pages d’archive
La désactivation globale ne convient pas à tout le monde. Un scénario fréquent: le bouton doit rester présent sur la page produit mais disparaître du catalogue et de la page d’accueil (où les produits sont affichés en liste).
Ici, au lieu de remove_action, il est préférable d’utiliser le filtre woocommerce_is_purchasable avec une condition is_shop():
1 function ts_hide_cart_on_shop() { 2 if ( is_shop() || is_front_page() ) { 3 add_filter( 'woocommerce_is_purchasable', '__return_false' ); 4 } 5 } 6 add_action( 'wp', 'ts_hide_cart_on_shop' );
Le hook wp se déclenche tôt, avant le rendu, et évite des vérifications répétées qui ralentiraient la page. is_shop() couvre la page boutique principale, et is_front_page() couvre une page d’accueil statique si elle affiche un shortcode WooCommerce. Le filtre ne s’applique pas aux pages produit, l’achat y fonctionne donc normalement.
3. Supprimer le bouton de toutes les pages de catégorie
Même principe, mais remplacez is_shop() par is_product_category() sans paramètre. Le filtre interceptera toute catégorie de produits:
1 function ts_hide_cart_in_categories() { 2 if ( is_product_category() ) { 3 add_filter( 'woocommerce_is_purchasable', '__return_false' ); 4 } 5 } 6 add_action( 'wp', 'ts_hide_cart_in_categories' );
Le bouton reste présent sur les pages produit individuelles. C’est utile lorsque le catalogue sert de vitrine et que l’achat n’est disponible qu’après avoir navigué vers la fiche produit, par exemple pour que les utilisateurs lisent d’abord la description et les spécifications.
4. Désactiver le bouton pour une seule catégorie
Il arrive qu’une catégorie de votre boutique soit en commande personnalisée tandis que les autres sont standard. Dans ce cas, vous avez besoin d’un blocage ciblé par slug de catégorie:
1 function ts_hide_cart_for_category() { 2 if ( is_product_category( 'pod-zakaz' ) ) { 3 add_filter( 'woocommerce_is_purchasable', '__return_false' ); 4 } 5 } 6 add_action( 'wp', 'ts_hide_cart_for_category' );
Remplacez 'pod-zakaz' par le slug réel de votre catégorie cible. Vous trouverez le slug dans l’administration sous «Produits → Catégories», dans la colonne «Slug». Le filtre désactive silencieusement l’achat pour tous les produits de la catégorie; le bouton disparaîtra également sur la page produit car WooCommerce y vérifie aussi is_purchasable().
5. Masquer le bouton pour un produit spécifique
Le scénario le plus courant: un produit parmi des centaines doit temporairement s’afficher sans possibilité de commande. WooCommerce propose trois façons d’y parvenir.
Méthode 1: bascule intégrée dans l’administration
Allez modifier le produit, ouvrez l’onglet «Inventaire» et passez «État du stock» sur «En rupture de stock». Réglez la case «Autoriser les commandes en attente» sur «Ne pas autoriser». Enregistrez le produit, et le bouton Ajouter au panier disparaîtra automatiquement.

Cette approche ne nécessite aucun code et fonctionne immédiatement. L’inconvénient est que le produit est marqué comme «En rupture de stock», ce qui n’est pas toujours souhaitable (par exemple, pour les produits numériques ou les services où la notion de «stock» n’a pas de sens).
Méthode 2: mise à zéro de la quantité en stock
Dans le même onglet «Inventaire», décochez «Gérer le stock» ou réglez la quantité sur 0. Le bouton disparaîtra lorsque le stock restant atteindra zéro.

Cette méthode fonctionne bien pour les produits physiques: dès que la dernière unité est vendue, le bouton disparaît de lui-même. Cependant, comme la première méthode, le produit reçoit un statut de rupture de stock.
Méthode 3: filtre par ID produit
Si vous devez supprimer le bouton sans changer le statut «en stock», utilisez un filtre qui vérifie l’ID:
1 function ts_disable_cart_for_product( $purchasable, $product ) { 2 $target_ids = array( 22, 47, 103 ); // Product IDs for which we remove the button 3 if ( in_array( $product->get_id(), $target_ids ) ) { 4 return false; 5 } 6 return $purchasable; 7 } 8 add_filter( 'woocommerce_is_purchasable', 'ts_disable_cart_for_product', 10, 2 );
Voici ce qui se passe: le filtre woocommerce_is_purchasable reçoit le statut $purchasable actuel et l’objet $product. Si $product->get_id() correspond à l’un des ID du tableau $target_ids, il retourne false et le bouton est supprimé. Pour tous les autres produits, le statut d’origine est retourné.
$product->get_id() est la méthode en vigueur depuis WooCommerce 3.0. L’ancienne propriété $product->id (accès direct au champ) est obsolète et génère des notifications dans les logs; ne l’utilisez pas.
Vous pouvez étendre le tableau $target_ids selon vos besoins. Trouvez l’ID du produit dans l’administration: survolez le nom du produit dans la liste et l’ID apparaîtra dans la barre d’état du navigateur (ou ouvrez le produit et regardez le numéro dans l’URL: post=22).
6. Remplacer le bouton par un texte personnalisé
Parfois, vous n’avez pas besoin de supprimer le bouton, mais de le remplacer. Par exemple, pour des produits sur mesure, vous pourriez afficher «Demander un devis» avec un lien vers un formulaire de contact.
1 function ts_replace_cart_button_single( $html, $product ) { 2 $target_ids = array( 22 ); 3 if ( in_array( $product->get_id(), $target_ids ) ) { 4 return '<a href="/contact" class="button alt">Request a quote</a>'; 5 } 6 return $html; 7 } 8 add_filter( 'woocommerce_loop_add_to_cart_link', 'ts_replace_cart_button_single', 10, 2 );
Ce filtre intercepte le HTML du bouton avant l’affichage et le remplace par un lien personnalisé utilisant la classe .button. Il fonctionne à la fois pour la grille de produits et pour la page produit; WooCommerce utilise le même filtre dans les deux contextes.
Pour une logique plus complexe (texte différent selon les produits, bouton personnalisé avec fenêtre modale), étudiez woocommerce_template_single_add_to_cart pour une substitution complète du template de bouton via un thème enfant.
⁉️🤔 Questions fréquentes
Est-il sûr de modifier directement functions.php?
Sans expérience, non. functions.php s’exécute à chaque requête, et une erreur de syntaxe dans ce fichier fait planter tout le site (écran blanc). Utilisez l’extension Code Snippets, qui fournit une interface pour ajouter des fragments PHP avec vérification syntaxique et désactivation automatique en cas d’erreur fatale. Vous pouvez aussi intervenir via FTP/SFTP après avoir conservé une copie fonctionnelle du fichier en local.
Comment masquer le bouton uniquement pour les utilisateurs non connectés?
Ajoutez une vérification
is_user_logged_in()à l’une des conditions ci-dessus. Par exemple:if ( ! is_user_logged_in() && is_shop() ) { add_filter(...); }. Les visiteurs voient une vitrine sans boutons; les utilisateurs enregistrés bénéficient de toutes les fonctionnalités. C’est un cas d’usage courant pour les boutiques en gros où les prix et le panier ne deviennent accessibles qu’après connexion.
Le bouton a disparu mais le prix et les variations sont restés; est-ce normal?
Oui. Les hooks
remove_actionet le filtrewoocommerce_is_purchasablesuppriment uniquement le bouton d’ajout au panier. Le prix et les sélecteurs de variation (couleur, taille) restent visibles. Si vous devez également les masquer, ajoutez du CSS:.single-product .variations_form, .single-product .price { display: none; }, ou utilisez une intervention plus profonde viawoocommerce_get_price_html.
Après une mise à jour du thème, toutes mes modifications ont été perdues; comment m’en prémunir?
Ne faites jamais de modifications directement dans le
functions.phpdu thème parent. Toute mise à jour du thème écrasera le fichier. Trois options fiables: un thème enfant (avec son proprefunctions.php), l’extension Code Snippets (les snippets résident dans la base de données et survivent aux mises à jour), ou un simple MU-plugin (/wp-content/mu-plugins/disable-cart.php, qui ne peut pas être désactivé depuis l’administration et n’est pas affecté par les mises à jour).
Puis-je restaurer le bouton pour un produit spécifique après une désactivation globale?
Oui. Après que le filtre
woocommerce_is_purchasablea retourné globalement__return_false, ajoutez un second filtre avec une priorité plus élevée qui retournetruepour les ID souhaités:add_filter( 'woocommerce_is_purchasable', 'ts_enable_for_specific', 20, 2 );. La priorité 20 s’exécute après 10 et peut outrepasser la valeur de retour.
Quelle méthode choisir pour votre besoin
Si vous construisez un catalogue sans paiement en ligne, utilisez la désactivation globale avec deux appels remove_action. Besoin de bloquer les achats dans le catalogue tout en les conservant dans les fiches produit? Utilisez le filtre avec is_shop(). Une catégorie problématique? Utilisez is_product_category('slug'). Un produit parmi des centaines? Utilisez les paramètres de stock intégrés ou le filtre par ID.
Et surtout: avant de modifier quoi que ce soit dans functions.php, faites une sauvegarde. Pas via une extension que vous vous apprêtez à modifier, mais une sauvegarde complète via votre hébergement ou UpdraftPlus. Cinq minutes consacrées à une sauvegarde vous épargnent des heures de restauration.



