
📝 Legge til WooCommerce-ordrenotater i e-poster: en komplett guide
En kunde legger inn en bestilling, og du legger igjen et notat i adminpanelet: du avklarte leveringsdatoen, la til et sporingsnummer eller skrev rett og slett «ring før forsendelse». Men kunden ser ikke dette. Ordrenotater i WooCommerce lever som standard kun i adminpanelet, i sidefeltet for ordreredigering. De vises ikke i e-postene som sendes til kjøperen.
Problemet løses med en enkelt kodebit i functions.php. Ingen utvidelser, ingen malredigering, bare en ryddig hook som skriver ut notater i e-postens brødtekst. I praksis har vi brukt denne tilnærmingen på kundebutikker i flere år nå, uten feil etter WooCommerce-oppdateringer. I denne guiden går vi gjennom hvordan WooCommerce lagrer ordrenotater, hvilken hook du bør bruke, og hvordan du tilpasser utskriften etter dine behov.
💡 Rask oversikt:
- Hvordan WooCommerce lagrer ordrenotater: kommentartypen
order_noteog funksjonenwc_get_order_notes() - To tilnærminger til e-posttilpasning: maloverstyringer eller hooks, og når du bør velge hvilken
- En klar-til-bruk kodebit for å vise notater i e-posten for fullført ordre, med en linje-for-linje-gjennomgang
- Tilpasning: stilsetting av listen, filtrering av kun kundenotater, støtte for ren tekst-e-post
- Testing via e-postforhåndsvisning i adminpanelet, uten å spamme ekte kunder
Trinn 1: Hvordan WooCommerce lagrer ordrenotater
WooCommerce lagrer notater som WordPress-kommentarer av typen order_note. Hver handling på en ordre (statusendring, refusjon, adminnotat eller kundemelding) registreres i wp_comments-tabellen med flagget comment_type = 'order_note'.
Forskjellen mellom interne notater og kundenotater avgjøres av metafeltet is_customer_note. Hvis avkrysningsboksen «Synlig på Min konto» er aktivert når et notat legges til, setter WooCommerce is_customer_note = true, og kjøperen ser det på sin konto. Vanlige interne notater (is_customer_note = false) vises ikke for kunden noe sted.
Med lanseringen av High Performance Order Storage (HPOS) i WooCommerce 8.2+ ble notater flyttet til en egen wp_wc_order_notes-tabell. Direkte SQL-spørringer mot wp_comments med HPOS aktivert kan returnere tomme resultater. Derfor er det bedre å bruke wc_get_order_notes() i stedet for get_comments(), da denne fungerer korrekt uavhengig av lagringsmodus.
Trinn 2: Maler eller hooks, hvilken tilnærming bør du velge
WooCommerce tilbyr to veier for e-posttilpasning: maloverstyringer og action hooks. Hver har sitt bruksområde.
Maloverstyringer. Du kopierer en fil fra woocommerce/templates/emails/ til yourtheme/woocommerce/emails/ og redigerer HTML-en direkte. Fordelen er full kontroll over oppmerkingen. Ulempen er at etter større WooCommerce-oppdateringer kan malen din avvike fra gjeldende versjon, og e-poster kan begynne å feile. Dokumentasjon om malstruktur finnes nå på woocommerce.com, ikke den gamle docs.woothemes.com.
Hooks. Du fester en callback til actionen woocommerce_email_order_meta, og WooCommerce kaller funksjonen din på riktig sted i e-posten. Fordelen er at den ikke avhenger av malversjoner og fungerer rett ut av boksen etter kjerneoppdateringer. Ulempen er at du er begrenset til hookens posisjon (den fyres av i blokken for ordremetadata, etter produkttabellen).
Kriterium | Maler | Hooks |
|---|---|---|
Kontroll over oppmerking | Full | Innenfor hookens posisjon |
Motstandsdyktighet mot oppdateringer | Lav | Høy |
Implementeringskompleksitet | Høyere | Lavere |
Best for | Fullstendig e-postredesign | Legge til en enkelt blokk |
For vår oppgave med å vise notater er en hook mer enn tilstrekkelig. Hvis du trenger å redesigne e-postoppsett fullstendig, bruk maler og planlegg for å oppdatere dem omtrent hver sjette måned.
Trinn 3: Legge til koden i functions.php
Hooken woocommerce_email_order_meta fyres av i alle WooCommerce-transaksjonse-poster: ordrebekreftelse, fullført, kansellering, faktura og andre. Fire parametere sendes til callbacken: ordreobjektet $order, flagget $sent_to_admin, flagget $plain_text og e-postobjektet $email.
Plasser denne koden i ditt aktive temas functions.php (eller via utvidelsen Code Snippets, som er tryggere siden den ikke går tapt ved temabytte):
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 }
Her er hva som skjer linje for linje:
- Linje 1. Vi registrerer hooken med prioritet 10 og aksepterer alle 4 parametere. Uten
10, 4vil WooCommerce kun sende det første argumentet, og du får en feil. - Linje 5-20. Håndtering av ren tekst-e-post. Noen e-poster sendes i tekstformat, så vi skriver ut notater som en liste med bindestreker, uten HTML.
- Linje 24-28.
wc_get_order_notes()ber kun om kundenotater (type => 'customer'). Fjern filteret for å vise alle notater, inkludert interne (statusendringer, refusjoner). Hvis matrisen er tom, skriver vi ingenting ut og rotet ikke til e-posten. - Linje 34-38. Vi formaterer datoen med
date_i18n(), som respekterer nettstedets språk og innstillinger for dato/tid-format. - Linje 40-48.
printf()skriver ut hvert notat i en stilet blokk: lilla strek til venstre, lys bakgrunn, dato i grått under.
Koden bruker ingen eksterne avhengigheter og er kompatibel med WooCommerce 3.2+ (funksjonen wc_get_order_notes ble introdusert i denne versjonen) og HPOS (nativ støtte fra 8.2+).
Trinn 4: Testing uten å spamme kunder
Etter at du har lagt til koden, ikke vent på en ekte ordre for å teste. WooCommerce har en innebygd e-postforhåndsvisning: WooCommerce → Innstillinger → E-poster → klikk på en e-post → «Forhåndsvis»-knapp nederst. Du vil se e-posten i både HTML og ren tekst, med bruk av en ekte ordre (den nyeste brukes). Hvis det ikke finnes noen ordre, opprett en testordre manuelt.
Hva du bør sjekke:
- Et kundenotat med «Synlig på Min konto» aktivert vises i e-posten;
- Et internt notat (uten avkrysningsboksen) vises ikke (hvis du beholdt
type => 'customer'); - Ren tekst-versjonen av e-posten er ikke ødelagt (bytt via lenken under forhåndsvisningen);
- Notatblokken dupliseres ikke i admin-e-poster (legg til en sjekk
if ( $sent_to_admin ) return;om nødvendig).
Hvis du bruker Code Snippets, deaktiverer du bare kodebiten for å rulle tilbake. Hvis du redigerte functions.php, kommenter ut eller slett koden. Ingen spor etterlates i databasen.
⁉️🤔 Ofte stilte spørsmål
Kan jeg vise ALLE notater, ikke bare kundenotater?
Ja. Erstatt
'type' => 'customer'med'type' => 'internal'for å få kun interne notater. Fjerntype-parameteren helt for å få alle notater. Husk at interne notater kan inneholde serviceinformasjon (refusjons-ID-er, beløp) som kunder ikke bør se. For de fleste butikker er'type' => 'customer'tilstrekkelig. Hvis du vil skille utskriften, opprett to blokker: først kundenotater med overskriften «Ordrekommentarer», deretter interne notater under overskriften «Oppfyllingsdetaljer» (dette er for admin-e-poster, ved bruk av$sent_to_admin-flagget).
Fungerer koden for en spesifikk e-post eller alle sammen?
Hooken
woocommerce_email_order_metafyres av i alle transaksjonse-poster: Fullført ordre, Behandler ordre, Ordre på vent, Kundefaktura og så videre. Hvis du trenger å begrense utskriften til kun e-posten for fullført ordre, pakk inn koden i en sjekk:
1 > if ( 'customer_completed_order' !== $email->id ) { 2 > return; 3 > } 4 >
Den fullstendige listen over e-post-ID-er er tilgjengelig i WooCommerce-dokumentasjonen: customer_completed_order · customer_processing_order · customer_on_hold_order · customer_invoice · customer_refunded_order · customer_new_account · new_order · cancelled_order · failed_order.
Er det trygt å redigere functions.php på et live-nettsted?
Å redigere
functions.phpdirekte er en risikabel tilnærming. En syntaksfeil (en ekstra parentes, et uavsluttet anførselstegn) vil føre til at hele nettstedet viser en hvit skjerm. Det er tryggere å bruke utvidelsen Code Snippets, som lar deg legge til PHP-kodebiter via adminpanelet og automatisk deaktiverer kode med fatale feil. Et alternativ er WPCode (gratisversjon på wordpress.org), som tilbyr samme funksjonalitet pluss betinget logikk (kun admin, kun spesifikke sider). Hvis du likevel redigererfunctions.php, ta en sikkerhetskopi av filen og ha FTP-tilgang klar. En hvit skjerm fikses ved å erstattefunctions.phpmed originalen fra sikkerhetskopien din.
Notater dupliseres i e-poster, hva gjorde jeg galt?
To sannsynlige årsaker. For det første: du la til koden både i
functions.phpog via en kodebitutvidelse, så hooken fyres av to ganger. Behold kun én. For det andre: ditt tema eller en annen utvidelse fester allerede en callback til denne samme hooken. Sjekk ved å søke i prosjektkoden (grep -r "woocommerce_email_order_meta" wp-content/). Hvis dupliseringen kommer fra en utvidelse, fjern bare koden din. Hvis fra et tema, pakk inn callbacken din iremove_action()føradd_action()for å sikre at kun én handler kjører.
Oppsummeringen: er det verdt å legge til notater i kunde-e-poster
Kommunikasjonsåpenhet er en av de billigste måtene å redusere supportarbeidsmengden på. Når en kunde ser «Sporingsnummer: X123456789, levering 15. juni» i e-posten, går de ikke til chat og spør «hvor er ordren min?». Én kodebit, null utvidelser, fem minutter å implementere, og effekten måles i dusinvis av sparte tickets per måned.
Hvis e-postene dine allerede er tilpasset via maler, bygg inn notatutskriften direkte i malen i stedet for å bruke en hook. Hvis du bruker en utvidelse for e-posttilpasning (Kadence, YayMail, ShopMagic), har hver sin egen mekanisme for å legge til dynamiske blokker, så bruk den i stedet for kode.
Prøv det med én e-posttype (Fullført ordre), test på en testordre, og evaluer etter en uke om du får færre gjentakende spørsmål fra kunder. Nesten helt sikkert, ja.



