Unser Game Changer. Hier geht's zu unserer Videomarketing App...

Categories
Code-Schnipsel WooCommerce News Wordpress

WooCommerce – PDF-Anhänge für deine E-Mails schnell und einfach

WooCommerce ist das mit Abstand populärste Shop Plugin für WordPress und es gibt zahlreiche weitere Plugins, mit denen du deinen Shop an deine individuellen Bedürfnisse anpassen kannst.

Aber nicht immer ist es sinnvoll und notwendig, ein weiteres Plugin zu verwenden. Manchmal reichen auch ein paar Zeilen Code in der functions.php aus, um die gewünschte Funktionalität zu erreichen.

In diesem Beitrag möchte ich dir zeigen, wie schnell und einfach du ein PDF an deine automatisch von WooCommerce verschickten E-Mails anhängen kannst.

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.

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

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.

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.

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.

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.

ID von Mediathek Upload
ID von Mediathek Upload

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:

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.

0 0 votes
Article Rating
Abonnieren
Benachrichtige mich bei
guest
9 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
Katja
Katja
3 Jahre zuvor

Hallo Ralf,
herzlichen Dank für die hilfreichen Infos und die verständliche Beschreibung!
Ich habe das umgekehrte Problem: Wenn ich als Shopbetreiber eine Mail erhalte, dass eine neue Bestellung eingegangen ist, erhalte ich mit dieser Mail immer auch meine Rechtstexte. So macht das natürlich wenig Sinn, ich finde aber keine Möglichkeit, die Anhänge in dieser Mail zu deaktivieren.
Gibt es dafür vielleicht auch eine einfache Lösung / ein Snippet?
Ich würde mich riesig über eine kleine Hilfestellung freuen!
Viele Grüße und Danke im Voraus,
Katja

Boris
Boris
3 Jahre zuvor

Hallo.

Der code im 3. Schritt funktioniert einwandfrei 🙂

Der 4. Schritt mit dem Zusatz:

if( $id === ‚customer_completed_order‘){

}

leider nicht mehr.

Kannst Du mir da weiter helfen?
Vielen Dank im voraus.

Christian
Christian
3 Jahre zuvor
Reply to  Ralf

Hallo,

ich kann das selbe berichten. Ohne Prüfung ist der Code funktionsfähig. Mit einer zusätzlichen Prüfung leider nicht mehr.

add_filter( ‚woocommerce_email_attachments‘, ‚my_email_attachments‘, 10, 3);
function my_email_attachments ( $attachments , $id, $object ) {

if( $id === ‚customer_new_account‘){

$attachment_path = get_stylesheet_directory() . ‚/ressources/agb.pdf‘;
$attachments[] = $attachment_path;

$attachment_path = get_stylesheet_directory() . ‚/ressources/Datenschutzerklärung.pdf‘;
$attachments[] = $attachment_path;

}

return $attachments;
}

Das wäre mein code. Hättest du hier eine Idee? Vielen Dank

Chris
Chris
2 Jahre zuvor
Reply to  Ralf

Hallo Ralf,

zunächst einmal vielen Dank für die ausführliche Beschreibung – das Verständlichste, was ich bisher zu diesem Thema gefunden habe. Leider tritt bei mir das gleiche Problem auf wie bei Boris, d.h. der Code funktioniert nur, wenn ich die Einschränkung

if( $id === ’new_order‘)

weglasse. Dann erhalte ich die Anhänge wie gewünscht, ansonsten trifft die Bestellbestätigung ohne Anhänge ein.

Habt ihr damals herausgefunden, woran das liegt?

Ralf
Ralf
2 Jahre zuvor
Reply to  Chris

Hi Chris,
sorry, dass ich erst jetzt antworte. Optimiere und passe gerade einiges an meiner Webseite an. Daher kann es noch ein wenig dauern, dann schaue ich mir das gerne noch einmal genauer an.
Lg Ralf

Isa
Isa
4 Jahre zuvor

Hi,
kannst du für absolute Anfänger (die keine PHP Kenntnisse haben) noch verraten, an welcher Stelle in der function.php das richtig eingefügt wird?
Also muss ich irgendwo wieder einfügen oder einfach nur das > ans Ende deines Codes setzen?
Danke.

Sebastian
Sebastian
5 Jahre zuvor

Danke für deine ausführliche Anleitung – TOP. Gibt es auch eine einfache Lösung, wenn man Anhänge nur zu einem bestimmten Produkt mitsenden möchte?

9
0
Would love your thoughts, please comment.x