Skip to content

Tutto per WordPress, lo sviluppo web — e non solo

📝 Aggiungere le note degli ordini WooCommerce alle email: una guida completa

📝 Aggiungere le note degli ordini WooCommerce alle email: una guida completa

Un cliente effettua un ordine e tu lasci una nota nel pannello di amministrazione: hai chiarito la data di consegna, aggiunto un codice di tracciamento o semplicemente scritto «chiamare prima della spedizione». Ma il cliente non la vede. Le note dell'ordine in WooCommerce risiedono solo nel pannello di amministrazione per impostazione predefinita, nella barra laterale di modifica dell'ordine. Non compaiono nelle email inviate all'acquirente.

Il problema si risolve con un singolo snippet in functions.php. Nessun plugin, nessuna modifica ai template, solo un hook pulito che restituisce le note nel corpo dell'email. In pratica, usiamo questo approccio sui negozi dei clienti da diversi anni, senza alcun problema dopo gli aggiornamenti di WooCommerce. In questa guida vedremo come WooCommerce archivia le note dell'ordine, quale hook utilizzare e come personalizzare l'output in base alle tue esigenze.

💡 Panoramica rapida:

  • Come WooCommerce archivia le note dell'ordine: il tipo di commento order_note e la funzione wc_get_order_notes()
  • Due approcci alla personalizzazione delle email: override dei template o hook, e quando scegliere l'uno o l'altro
  • Uno snippet pronto all'uso per mostrare le note nell'email di ordine completato, con spiegazione riga per riga
  • Personalizzazione: stilizzare l'elenco, filtrare solo le note per il cliente, supportare le email in testo semplice
  • Test tramite anteprima email nel pannello di amministrazione, senza disturbare clienti reali

Step 1: Come WooCommerce archivia le note dell'ordine

WooCommerce archivia le note come commenti di WordPress del tipo order_note. Ogni azione su un ordine (cambio di stato, rimborso, nota dell'amministratore o messaggio del cliente) viene registrata nella tabella wp_comments con il flag comment_type = 'order_note'.

La differenza tra note interne e note per il cliente è determinata dal meta campo is_customer_note. Se la casella «Visibile nel Mio account» è selezionata quando si aggiunge una nota, WooCommerce imposta is_customer_note = true e l'acquirente la vede nel proprio account. Le normali note interne (is_customer_note = false) non vengono mostrate al cliente da nessuna parte.

Con il rilascio di High Performance Order Storage (HPOS) in WooCommerce 8.2+, le note sono state spostate in una tabella separata wp_wc_order_notes. Le query SQL dirette a wp_comments con HPOS attivo potrebbero restituire risultati vuoti. Pertanto, invece di get_comments(), è meglio usare wc_get_order_notes(), che funziona correttamente indipendentemente dalla modalità di archiviazione.

Step 2: Template o hook, quale approccio scegliere

WooCommerce offre due strade per la personalizzazione delle email: override dei template e action hook. Ognuna ha il suo caso d'uso.

Override dei template. Copi un file da woocommerce/templates/emails/ in yourtheme/woocommerce/emails/ e modifichi direttamente l'HTML. Il vantaggio è il pieno controllo sul markup. Lo svantaggio è che dopo aggiornamenti importanti di WooCommerce, il tuo template potrebbe divergere dalla versione corrente e le email potrebbero iniziare a rompersi. La documentazione sulla struttura dei template è ora su woocommerce.com, non sul vecchio docs.woothemes.com.

Hook. Colleghi una callback all'azione woocommerce_email_order_meta e WooCommerce chiama la tua funzione nel punto giusto dell'email. Il vantaggio è che non dipende dalle versioni del template e funziona senza problemi dopo gli aggiornamenti del core. Lo svantaggio è che sei limitato alla posizione dell'hook (viene eseguito nel blocco dei metadati dell'ordine, dopo la tabella dei prodotti).

Criterio

Template

Hook

Controllo sul markup

Completo

Entro la posizione dell'hook

Resistenza agli aggiornamenti

Bassa

Alta

Complessità di implementazione

Più alta

Più bassa

Ideale per

Ridisegno completo dell'email

Aggiunta di un singolo blocco

Per il nostro obiettivo di mostrare le note, un hook è più che sufficiente. Se hai bisogno di ridisegnare completamente il layout delle email, usa i template e pianifica di aggiornarli ogni sei mesi circa.

Step 3: Aggiungere il codice a functions.php

L'hook woocommerce_email_order_meta viene eseguito in tutte le email transazionali di WooCommerce: conferma ordine, completamento, cancellazione, fattura e altre. Alla callback vengono passati quattro parametri: l'oggetto ordine $order, il flag $sent_to_admin, il flag $plain_text e l'oggetto email $email.

Inserisci questo codice nel functions.php del tuo tema attivo (o tramite il plugin Code Snippets, che è più sicuro poiché non andrà perso cambiando tema):

1add_action( 'woocommerce_email_order_meta', 'sd_add_order_notes_to_email', 10, 4 );
2
3function sd_add_order_notes_to_email( $order, $sent_to_admin, $plain_text, $email ) {
4 // Don't break the plain-text version of the email
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 // HTML version: get only customer notes
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 at %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}

Ecco cosa succede riga per riga:

  • Riga 1. Registriamo l'hook con priorità 10 e accettiamo tutti e 4 i parametri. Senza 10, 4, WooCommerce passerà solo il primo argomento e otterrai un errore.
  • Righe 5-20. Gestione delle email in testo semplice. Alcune email vengono inviate in formato testo, quindi restituiamo le note come un elenco con trattini, senza HTML.
  • Righe 24-28. wc_get_order_notes() richiede solo le note per il cliente (type => 'customer'). Rimuovi il filtro per mostrare tutte le note, incluse quelle interne (cambi di stato, rimborsi). Se l'array è vuoto, non restituiamo nulla e non ingombriamo l'email.
  • Righe 34-38. Formattiamo la data usando date_i18n(), che rispetta la lingua del sito e le impostazioni del formato data/ora.
  • Righe 40-48. printf() restituisce ogni nota in un blocco stilizzato: barra viola a sinistra, sfondo chiaro, data in grigio sotto.

Il codice non utilizza dipendenze esterne ed è compatibile con WooCommerce 3.2+ (la funzione wc_get_order_notes è stata introdotta in questa versione) e con HPOS (supporto nativo dalla 8.2+).

Step 4: Testare senza disturbare i clienti

Dopo aver aggiunto il codice, non aspettare un ordine reale per testare. WooCommerce fornisce un'anteprima email integrata: WooCommerce → Impostazioni → Email → clicca su una qualsiasi email → pulsante «Anteprima» in basso. Vedrai l'email sia in HTML che in testo semplice, usando un ordine reale (viene usato il più recente). Se non ci sono ordini, creane uno di test manualmente.

Cosa verificare:

  • Una nota per il cliente con «Visibile nel Mio account» attivato compare nell'email;
  • Una nota interna (senza la casella selezionata) non compare (se hai mantenuto type => 'customer');
  • La versione in testo semplice dell'email non è rotta (passa tramite il link sotto l'anteprima);
  • Il blocco delle note non è duplicato nelle email per l'amministratore (aggiungi un controllo if ( $sent_to_admin ) return; se necessario).

Se stai usando Code Snippets, disattiva semplicemente lo snippet per tornare indietro. Se hai modificato functions.php, commenta o cancella il codice. Non rimangono tracce nel database.

⁉️🤔 Domande frequenti

Posso mostrare TUTTE le note, non solo quelle per il cliente?

Sì. Sostituisci 'type' => 'customer' con 'type' => 'internal' per ottenere solo le note interne. Rimuovi del tutto il parametro type per ottenere tutte le note. Tieni presente che le note interne possono contenere informazioni di servizio (ID rimborso, importi) che i clienti non dovrebbero vedere. Per la maggior parte dei negozi, 'type' => 'customer' è sufficiente. Se vuoi separare l'output, crea due blocchi: prima le note per il cliente con l'intestazione «Commenti sull'ordine», poi le note interne sotto l'intestazione «Dettagli di evasione» (questo per le email amministrative, usando il flag $sent_to_admin).

Il codice funziona per un'email specifica o per tutte?

L'hook woocommerce_email_order_meta viene eseguito in tutte le email transazionali: Ordine completato, Ordine in elaborazione, Ordine in sospeso, Fattura cliente e così via. Se devi limitare l'output alla sola email di ordine completato, racchiudi il codice in un controllo:

1> if ( 'customer_completed_order' !== $email->id ) {
2> return;
3> }
4>

L'elenco completo degli ID email è disponibile nella documentazione di 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.

È sicuro modificare functions.php su un sito live?

Modificare direttamente functions.php è un approccio rischioso. Un errore di sintassi (una parentesi di troppo, una virgoletta non chiusa) farà sì che l'intero sito mostri una schermata bianca. È più sicuro usare il plugin Code Snippets, che ti permette di aggiungere snippet PHP tramite il pannello di amministrazione e disattiva automaticamente il codice con errori fatali. Un'alternativa è WPCode (versione gratuita su wordpress.org), che offre la stessa funzionalità più la logica condizionale (solo amministratore, solo pagine specifiche). Se modifichi comunque functions.php, fai un backup del file e tieni a portata di mano l'accesso FTP. Una schermata bianca si risolve sostituendo functions.php con l'originale del tuo backup.

Le note si duplicano nelle email, cosa ho sbagliato?

Due probabili cause. Prima: hai aggiunto il codice sia in functions.php che tramite un plugin di snippet, quindi l'hook viene eseguito due volte. Tienine solo uno. Seconda: il tuo tema o un altro plugin sta già collegando una callback a questo stesso hook. Verifica cercando nel codice del progetto (grep -r "woocommerce_email_order_meta" wp-content/). Se la duplicazione proviene da un plugin, rimuovi semplicemente il tuo codice. Se proviene da un tema, racchiudi la tua callback in remove_action() prima di add_action() per assicurarti che venga eseguito un solo gestore.

In conclusione: vale la pena aggiungere le note alle email dei clienti

La trasparenza nella comunicazione è uno dei modi più economici per ridurre il carico di lavoro del supporto. Quando un cliente vede «Codice di tracciamento: X123456789, consegna 15 giugno» nell'email, non va in chat a chiedere «dov'è il mio ordine?». Uno snippet, zero plugin, cinque minuti per implementare, e l'effetto si misura in decine di ticket risparmiati al mese.

Se le tue email sono già personalizzate tramite template, incorpora l'output delle note direttamente nel template invece di usare un hook. Se usi un plugin di personalizzazione email (Kadence, YayMail, ShopMagic), ognuno ha il proprio meccanismo per aggiungere blocchi dinamici, quindi usa quello invece del codice.

Prova con un tipo di email (Ordine completato), testa su un ordine di prova e dopo una settimana valuta se ricevi meno domande ripetitive dai clienti. Quasi certamente, sì.