
📝 WooCommerce-Bestellnotizen zu E-Mails hinzufügen: eine vollständige Anleitung
Ein Kunde gibt eine Bestellung auf, und Sie hinterlegen im Admin-Panel eine Notiz: Sie haben das Lieferdatum geklärt, eine Sendungsnummer ergänzt oder einfach „Vor Versand anrufen" notiert. Der Kunde sieht das jedoch nicht. Bestellnotizen in WooCommerce befinden sich standardmäßig nur im Admin-Panel, in der Seitenleiste der Bestellbearbeitung. In den E-Mails, die an den Käufer gehen, erscheinen sie nicht.
Das Problem lässt sich mit einem einzigen Snippet in der functions.php lösen. Keine Plugins, keine Template-Anpassungen, nur ein sauberer Hook, der die Notizen im E-Mail-Text ausgibt. In der Praxis setzen wir diesen Ansatz seit mehreren Jahren auf Kunden-Shops ein, ohne Ausfälle nach WooCommerce-Updates. In dieser Anleitung behandeln wir, wie WooCommerce Bestellnotizen speichert, welchen Hook Sie verwenden und wie Sie die Ausgabe an Ihre Bedürfnisse anpassen.
💡 Kurzüberblick:
- Wie WooCommerce Bestellnotizen speichert: der Kommentartyp
order_noteund die Funktionwc_get_order_notes() - Zwei Ansätze zur E-Mail-Anpassung: Template-Overrides oder Hooks, und wann Sie welchen wählen
- Ein einsatzbereites Snippet zur Anzeige von Notizen in der E-Mail zur Bestellabwicklung mit einer Aufschlüsselung Zeile für Zeile
- Anpassung: Styling der Liste, Filtern nur nach Kundennotizen, Unterstützung von Plain-Text-E-Mails
- Testen über die E-Mail-Vorschau im Admin-Panel, ohne echte Kunden zu belästigen
Schritt 1: Wie WooCommerce Bestellnotizen speichert
WooCommerce speichert Notizen als WordPress-Kommentare vom Typ order_note. Jede Aktion an einer Bestellung (Statusänderung, Erstattung, Admin-Notiz oder Kundennachricht) wird in der Tabelle wp_comments mit dem Flag comment_type = 'order_note' festgehalten.
Der Unterschied zwischen internen und Kundennotizen wird durch das Metafeld is_customer_note bestimmt. Wenn beim Hinzufügen einer Notiz die Checkbox „Im Kundenkonto sichtbar" aktiviert ist, setzt WooCommerce is_customer_note = true, und der Käufer sieht sie in seinem Konto. Gewöhnliche interne Notizen (is_customer_note = false) werden dem Kunden nirgendwo angezeigt.
Mit der Einführung von High Performance Order Storage (HPOS) in WooCommerce 8.2+ sind die Notizen in eine separate Tabelle wp_wc_order_notes umgezogen. Direkte SQL-Abfragen auf wp_comments können bei aktiviertem HPOS leere Ergebnisse liefern. Verwenden Sie daher statt get_comments() besser wc_get_order_notes(), was unabhängig vom Speichermodus korrekt funktioniert.
Schritt 2: Templates oder Hooks, welchen Ansatz Sie wählen sollten
WooCommerce bietet zwei Wege zur E-Mail-Anpassung: Template-Overrides und Action-Hooks. Jeder hat seinen eigenen Anwendungsfall.
Template-Overrides. Sie kopieren eine Datei aus woocommerce/templates/emails/ nach yourtheme/woocommerce/emails/ und bearbeiten das HTML direkt. Der Vorteil ist die volle Kontrolle über das Markup. Der Nachteil: Nach größeren WooCommerce-Updates kann Ihr Template von der aktuellen Version abweichen, und die E-Mails können anfangen, fehlerhaft zu sein. Die Dokumentation zur Template-Struktur finden Sie jetzt auf woocommerce.com, nicht mehr auf der alten docs.woothemes.com.
Hooks. Sie hängen einen Callback an die Action woocommerce_email_order_meta, und WooCommerce ruft Ihre Funktion an der richtigen Stelle in der E-Mail auf. Der Vorteil: Das ist unabhängig von Template-Versionen und funktioniert nach Core-Updates sofort. Der Nachteil: Sie sind an die Position des Hooks gebunden (er feuert im Block der Bestell-Metadaten, nach der Produkttabelle).
Kriterium | Templates | Hooks |
|---|---|---|
Kontrolle über das Markup | Vollständig | Innerhalb der Hook-Position |
Update-Resistenz | Gering | Hoch |
Implementierungsaufwand | Höher | Geringer |
Am besten geeignet für | Komplette E-Mail-Neugestaltung | Hinzufügen eines einzelnen Blocks |
Für unsere Aufgabe, Notizen anzuzeigen, ist ein Hook mehr als ausreichend. Wenn Sie E-Mail-Layouts komplett neu gestalten müssen, nutzen Sie Templates und planen Sie deren Aktualisierung etwa alle sechs Monate ein.
Schritt 3: Den Code in die functions.php einfügen
Der Hook woocommerce_email_order_meta feuert in allen transaktionalen WooCommerce-E-Mails: Bestellbestätigung, Abwicklung, Stornierung, Rechnung und andere. An den Callback werden vier Parameter übergeben: das Bestellobjekt $order, das Flag $sent_to_admin, das Flag $plain_text und das E-Mail-Objekt $email.
Platzieren Sie diesen Code in der functions.php Ihres aktiven Themes (oder über das Code Snippets-Plugin, was sicherer ist, da der Code bei einem Theme-Wechsel nicht verloren geht):
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 }
Das passiert Zeile für Zeile:
- Zeile 1. Wir registrieren den Hook mit Priorität 10 und akzeptieren alle 4 Parameter. Ohne
10, 4übergibt WooCommerce nur das erste Argument, und Sie erhalten einen Fehler. - Zeilen 5-20. Behandlung von Plain-Text-E-Mails. Manche E-Mails werden im Textformat versendet, daher geben wir Notizen als Liste mit Bindestrichen aus, ohne HTML.
- Zeilen 24-28.
wc_get_order_notes()fordert nur Kundennotizen an (type => 'customer'). Entfernen Sie den Filter, um alle Notizen anzuzeigen, einschließlich interner (Statusänderungen, Erstattungen). Wenn das Array leer ist, geben wir nichts aus und überfrachten die E-Mail nicht. - Zeilen 34-38. Wir formatieren das Datum mit
date_i18n(), das die Spracheinstellungen der Website und das Datums-/Uhrzeitformat berücksichtigt. - Zeilen 40-48.
printf()gibt jede Notiz in einem gestalteten Block aus: violetter Balken links, heller Hintergrund, Datum in Grau darunter.
Der Code verwendet keine externen Abhängigkeiten und ist kompatibel mit WooCommerce 3.2+ (die Funktion wc_get_order_notes wurde in dieser Version eingeführt) und HPOS (native Unterstützung ab 8.2+).
Schritt 4: Testen, ohne Kunden zu belästigen
Warten Sie nach dem Einfügen des Codes nicht auf eine echte Bestellung, um zu testen. WooCommerce bietet eine integrierte E-Mail-Vorschau: WooCommerce → Einstellungen → E-Mails → auf eine beliebige E-Mail klicken → Schaltfläche „Vorschau" ganz unten. Sie sehen die E-Mail sowohl in HTML als auch im Plain-Text, wobei eine echte Bestellung verwendet wird (die aktuellste wird genutzt). Wenn keine Bestellungen vorhanden sind, legen Sie manuell eine Testbestellung an.
Was Sie prüfen sollten:
- Eine Kundennotiz mit aktiviertem „Im Kundenkonto sichtbar" erscheint in der E-Mail;
- Eine interne Notiz (ohne die Checkbox) erscheint nicht (sofern Sie
type => 'customer'beibehalten haben); - Die Plain-Text-Version der E-Mail ist nicht fehlerhaft (wechseln Sie über den Link unter der Vorschau);
- Der Notiz-Block wird in Admin-E-Mails nicht dupliziert (fügen Sie bei Bedarf eine Prüfung
if ( $sent_to_admin ) return;hinzu).
Wenn Sie Code Snippets verwenden, deaktivieren Sie einfach das Snippet, um zurückzurollen. Wenn Sie die functions.php bearbeitet haben, kommentieren Sie den Code aus oder löschen Sie ihn. Es bleiben keine Spuren in der Datenbank zurück.
⁉️🤔 Häufig gestellte Fragen
Kann ich ALLE Notizen anzeigen, nicht nur Kundennotizen?
Ja. Ersetzen Sie
'type' => 'customer'durch'type' => 'internal', um nur interne Notizen zu erhalten. Entfernen Sie dentype-Parameter vollständig, um alle Notizen zu erhalten. Bedenken Sie, dass interne Notizen Serviceinformationen (Erstattungs-IDs, Beträge) enthalten können, die Kunden nicht sehen sollten. Für die meisten Shops ist'type' => 'customer'ausreichend. Wenn Sie die Ausgabe trennen möchten, erstellen Sie zwei Blöcke: zuerst Kundennotizen mit der Überschrift „Kommentare zur Bestellung", dann interne Notizen unter der Überschrift „Details zur Auftragsabwicklung" (dies ist für Admin-E-Mails, unter Nutzung des Flags$sent_to_admin).
Funktioniert der Code für eine bestimmte E-Mail oder für alle?
Der Hook
woocommerce_email_order_metafeuert in allen transaktionalen E-Mails: Abgeschlossene Bestellung, Bestellung in Bearbeitung, Bestellung zurückgestellt, Kundenrechnung usw. Wenn Sie die Ausgabe nur auf die E-Mail zur Bestellabwicklung beschränken möchten, verpacken Sie den Code in eine Prüfung:
1 > if ( 'customer_completed_order' !== $email->id ) { 2 > return; 3 > } 4 >
Die vollständige Liste der E-Mail-IDs finden Sie in der WooCommerce-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.
Ist es sicher, die functions.php auf einer Live-Site zu bearbeiten?
Die
functions.phpdirekt zu bearbeiten, ist ein riskanter Ansatz. Ein Syntaxfehler (eine überflüssige Klammer, ein nicht geschlossenes Anführungszeichen) führt dazu, dass die gesamte Website einen weißen Bildschirm anzeigt. Sicherer ist die Nutzung des Plugins Code Snippets, mit dem Sie PHP-Snippets über das Admin-Panel hinzufügen können und das Code mit schwerwiegenden Fehlern automatisch deaktiviert. Eine Alternative ist WPCode (kostenlose Version auf wordpress.org), das dieselbe Funktionalität plus bedingte Logik bietet (nur Admin, nur bestimmte Seiten). Wenn Sie dennoch diefunctions.phpbearbeiten, erstellen Sie ein Backup der Datei und halten Sie einen FTP-Zugang bereit. Ein weißer Bildschirm wird behoben, indem Sie diefunctions.phpdurch das Original aus Ihrem Backup ersetzen.
Notizen werden in E-Mails dupliziert, was habe ich falsch gemacht?
Zwei wahrscheinliche Ursachen. Erstens: Sie haben den Code sowohl in der
functions.phpals auch über ein Snippets-Plugin hinzugefügt, sodass der Hook zweimal feuert. Behalten Sie nur eine Variante. Zweitens: Ihr Theme oder ein anderes Plugin hängt bereits einen Callback an denselben Hook. Prüfen Sie das, indem Sie den Projektcode durchsuchen (grep -r "woocommerce_email_order_meta" wp-content/). Wenn die Duplizierung von einem Plugin stammt, entfernen Sie einfach Ihren Code. Wenn sie vom Theme stammt, verpacken Sie Ihren Callback vor demadd_action()in einremove_action(), um sicherzustellen, dass nur ein Handler läuft.
Fazit: Lohnt es sich, Notizen zu Kunden-E-Mails hinzuzufügen
Kommunikationstransparenz ist eine der kostengünstigsten Methoden, um den Support-Aufwand zu reduzieren. Wenn ein Kunde in der E-Mail „Sendungsnummer: X123456789, Lieferung 15. Juni" sieht, geht er nicht in den Chat und fragt: „Wo ist meine Bestellung?". Ein Snippet, null Plugins, fünf Minuten Implementierung, und der Effekt misst sich in Dutzenden eingesparter Tickets pro Monat.
Wenn Ihre E-Mails bereits über Templates angepasst sind, betten Sie die Notizausgabe direkt im Template ein, anstatt einen Hook zu verwenden. Wenn Sie ein Plugin zur E-Mail-Anpassung nutzen (Kadence, YayMail, ShopMagic), hat jedes seinen eigenen Mechanismus zum Hinzufügen dynamischer Blöcke, nutzen Sie diesen anstelle von Code.
Probieren Sie es mit einem E-Mail-Typ (Abgeschlossene Bestellung), testen Sie es an einer Testbestellung und bewerten Sie nach einer Woche, ob Sie weniger wiederkehrende Fragen von Kunden erhalten. Fast sicher, ja.



