Un client qui vend des bougies artisanales m’a un jour envoyé une liste de douze demandes après la mise en ligne de sa boutique WooCommerce : « le bouton devrait dire Je commande », « il faut un champ pour le numéro d’appartement », « la livraison gratuite doit s’afficher plus tôt »… Aucune de ces demandes ne justifiait une extension supplémentaire. Toutes se règlent avec un filtre ou une action, en quelques lignes.
Voici dix snippets que je réutilise régulièrement, glanés au fil des projets pour des boutiques de tailles très différentes. Chacun s’ajoute dans le functions.php du thème enfant ou, mieux, dans une extension maison dédiée aux personnalisations métier.
Renommer le texte des boutons
Le filtre woocommerce_product_single_add_to_cart_text change le texte du bouton sur la fiche produit, et woocommerce_product_add_to_cart_text fait de même sur les pages d’archive.
add_filter( 'woocommerce_product_single_add_to_cart_text', function () {
return __( 'Je commande', 'mon-theme' );
} );
Pour un texte différent selon le type de produit (variable, externe), on peut tester $product->is_type() dans le même filtre avant de retourner la chaîne.
Ajouter un champ à la commande
Le trio woocommerce_after_order_notes, woocommerce_checkout_process et woocommerce_checkout_update_order_meta permet d’ajouter, valider puis enregistrer un champ personnalisé, par exemple un numéro d’appartement ou un créneau de livraison.

add_action( 'woocommerce_after_order_notes', function ( $checkout ) {
woocommerce_form_field( 'creneau_livraison', [
'type' => 'select',
'label' => __( 'Créneau de livraison', 'mon-theme' ),
'options' => [
'matin' => __( 'Matin (8h-12h)', 'mon-theme' ),
'apres_midi' => __( 'Après-midi (14h-18h)', 'mon-theme' ),
],
'required' => true,
], $checkout->get_value( 'creneau_livraison' ) );
} );
add_action( 'woocommerce_checkout_process', function () {
if ( empty( $_POST['creneau_livraison'] ) ) {
wc_add_notice( __( 'Merci de choisir un créneau de livraison.', 'mon-theme' ), 'error' );
}
} );
add_action( 'woocommerce_checkout_update_order_meta', function ( $order_id ) {
if ( ! empty( $_POST['creneau_livraison'] ) ) {
update_post_meta( $order_id, '_creneau_livraison', sanitize_text_field( $_POST['creneau_livraison'] ) );
}
} );
Afficher la livraison gratuite plus tôt
Sur une boutique qui offrait la livraison au-delà de 60 €, le client voulait un message dès que le panier atteignait 40 €, pour inciter à l’achat complémentaire. Le hook woocommerce_before_cart associé à WC()->cart->get_cart_contents_total() suffit :
add_action( 'woocommerce_before_cart', function () {
$seuil = 60;
$total = WC()->cart->get_cart_contents_total();
$reste = $seuil - $total;
if ( $reste > 0 ) {
echo '<p class="notice-livraison">';
printf( __( 'Plus que %s pour la livraison offerte !', 'mon-theme' ), wc_price( $reste ) );
echo '</p>';
}
} );
Rediriger après l’ajout au panier
Certains clients veulent envoyer l’acheteur directement vers le panier plutôt que rester sur la fiche produit. Un simple filtre sur l’URL de redirection règle le cas :
add_filter( 'woocommerce_add_to_cart_redirect', 'wc_get_cart_url' )pour rediriger systématiquement vers le panier.- Utile aussi pour rediriger vers une page de vente incitative, en retournant une URL personnalisée.
Masquer un moyen de paiement selon la zone
Pour un client qui ne voulait proposer le paiement à la livraison qu’en France métropolitaine, le filtre woocommerce_available_payment_gateways a permis de retirer la passerelle sans toucher aux réglages globaux :
add_filter( 'woocommerce_available_payment_gateways', function ( $gateways ) {
if ( isset( $gateways['cod'] ) && WC()->customer->get_shipping_country() !== 'FR' ) {
unset( $gateways['cod'] );
}
return $gateways;
} );
Autres demandes fréquentes
- Masquer le prix et remplacer le bouton d’ajout par « Sur devis » via
woocommerce_get_price_html. - Modifier le nombre d’articles par page dans le catalogue avec
loop_shop_per_page. - Ajouter une note automatique à chaque commande grâce à
woocommerce_checkout_update_order_meta. - Changer l’ordre des onglets produit via le filtre
woocommerce_product_tabs.
Avant d’écrire un snippet, je vérifie toujours qu’il n’existe pas déjà un réglage natif dans WooCommerce : la moitié des demandes se règlent dans les paramètres, sans une ligne de code.
Bonnes pratiques pour ranger ces snippets
Regrouper ces personnalisations dans une extension maison plutôt que dans le thème évite de les perdre lors d’un changement de thème graphique. Je découpe généralement le fichier par domaine : class-checkout-fields.php, class-shipping-messages.php, etc., chargés depuis un fichier principal.
| Snippet | Hook principal | Risque si mal fait |
|---|---|---|
| Champ de commande | woocommerce_checkout_update_order_meta | Donnée perdue si non enregistrée |
| Livraison gratuite | woocommerce_before_cart | Message qui ne se met pas à jour en AJAX |
| Masquer un paiement | woocommerce_available_payment_gateways | Blocage total si mal filtré |
Notre verdict
Ces dix snippets couvrent l’essentiel des demandes reçues sur des boutiques de taille modeste à moyenne. Ils ont un avantage sur les extensions dédiées : ils ne chargent aucun script ou style supplémentaire, et restent lisibles pour la personne qui reprendra le projet dans deux ans. La seule discipline à tenir, c’est de documenter chaque filtre avec un commentaire expliquant la demande d’origine du client.