
📝 Lägga till WooCommerce-ordernoteringar i e-postmeddelanden: en komplett guide
En kund lägger en order, och du lämnar en anteckning i adminpanelen: du förtydligade leveransdatumet, lade till ett spårningsnummer eller skrev helt enkelt "ring före leverans". Men kunden ser inte detta. Orderanteckningar i WooCommerce finns som standard bara i adminpanelen, i sidofältet för orderredigering. De visas inte i mejlen som skickas till köparen.
Problemet löses med ett enda kodsnutt i functions.php. Inga tillägg, ingen mallredigering, bara en ren hook som skriver ut anteckningar i mejlets brödtext. I praktiken har vi använt den här metoden på kundbutiker i flera år nu, utan problem efter WooCommerce-uppdateringar. I den här guiden går vi igenom hur WooCommerce lagrar orderanteckningar, vilken hook du ska använda och hur du anpassar utskriften efter dina behov.
💡 Snabb översikt:
- Hur WooCommerce lagrar orderanteckningar: kommentarstypen
order_noteoch funktionenwc_get_order_notes() - Två sätt att anpassa mejl: mallöverskrivningar eller hooks, och när du ska välja vilket
- En färdig kodsnutt för att visa anteckningar i orderbekräftelsemejlet med en rad-för-rad-genomgång
- Anpassning: styla listan, filtrera endast kundanteckningar, stöd för textmejl
- Testning via mejlförhandsvisning i adminpanelen, utan att spamma riktiga kunder
Steg 1: Hur WooCommerce lagrar orderanteckningar
WooCommerce lagrar anteckningar som WordPress-kommentarer av typen order_note. Varje åtgärd på en order (statusändring, återbetalning, adminanteckning eller kundmeddelande) sparas i tabellen wp_comments med flaggan comment_type = 'order_note'.
Skillnaden mellan interna anteckningar och kundanteckningar avgörs av metafältet is_customer_note. Om kryssrutan "Synlig på Mitt konto" är ikryssad när en anteckning läggs till sätter WooCommerce is_customer_note = true, och köparen ser den på sitt konto. Vanliga interna anteckningar (is_customer_note = false) visas inte för kunden någonstans.
I och med lanseringen av High Performance Order Storage (HPOS) i WooCommerce 8.2+ flyttades anteckningar till en separat tabell, wp_wc_order_notes. Direkta SQL-frågor mot wp_comments med HPOS aktiverat kan ge tomma resultat. Därför är det bättre att använda wc_get_order_notes() istället för get_comments(), eftersom den fungerar korrekt oavsett lagringsläge.
Steg 2: Mallar eller hooks, vilken metod ska du välja
WooCommerce erbjuder två vägar för mejlanpassning: mallöverskrivningar och action hooks. Båda har sina användningsområden.
Mallöverskrivningar. Du kopierar en fil från woocommerce/templates/emails/ till yourtheme/woocommerce/emails/ och redigerar HTML-koden direkt. Fördelen är full kontroll över märkspråket. Nackdelen är att efter större WooCommerce-uppdateringar kan din mall avvika från den aktuella versionen, och mejlen kan sluta fungera. Dokumentation om mallstruktur finns nu på woocommerce.com, inte den gamla docs.woothemes.com.
Hooks. Du kopplar en callback till action-hooken woocommerce_email_order_meta, och WooCommerce anropar din funktion på rätt plats i mejlet. Fördelen är att det inte beror på mallversioner och fungerar direkt efter kärnuppdateringar. Nackdelen är att du är begränsad till hookens position (den körs i orderns metadatablock, efter produkttabellen).
Kriterium | Mallar | Hooks |
|---|---|---|
Kontroll över märkspråk | Full | Inom hookens position |
Motståndskraft mot uppdateringar | Låg | Hög |
Implementeringskomplexitet | Högre | Lägre |
Bäst för | Fullständig omdesign av mejl | Lägga till ett enskilt block |
För vårt syfte att visa anteckningar är en hook mer än tillräckligt. Om du behöver göra om mejllayouterna helt, använd mallar och planera för att uppdatera dem ungefär var sjätte månad.
Steg 3: Lägga till koden i functions.php
Hooken woocommerce_email_order_meta körs i alla WooCommerces transaktionsmejl: orderbekräftelse, slutförd order, avbokning, faktura och andra. Fyra parametrar skickas till callback-funktionen: orderobjektet $order, flaggan $sent_to_admin, flaggan $plain_text och mejlobjektet $email.
Placera den här koden i ditt aktiva temas functions.php (eller via tillägget Code Snippets, vilket är säkrare eftersom det inte försvinner när du byter tema):
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 // 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 }
Här är vad som händer rad för rad:
- Rad 1. Vi registrerar hooken med prioritet 10 och accepterar alla 4 parametrar. Utan
10, 4skickar WooCommerce bara det första argumentet, och du får ett fel. - Rad 5-20. Hantering av textmejl. Vissa mejl skickas i textformat, så vi skriver ut anteckningar som en lista med bindestreck, utan HTML.
- Rad 24-28.
wc_get_order_notes()hämtar endast kundanteckningar (type => 'customer'). Ta bort filtret för att visa alla anteckningar, inklusive interna (statusändringar, återbetalningar). Om arrayen är tom skriver vi ingenting och belamrar inte mejlet. - Rad 34-38. Vi formaterar datumet med
date_i18n(), som respekterar webbplatsens språkinställning och format för datum/tid. - Rad 40-48.
printf()skriver ut varje anteckning i ett stylat block: lila stapel till vänster, ljus bakgrund, datum i grått nedanför.
Koden använder inga externa beroenden och är kompatibel med WooCommerce 3.2+ (funktionen wc_get_order_notes introducerades i denna version) och HPOS (inbyggt stöd från 8.2+).
Steg 4: Testa utan att spamma kunder
Efter att du lagt till koden, vänta inte på en riktig order för att testa. WooCommerce har en inbyggd mejlförhandsvisning: WooCommerce → Inställningar → Mejl → klicka på valfritt mejl → knappen "Förhandsvisa" längst ner. Du ser mejlet i både HTML och ren text, med en riktig order (den senaste används). Om det inte finns några ordrar, skapa en testorder manuellt.
Vad du ska kontrollera:
- En kundanteckning med "Synlig på Mitt konto" ikryssad visas i mejlet;
- En intern anteckning (utan kryssrutan) visas inte (om du behöll
type => 'customer'); - Textversionen av mejlet är inte trasig (växla via länken under förhandsvisningen);
- Anteckningsblocket dupliceras inte i adminmejl (lägg till en kontroll
if ( $sent_to_admin ) return;om det behövs).
Om du använder Code Snippets, avaktivera bara snutten för att återställa. Om du redigerade functions.php, kommentera bort eller ta bort koden. Inga spår lämnas i databasen.
⁉️🤔 Vanliga frågor
Kan jag visa ALLA anteckningar, inte bara kundanteckningar?
Ja. Ersätt
'type' => 'customer'med'type' => 'internal'för att bara få interna anteckningar. Ta bort parameterntypehelt för att få alla anteckningar. Tänk på att interna anteckningar kan innehålla serviceinformation (återbetalnings-ID, belopp) som kunder inte bör se. För de flesta butiker räcker'type' => 'customer'. Om du vill separera utskriften, skapa två block: först kundanteckningar med rubriken "Orderkommentarer", sedan interna anteckningar under rubriken "Leveransdetaljer" (detta är för adminmejl, med flaggan$sent_to_admin).
Fungerar koden för ett specifikt mejl eller alla?
Hooken
woocommerce_email_order_metakörs i alla transaktionsmejl: Slutförd order, Behandlar order, Order parkerad, Kundfaktura och så vidare. Om du behöver begränsa utskriften till endast orderbekräftelsemejlet, slå in koden i en kontroll:
1 > if ( 'customer_completed_order' !== $email->id ) { 2 > return; 3 > } 4 >
Den fullständiga listan över mejl-ID:n finns i WooCommerces dokumentation: customer_completed_order · customer_processing_order · customer_on_hold_order · customer_invoice · customer_refunded_order · customer_new_account · new_order · cancelled_order · failed_order.
Är det säkert att redigera functions.php på en live-webbplats?
Att redigera
functions.phpdirekt är en riskabel metod. Ett syntaxfel (en extra parentes, ett oavslutat citattecken) gör att hela webbplatsen visar en vit skärm. Det är säkrare att använda tillägget Code Snippets, som låter dig lägga till PHP-snuttar via adminpanelen och automatiskt inaktiverar kod med allvarliga fel. Ett alternativ är WPCode (gratisversion på wordpress.org), som erbjuder samma funktionalitet plus villkorslogik (endast admin, specifika sidor). Om du ändå redigerarfunctions.php, gör en säkerhetskopia av filen och ha FTP-åtkomst till hands. En vit skärm åtgärdas genom att ersättafunctions.phpmed originalfilen från din säkerhetskopia.
Anteckningar dupliceras i mejlen, vad har jag gjort för fel?
Två troliga orsaker. För det första: du har lagt till koden både i
functions.phpoch via ett snippets-tillägg, så hooken körs två gånger. Behåll bara en. För det andra: ditt tema eller ett annat tillägg kopplar redan en callback till samma hook. Kontrollera genom att söka i projektkoden (grep -r "woocommerce_email_order_meta" wp-content/). Om dupliceringen kommer från ett tillägg, ta helt enkelt bort din kod. Om den kommer från ett tema, slå in din callback iremove_action()föreadd_action()för att säkerställa att bara en hanterare körs.
Sammanfattning: är det värt att lägga till anteckningar i kundmejl
Kommunikationstransparens är ett av de billigaste sätten att minska supportbelastningen. När en kund ser "Spårningsnummer: X123456789, leverans 15 juni" i mejlet går de inte till chatten och frågar "var är min order?" En kodsnutt, inga tillägg, fem minuter att implementera, och effekten mäts i dussintals sparade ärenden per månad.
Om dina mejl redan är anpassade via mallar, bädda in anteckningsutskriften direkt i mallen istället för att använda en hook. Om du använder ett tillägg för mejlanpassning (Kadence, YayMail, ShopMagic) har var och en sin egen mekanism för att lägga till dynamiska block, så använd den istället för kod.
Testa med en mejltyp (Slutförd order), testa på en testorder och utvärdera efter en vecka om du får färre upprepade frågor från kunder. Nästan garanterat, ja.



