
📝 Ajouter les notes de commande WooCommerce dans l'e-mail : guide complet
Un client passe une commande, et vous laissez une note dans l'admin: vous avez précisé le délai de livraison, ajouté un numéro de suivi ou simplement écrit «appeler avant l'envoi». Mais le client ne le voit pas. Les notes de commande WooCommerce vivent par défaut uniquement dans l'admin, sur le panneau latéral d'édition de la commande. Dans les e-mails envoyés à l'acheteur, elles sont absentes.
Le problème se résout avec un seul snippet dans functions.php. Sans extensions, sans modifier les templates, un hook propre qui affiche les notes dans le corps de l'e-mail. En pratique, nous utilisons cette approche sur des boutiques clientes depuis plusieurs années déjà, sans une seule panne après les mises à jour de WooCommerce. Dans ce guide, nous verrons comment WooCommerce stocke les notes de commande, quel hook utiliser et comment personnaliser l'affichage selon vos besoins.
💡 Aperçu rapide:
- Comment WooCommerce stocke les notes de commande: le type de commentaire
order_noteet la fonctionwc_get_order_notes() - Deux approches de personnalisation des e-mails: la surcharge de templates ou les hooks, laquelle choisir et quand
- Un snippet prêt à l'emploi pour afficher les notes dans l'e-mail de commande terminée, avec l'analyse de chaque ligne
- Personnalisation: mise en forme de la liste, filtrage des seules notes client, prise en charge des e-mails plain-text
- Test via l'aperçu des e-mails dans l'admin, sans spammer les vrais clients
Étape 1: Comment WooCommerce stocke les notes de commande
WooCommerce stocke les notes sous forme de commentaires WordPress de type order_note. Chaque action sur une commande, changement de statut, refund, note de l'administrateur ou message au client, est enregistrée dans la table wp_comments avec le drapeau comment_type = 'order_note'.
La différence entre les notes internes et les notes client est déterminée par le méta-champ is_customer_note. Si la case «Visible in My Account» est activée lors de l'ajout d'une note, WooCommerce définit is_customer_note = true, et l'acheteur la voit dans son espace personnel. Les notes internes ordinaires (is_customer_note = false) ne sont montrées au client nulle part.
Avec la sortie du High Performance Order Storage (HPOS) dans WooCommerce 8.2+, les notes sont passées dans une table distincte wp_wc_order_notes. Les requêtes SQL directes vers wp_comments avec HPOS activé peuvent renvoyer un résultat vide. C'est pourquoi, au lieu de get_comments(), il vaut mieux utiliser wc_get_order_notes(), qui fonctionne correctement quel que soit le mode de stockage.
Étape 2: Templates ou hooks, quelle approche choisir
WooCommerce propose deux voies pour personnaliser les e-mails: la surcharge de templates et l'utilisation de hooks d'action. Chacune a son scénario.
Surcharge de templates. Vous copiez un fichier de woocommerce/templates/emails/ vers yourtheme/woocommerce/emails/ et modifiez le HTML directement. L'avantage, un contrôle total sur le balisage. L'inconvénient, lors de mises à jour majeures de WooCommerce votre template peut diverger de la version actuelle, et les e-mails commencent à casser. La documentation sur la structure des templates est désormais sur woocommerce.com, et non sur l'ancien docs.woothemes.com.
Hooks. Vous attachez un callback à l'action woocommerce_email_order_meta, et WooCommerce appelle lui-même votre fonction au bon endroit de l'e-mail. L'avantage, cela ne dépend pas des versions de templates, fonctionne «clé en main» après les mises à jour du cœur. L'inconvénient, vous êtes limité à la position du hook (il se déclenche dans le bloc de métadonnées de la commande, après le tableau des produits).
Critère | Templates | Hooks |
|---|---|---|
Contrôle sur le balisage | Total | Dans les limites de la position du hook |
Résistance aux mises à jour | Faible | Élevée |
Complexité de mise en œuvre | Plus élevée | Plus faible |
Convient pour | Une refonte complète de l'e-mail | Ajouter un seul bloc |
Pour notre tâche, l'affichage des notes, un hook est plus que suffisant. Si vous devez entièrement repenser le design des e-mails, prenez les templates et prévoyez du temps pour leur mise à jour tous les six mois environ.
Étape 3: Ajouter le code dans functions.php
Le hook woocommerce_email_order_meta se déclenche dans tous les e-mails transactionnels WooCommerce: confirmation de commande, exécution, annulation, facture et autres. Quatre paramètres sont passés au callback: l'objet de commande $order, le drapeau $sent_to_admin, le drapeau $plain_text et l'objet e-mail $email.
Placez ce code dans le functions.php du thème actif (ou via l'extension Code Snippets, plus sûr, il ne disparaîtra pas au changement de thème):
1 add_action( 'woocommerce_email_order_meta', 'sd_add_order_notes_to_email', 10, 4 ); 2 3 function sd_add_order_notes_to_email( $order, $sent_to_admin, $plain_text, $email ) { 4 // Ne pas casser la version plain-text de l'e-mail 5 if ( $plain_text ) { 6 echo "\n\n" . esc_html__( 'Order Notes:', 'woocommerce' ) . "\n"; 7 8 $notes = wc_get_order_notes( array( 9 'order_id' => $order->get_id(), 10 'type' => 'customer', 11 ) ); 12 13 if ( empty( $notes ) ) { 14 echo esc_html__( 'No notes for this order.', 'woocommerce' ) . "\n"; 15 return; 16 } 17 18 foreach ( $notes as $note ) { 19 echo '- ' . wp_strip_all_tags( $note->content ) . "\n"; 20 } 21 return; 22 } 23 24 // Version HTML : on récupère uniquement les notes client 25 $notes = wc_get_order_notes( array( 26 'order_id' => $order->get_id(), 27 'type' => 'customer', 28 ) ); 29 30 if ( empty( $notes ) ) { 31 return; 32 } 33 34 echo '<h2>' . esc_html__( 'Order Notes', 'woocommerce' ) . '</h2>'; 35 echo '<ul class="order-notes-list" style="list-style:none;padding:0;margin:0 0 24px;">'; 36 37 foreach ( $notes as $note ) { 38 $note_date = sprintf( 39 '%1$s à %2$s', 40 date_i18n( get_option( 'date_format' ), strtotime( $note->date_created ) ), 41 date_i18n( get_option( 'time_format' ), strtotime( $note->date_created ) ) 42 ); 43 44 printf( 45 '<li style="background:#f9f9f9;border-left:4px solid #7f54b3;padding:12px 16px;margin-bottom:10px;border-radius:0 4px 4px 0;">' 46 . '<div style="margin-bottom:4px;">%s</div>' 47 . '<small style="color:#888;">%s</small>' 48 . '</li>', 49 wp_kses_post( nl2br( $note->content ) ), 50 esc_html( $note_date ) 51 ); 52 } 53 54 echo '</ul>'; 55 }
Voici ce qui se passe, ligne par ligne:
- Ligne 1. On enregistre le hook avec la priorité 10 et on accepte les 4 paramètres. Sans
10, 4, WooCommerce ne passera que le premier argument, et vous obtiendrez une erreur. - Lignes 5-20. Traitement des e-mails plain-text. Certains e-mails partent en format texte, on affiche donc les notes sous forme de liste à tirets, sans HTML.
- Lignes 24-28.
wc_get_order_notes()demande uniquement les notes client (type => 'customer'). Retirez le filtre pour afficher toutes les notes, y compris internes (changements de statut, refund). Si le tableau est vide, on n'affiche rien et on n'encombre pas l'e-mail. - Lignes 34-38. On formate la date via
date_i18n(), qui respecte la locale du site et les réglages de format de date/heure. - Lignes 40-48.
printf()affiche chaque note dans un bloc stylisé: barre violette à gauche, fond clair, date en gris en dessous.
Le code n'utilise aucune dépendance externe et est compatible avec WooCommerce 3.2+ (la fonction wc_get_order_notes est apparue précisément dans cette version) et HPOS (prise en charge native depuis 8.2+).
Étape 4: Tester sans spammer les clients
Après avoir ajouté le code, n'attendez pas une vraie commande pour vérifier. WooCommerce offre un aperçu intégré des e-mails: WooCommerce → Réglages → Emails → cliquez sur n'importe quel e-mail → bouton «Preview» en bas. Vous verrez l'e-mail en HTML et en plain-text, avec une vraie commande (la dernière existante est utilisée). S'il n'y a pas de commandes, créez-en une de test manuellement.
Ce qu'il faut vérifier:
- Une note client avec «Visible in My Account» activé s'affiche dans l'e-mail;
- Une note interne (sans la case) ne s'affiche pas (si vous avez gardé
type => 'customer'); - La version plain-text de l'e-mail n'est pas cassée (basculez via le lien sous l'aperçu);
- Le bloc de notes n'est pas dupliqué dans les e-mails administrateur (ajoutez une vérification
if ( $sent_to_admin ) return;si nécessaire).
Si vous utilisez Code Snippets, il suffit de désactiver le snippet pour revenir en arrière. Si vous avez modifié functions.php, commentez ou supprimez le code. Aucune trace ne reste dans la base.
⁉️🤔 Questions fréquentes
Peut-on afficher TOUTES les notes, et pas seulement les notes client?
Oui. Remplacez
'type' => 'customer'par'type' => 'internal'pour n'obtenir que les notes internes. Retirez complètement le paramètretypepour obtenir toutes les notes d'affilée. Gardez à l'esprit que les notes internes peuvent contenir des informations de service (ID de refund, montants) que le client n'a pas à voir. Pour la plupart des boutiques,'type' => 'customer'suffit. Si vous voulez séparer l'affichage, faites deux blocs: d'abord les notes client sous le titre «Commentaires sur la commande», puis les internes sous le titre «Détails d'exécution» (c'est déjà pour les e-mails administrateur, drapeau$sent_to_admin).
Le code fonctionne-t-il pour un e-mail précis ou pour tous à la fois?
Le hook
woocommerce_email_order_metase déclenche dans tous les e-mails transactionnels: Completed Order, Processing Order, Order on Hold, Customer Invoice, et ainsi de suite. Si vous devez limiter l'affichage au seul e-mail de commande terminée, enveloppez le code dans une vérification:
1 if ( 'customer_completed_order' !== $email->id ) { 2 return; 3 }
La liste complète des ID d'e-mails est disponible dans la documentation WooCommerce: customer_completed_order · customer_processing_order · customer_on_hold_order · customer_invoice · customer_refunded_order · customer_new_account · new_order · cancelled_order · failed_order.
Est-il sûr de modifier functions.php sur un site en production?
Modifier
functions.phpdirectement, une approche risquée. Une erreur de syntaxe (une accolade en trop, un guillemet non fermé) met tout le site en écran blanc. Il est plus sûr d'utiliser l'extension Code Snippets, qui permet d'ajouter des snippets PHP via l'admin et désactive automatiquement le code avec une erreur fatale. Alternative: WPCode (version gratuite sur wordpress.org), les mêmes fonctionnalités plus une logique conditionnelle (uniquement pour les admins, uniquement sur certaines pages). Si vous modifiez tout de mêmefunctions.php, faites une sauvegarde du fichier et gardez un accès FTP à portée de main. Un écran blanc se répare en remplaçantfunctions.phppar l'original de la sauvegarde.
Les notes se dupliquent dans les e-mails, qu'ai-je mal fait?
Deux causes probables. Première: vous avez ajouté le code à la fois dans
functions.phpet via une extension de snippets, le hook se déclenche deux fois. Ne gardez qu'un seul. Deuxième: votre thème ou une autre extension attache déjà un callback à ce même hook. Vérifiez via une recherche dans le code du projet (grep -r "woocommerce_email_order_meta" wp-content/). Si la duplication vient d'une extension, il suffit de retirer votre code. Si elle vient du thème, enveloppez votre callback dansremove_action()avantadd_action()pour garantir qu'un seul gestionnaire s'exécute.
Au final: vaut-il la peine d'ajouter les notes aux e-mails clients
La transparence de la communication, l'un des moyens les moins chers de réduire la charge sur le support. Quand un client voit dans l'e-mail «Numéro de suivi: X123456789, livraison le 15 juin», il ne va pas écrire au chat «mais où est ma commande?». Un snippet, zéro extension, cinq minutes pour la mise en œuvre, et l'effet se mesure en dizaines de tickets économisés par mois.
Si les e-mails sont déjà personnalisés via des templates, intégrez l'affichage de la note directement dans le template, et non dans un hook. Si vous utilisez une extension de personnalisation des e-mails (Kadence, YayMail, ShopMagic), chacune a son propre mécanisme d'ajout de blocs dynamiques, utilisez-le au lieu du code.
Essayez avec un seul type d'e-mail (Completed Order), testez sur une commande de test et après une semaine évaluez si les questions répétitives des clients ont diminué. Presque certainement, oui.



