Ich werde öfters gefragt wie man ein PDF als Anhang bei einer Bestellung hinzufügen kann.
Dies geht relativ einfach über die functions.php.
Bitte berücksichtige dabei, dass du bei solchen Anpassungen immer ein Child Theme verwenden solltest. Denn sonst läufst du Gefahr, dass bei einem Update deines Themes alle individuellen Code Anpassungen in der functions.php überschrieben werden und für immer verloren sind.
Alternative: das Plugin Code Snippets verwenden
Achtung!!! Es muss im Child Theme ein anhang-Ordner erstellt werden, wo der Dateianhang abgelegt wird!
/* PDF bei neuer Bestellung als Anhang senden */
function attach_agb_pdf_to_email ( $attachments_agb , $id, $object ) {
$agb_pdf_path = get_stylesheet_directory() . '/anhang/AGB.pdf';
$attachments_agb[] = $agb_pdf_path;
return $attachments_agb;
}
Möchte man dies nun filtern nach Sprache (wenn zb. WPML der Polylang benutzt wird):
/* PDF ADF als Anhang senden Multi Language*/ function attach_agb_pdf_to_email ( $attachments_agb , $id, $object ) { if (ICL_LANGUAGE_CODE=='de') { $agb_pdf_path = get_stylesheet_directory() . '/woocommerce/pdf/AGB-DE.pdf'; $attachments_agb[] = $agb_pdf_path; return $attachments_agb; } elseif(ICL_LANGUAGE_CODE=='fr') { $agb_pdf_path = get_stylesheet_directory() . '/woocommerce/pdf/AGB-FR.pdf'; $attachments_agb[] = $agb_pdf_path; return $attachments_agb; } else { $agb_pdf_path = get_stylesheet_directory() . '/woocommerce/pdf/AGB-EN.pdf'; $attachments_agb[] = $agb_pdf_path; return $attachments_agb; } } add_filter( 'woocommerce_email_attachments', 'attach_agb_pdf_to_email', 10, 3);
Ps.:
Wer nicht in der functions.php herumspielen möchte, kann das Plugin “Code Snippets” nutzen
Der erste Schritt – Die Filterfunktion
WooCommerce stellt uns für das Anhängen einer Datei an eine E-Mail einen Filter zur Verfügung. Mit der dazu gehörigen Funktion können wir einen oder mehrere PDF-Anhänge einbinden.
Der WooCommerce Filter
1 2 3 4 5 6 | add_filter( ‚woocommerce_email_attachments‘, ‚my_email_attachments‘, 10, 3); function my_email_attachments ( $attachments , $id, $object ) { return $attachments; } |
Die Funktion stellt das Grundgerüst dar und hat bisher keinen Inhalt. Nur die Rückgabe mit return habe ich schon eingebunden. Diese und alle nachfolgenden Code-Beispiele gehören in dein functions.php.
Der zweite Schritt – E-Mail Anhang und Pfad bestimmen
Nun müssen wir mitteilen, um welchen Anhang es sich handelt und wo sich dieser befindet. Dies geschieht im nächsten Schritt.
1 2 3 4 5 6 7 8 | add_filter( ‚woocommerce_email_attachments‘, ‚my_email_attachments‘, 10, 3); function my_email_attachments ( $attachments , $id, $object ) { $attachment_path = get_stylesheet_directory() . ‚/anhang/Anhang_1.pdf‘; $attachments[] = $attachment_path; return $attachments; } |
Mit den markierten Zeilen 4 und 5 werden der Pfad für den Anhang sowie der Anhang selber festgelegt (Zeile 4). Dann wir diese den attachments hinzugefügt (Zeile 5).
Der Pfad führt zum Unterordner anhang im Verzeichnis des Child Themes.
Jetzt wollen wir noch einen 2. Anhang hinzufügen.
Der dritte Schritte – Einen weiteren Anhang hinzufügen
Dies ist nicht weiter schwierig. Wir setzen dies um, indem wir einfach die Code Zeilen 4 und 5 duplizieren und nur den Namen des Anhangs anpassen. Sollte sich dein zusätzlicher Anhang in einem anderen Verzeichnis befinden, musst du dies natürlich ebenso anpassen.
1 2 3 4 5 6 7 8 9 10 11 | add_filter( ‚woocommerce_email_attachments‘, ‚my_email_attachments‘, 10, 3); function my_email_attachments ( $attachments , $id, $object ) { $attachment_path = get_stylesheet_directory() . ‚/anhang/Anhang_1.pdf‘; $attachments[] = $attachment_path; $attachment_path = get_stylesheet_directory() . ‚/anhang/Anhang_2.pdf‘; $attachments[] = $attachment_path; return $attachments; } |
Der vierte Schritt – Die Anhänge gehören nicht in jede Nachricht
Vielleicht hast du auch schon festgestellt, dass die Funktion zwar tadellos funktioniert, aber deine Anhänge in jede E-Mail übernommen werden. Dies ist aber nicht immer erwünscht.
Auch diesbezüglich müssen wir zum Glück das Rad nicht neu erfinden. Hier hat WooCommerce ebenfalls vorgesorgt. Wir können nämlich definieren, zu welchem Zeitpunkt einer Bestellung die Anhänge implementiert werden sollen. WooCommerce unterscheidet folgende Zustände, auf die ich an dieser Stelle nicht näher eingehen möchte.
- cancelled_order
- customer_completed_order
- customer_invoice
- customer_new_account
- customer_note
- customer_on_hold_order
- customer_processing_order
- customer_reset_password
- failed_order
- new_order
Ich zeige lediglich exemplarisch, wie du diese abfragen kannst. Wir wählen hier den Zustand customer_completed_order, also den Abschluss einer Bestellung. Nur mit dieser Nachricht an deinen Kunden sollen die Anhänge mit eingebunden werden. Die Bestellbestätigung wird also ohne Anhang versendet.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | add_filter( ‚woocommerce_email_attachments‘, ‚my_email_attachments‘, 10, 3); function my_email_attachments ( $attachments , $id, $object ) { if( $id === ‚customer_completed_order‘){ $attachment_path = get_stylesheet_directory() . ‚/anhang/Anhang_1.pdf‘; $attachments[] = $attachment_path; $attachment_path = get_stylesheet_directory() . ‚/anhang/Anhang_2.pdf‘; $attachments[] = $attachment_path; } return $attachments; } |
Zu diesem Zweck haben wir unsere Anhänge in einen if-block gepackt (markierte Zeilen). Mit Hilfe der id und der Status Bezeichnung kannst du prüfen, ob der Status zutrifft oder nicht. Ist dies der Fall, werden die Anhänge mitgeschickt.
Der fünfte Schritt – Die Anhänge aus der WordPress Mediathek verwenden
Vielleicht hast du keine Lust, per Hand einen neuen Ordner in einem deiner Verzeichnisse per FTP zu erstellen, sondern du möchtest deine PDF-Anhänge über die WordPress Mediathek hochladen und verwenden. Hier ist die Vorgehensweise etwas anders.
Lade zu diesem Zweck erst einmal deine Anhänge in die Mediathek. Die Vorgehensweise dürfte dir bekannt sein und funktioniert wie jeder andere Upload in die Mediathek auch.
Wir können jetzt nicht wie oben beschrieben mit den Dateinamen arbeiten, sondern benötigen die ID der hochgeladenen Anhänge. Denn WordPress stellt uns für die Einbindung der Dateien eine Funktion zur Verfügung.
Um die ID zu bekommen, gehst du bitte in deine Mediathek und klickst auf die gewünschte Datei. Jetzt kannst du die ID in der Adresszeile deines Browsers ablesen.

In unserem Beispiel lautet die ID 22. Den zweiten Anhang habe ich auch hochgeladen, die ID für diesen lautet 23. Jetzt können wir unsere Funktion umschreiben:
1 2 3 4 5 6 7 8 9 10 11 12 | add_filter( ‚woocommerce_email_attachments‘, ‚my_email_attachments‘, 10, 3); function my_email_attachments ( $attachments , $id, $object ) { if( $id === ‚customer_completed_order‘){ $attachments[] = get_attached_file( 22 ); $attachments[] = get_attached_file( 23 ); } return $attachments; } |
Mit den markierten Zeilen 6 und 7 binden wir die Anhänge mit den IDs 22 und 23 ein.
Zusammenfassung
Wie du siehst, ist es nicht wirklich kompliziert, über wenige eigene Codezeilen E-Mail Anhänge für die WooCommerce E-Mails mit einzubinden. Auch gehen kleine Anpassungen recht schnell von der Hand. Ich hoffe, ich konnte dir damit ein wenig helfen und wünsche dir viel Freude bei der Umsetzung.
