Wie kann ich bei WooCommerce Anhänge (AGB, Datenschutz, etc.) zu den Bestell-E-Mails hinzufügen? (2023, Anleitung)

Marc Wag­ner

Janu­ar 23, 2023

5 min read|

Woo­Com­mer­ce ermög­licht es dir, mit ein paar weni­gen Zei­len Code, Anhän­ge zu dei­nen Bestell-E-Mails hin­zu­zu­fü­gen. Bei jeder Bestel­lung wer­den dann z.B. die AGB, Daten­schutz­er­klä­rung oder die Wider­rufs­be­leh­rung direkt mit über­mit­telt. Das gilt natür­lich auch für ande­re Datei­for­ma­te. Es muss nicht unbe­dingt ein PDF-Doku­­ment sein.

Dieses PHP Snippet erweitert deine E‑Mail Bestellungen um einen PDF-Anhang #

Kopie­re den fol­gen­den Code ein­fach und füge die­sen in die “functions.php” dei­nes Word­­Press-The­­mes ein. Die Datei fin­dest du hier: wp-content/themes/{name-des-child-themes}/functions.php.

Ach­tung: Bevor du Datei­en bear­bei­test, soll­test du unbe­dingt ein Back­up der Datei machen. Alter­na­tiv kannst du auch mit Dupli­ca­tor alle Daten dei­ner Web­sei­te direkt sichern. Eine Anlei­tung für Dupli­ca­tor fin­dest du hier: Dupli­ca­tor Anlei­tung.

Schritt 1: Filter woocommerce_email_attachments einbauen #

Um Anhän­ge hin­zu­zu­fü­gen, kön­nen wir auf den Fil­ter woocommerce_email_attachments zugrei­fen. Hier­zu fügen wir fol­gen­den Code in die functions.php im Child-The­­me ein:

/**
 * Add an attachment to the WooCommerce mails.
 */
add_filter( 'woocommerce_email_attachments', 'attach_file_to_order_emails', 10, 3);

Schritt 2: Funktion hinzufügen #

Als nächs­tes fügen wir unter­halb des Fil­ters die Funk­ti­on ein, die es uns ermög­licht, Woo­Com­mer­ce mit­zu­tei­len, wel­che Datei­en als Anhän­ge zu den jewei­li­gen E‑Mail-Tem­­pla­­tes gela­den wer­den sol­len.

/**
 * @param array<string> $attachments beinhaltet die Pfade zu den Anhängen für die jeweilige Mail
 * @param string $mail_id die ID der Mail, die versendet wird (z.B. "new_order" für eine neue Bestellung)
 * @param \WC_Order $order das Bestellobjekt
 *
 * @return array<string>
 **/
function attach_file_to_order_emails( $attachments , $mail_id, $order ) {
  ...
}

Schritt 3: Abfragen, ob eine Bestellung existiert #

Zunächst prü­fen wir in der Funk­ti­on, ob die Bestel­lung aus­ge­führt wur­de. Hier­zu fra­gen wir das Bestell­ob­jekt und die Mail-ID ab.

if( ! is_a( $order, 'WC_Order' ) || ! isset( $mail_id) ) {
    return $attachments;
}

Schritt 4.1: Anhänge hinzufügen und zurückgeben #

Zum Schluss kom­men wir zur eigent­li­chen Auf­ga­be der Funk­ti­on — dem Hin­zu­fü­gen der Anhän­ge zu der von Woo­Com­mer­ce ver­sen­de­ten E‑Mail. Die dazu­ge­hö­ri­gen Anhän­ge lie­gen in unse­rem Bei­spiel im Haupt­ver­zeich­nis des Child-The­­mes (/wp-content/themes/twentytwentyone/agb.pdf).

$attachments[] = get_stylesheet_directory() . '/agb.pdf';
return $attachments;

Schritt 4.2: Anhänge nach Mail-ID #

Es ist auch mög­lich, Anhän­ge nur für bestimm­te Mail-ID’s zu ver­sen­den. Für Woo­Com­mer­ce ste­hen fol­gen­de Mail-ID’s zur Ver­fü­gung:

  • new_order
  • customer_on_hold_order
  • customer_processing_order
  • customer_refund_order
  • customer_refunded_order
  • customer_partially_refunded_order
  • cancelled_order
  • failed_order
  • customer_reset_password
  • customer_invoice
  • customer_new_account
  • customer_note

Möch­test du zum Bei­spiel dei­ne Anhän­ge nur zu einer neu­en Bestel­lung hin­zu­fü­gen, kannst du dei­ne Funk­ti­on um fol­gen­de Abfra­ge ergän­zen.

if($mail_id === 'new_order' ) {
  $attachments[] = get_stylesheet_directory() . '/agb.pdf';
}

Zusammenfassung #

Hier noch ein­mal der kom­plet­te PHP-Code für die functions.php in dei­nem Child-The­­me. Beach­te, dass hier­mit zu jeder von Woo­Com­mer­ce ver­sen­de­ten E‑Mail die Anhän­ge hin­zu­ge­fügt wer­den.

/**
 * Add an attachment to the WooCommerce mails.
 */
add_filter( 'woocommerce_email_attachments', 'attach_file_to_order_emails', 10, 3);

/**
 * @param array<string> $attachments beinhaltet die Pfade zu den Anhängen für die jeweilige Mail
 * @param string $mail_id die ID der Mail, die versendet wird (z.B. "new_order" für eine neue Bestellung)
 * @param \WC_Order $order das Bestellobjekt
 *
 * @return array<string>
 **/
function attach_file_to_order_emails( $attachments , $mail_id, $order ) {

  if( ! is_a( $order, 'WC_Order' ) || ! isset( $mail_id) ) {
    return $attachments;
  }
  // use get_template_directory if you do not use a child theme.
  $attachments[] = get_stylesheet_directory() . '/agb.pdf';
  return $attachments;
}

Und hier das PHP-Code-Snip­­pet, das Anhän­ge nur zu neu­en Bestel­lun­gen hin­zu­fügt.

/**
 * Add multiple attachments to the WooCommerce mails.
 */
add_filter( 'woocommerce_email_attachments', 'attach_file_to_order_emails', 10, 3);

/**
 * @param array<string> $attachments beinhaltet die Pfade zu den Anhängen für die jeweilige Mail
 * @param string $mail_id die ID der Mail, die versendet wird (z.B. "new_order" für eine neue Bestellung)
 * @param \WC_Order $order das Bestellobjekt
 *
 * @return array<string>
 **/
function attach_file_to_order_emails( $attachments , $mail_id, $order ) {

  if( ! is_a( $order, 'WC_Order' ) || ! isset( $mail_id) ) {
    return $attachments;
  }

  if($mail_id === 'new_order' ) {
    // use get_template_directory if you do not use a child theme.
    $attachments[] = get_stylesheet_directory() . '/agb.pdf';
  }

  return $attachments;
}

So kannst du mehrere Anhänge an deine WooCommerce E‑Mails anfügen #

Es ist auch mög­lich, ein­fach meh­re­re Datei­en anzu­fü­gen. Hier­für müs­sen wir das PHP Snip­pet von oben nur etwas anpas­sen. Hier ein Bei­spiel:

/**
 * Add multiple attachments to the WooCommerce mails.
 */
add_filter( 'woocommerce_email_attachments', 'attach_file_to_order_emails', 10, 3);
function attach_file_to_order_emails( $attachments , $mail_id, $order ) {

  if( ! is_a( $order, 'WC_Order' ) || ! isset( $mail_id) ) {
    return $attachments;
  }
  // use get_template_directory if you do not use a child theme.
  $path = get_stylesheet_directory();

  $attachments[] = $path.'/agb.pdf';
  $attachments[] = $path.'/datenschutz.pdf';
  $attachments[] = $path.'/widerruf.pdf';
 

  return $attachments;
}

Damit wer­den direkt drei Datei­en hin­zu­ge­fügt.

Beschränke die Anhänge auf verschiedene E‑Mail Typen #

Woo­Com­mer­ce ver­sen­det ver­schie­de­ne E‑Mails. Die bei­den Snip­pets oben wer­den bei jeder Bestel­lung ver­sen­det. Du kannst das gan­ze aber noch wei­ter ein­schrän­ken, indem du die $mail_id abfragst. Hier eine Lis­te aller mög­li­chen Wer­te:

  • new_order
  • customer_on_hold_order
  • customer_processing_order
  • customer_refund_order
  • customer_refunded_order
  • customer_partially_refunded_order
  • cancelled_order
  • failed_order
  • customer_reset_password
  • customer_invoice
  • customer_new_account
  • customer_note

Möch­test du etwa die AGB nur bei einer neu­en Bestel­lung als Anhang bei­fü­gen, kannst du das Snip­pet von oben wie folgt anpas­sen:

/**
 * Add multiple attachments to the WooCommerce mails.
 */
add_filter( 'woocommerce_email_attachments', 'attach_file_to_order_emails', 10, 3);
function attach_file_to_order_emails( $attachments , $mail_id, $order ) {

  if( ! is_a( $order, 'WC_Order' ) || ! isset( $mail_id) || $mail_id !== 'new_order' ) {
    return $attachments;
  }
  // use get_template_directory if you do not use a child theme.
  $path = get_stylesheet_directory();

  $attachments[] = $path.'/agb.pdf';
  $attachments[] = $path.'/datenschutz.pdf';
  $attachments[] = $path.'/widerruf.pdf';
 

  return $attachments;
}

Das war es auch schon. Jetzt wer­den die Anhän­ge die du defi­niert hast nur noch an neue Bestel­lun­gen ange­han­gen. Das kannst du natür­lich belie­big anpas­sen in dem “new_order” mit einem Wert aus der Lis­te oben ver­tauscht.

88e86fcb816eff22bc917094df2862d8dd5c0e978b333e6dd5f36f808990c261 96

Arti­kel von:

Marc Wag­ner

Hal­lo, Marc hier. Ich bin der Grün­der von Forge12 Inter­ac­ti­ve und bereits seit über 20 Jah­ren lei­den­schaft­lich dabei Web­sei­ten, Online­shops, Anwen­dun­gen und SaaS-Lösun­gen für Unter­neh­men zu ent­wi­ckeln. Vor der Grün­dung habe ich bereits in Bör­sen notier­ten Unter­neh­men gear­bei­tet und mir aller­lei Wis­sen ange­eig­net. Die­ses Wis­sen möch­te ich nun an mei­ne Kun­den wei­ter­ge­ben.

Hast du eine Fra­ge? Hin­ter­lass bit­te einen Kom­men­tar