Ich möchte ausgehenden E-Mails auf meinen Websites einen zusätzlichen Header hinzufügen, damit ich leicht feststellen kann, welche Website eine bestimmte E-Mail gesendet hat. (Ich habe auf allen meinen Websites ein Plugin für Standardfunktionen installiert, sodass dies einfach genug ist. Die Konfiguration meines E-Mail-Clients zum Filtern und anderweitigen Bearbeiten dieses Headers wäre eine erstaunliche Zeitersparnis.)
Ich dachte, dies wäre eine einfache Sache des Einsteckens in die wp_mail
Funktion, aber offensichtlich ist es nicht so.
Zuerst habe ich Folgendes versucht:
add_filter('wp_mail', 'ws_add_site_header');
function ws_add_site_header() {
return array('headers' => 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST));
}
Hier hatte mein Array Vorrang vor allen anderen Elementen, die die E-Mail-Einstellungen geändert haben (z. B. Gravity Forms), sodass HTML-E-Mails als reines HTML und nicht gut formatiert angezeigt wurden. Sinnvoll, da der von GF hinzugefügte Content-Type: -Header gelöscht wurde. Aber mein Header wurde der E-Mail hinzugefügt. Da andere auch darauf angewiesen sind, hübsche E-Mails zu erhalten (unter anderem alle Content-Entwickler und Endbenutzer meiner Websites, da bin ich mir sicher), ist dies nicht akzeptabel.
Einer meiner Kollegen schlug dann vor, meine Sachen über wp_parse_args () zu leiten, also:
add_filter('wp_mail', 'ws_add_site_header');
function ws_add_site_header($args) {
$new_header = array('headers' => 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST));
return wp_parse_args($args, $new_header);
}
Damit ist es so, als ob meine Funktion nicht existiert - mein Header wird nicht hinzugefügt, aber auch die Header und E-Mail-Einstellungen anderer werden nicht entfernt.
Was ist der richtige Weg, um einer ausgehenden E-Mail einen Header hinzuzufügen, ohne andere Filter zu verschlüsseln, die möglicherweise vorhanden sind?
Antworten:
Dank des oben Gesagten habe ich meinen zentralen Fehler erkannt - ich habe nicht ganz erkannt, dass die übergebenen Argumente ein mehrdimensionales Array sind.
Im Moment habe ich die Funktion folgendermaßen neu implementiert:
Das Lesen der Quelle wp_mail () (siehe: https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/pluggable.php#L235 ) lässt mich glauben, dass die Header Komponente kann ein Array oder eine große Zeichenfolge oder möglicherweise ein schrecklicher Mischmasch der beiden sein, aber die Verwendung eines Arrays ist wahrscheinlich die sicherere / korrektere Option.
Ich mag die verschiedenen Antworten von phpmailer, aber es scheint ein bisschen sauberer zu sein, Dinge mit den integrierten Funktionen von WordPress zu tun.
quelle
Hier ist eine Alternative, die direkt die
AddCustomHeader
Methode derPHPMailer
Instanz verwendet:Hier können wir sehen, dass es zwei Möglichkeiten gibt, es zu verwenden:
Beispiel 1:
Hier übergeben wir nur die Header-Informationen in der
$name
Eingabezeichenfolge, die durch getrennt ist:
Beispiel 2:
Hier sind beide
$name
und$value
nicht leer:quelle
$args['headers'] = 'key: value'
über WP-Filter einstellt ?phpmailer_init
Hook wird später ausgelöst, als wenn derwp_mail
Filter angewendet wird, und die benutzerdefinierten Header dieses Filters werden meines Wissens auch über dieAddCustomHeader()
Methode hinzugefügt . @sumitPHP
headers
sind Strings. Sie können sie nicht als Array analysieren. Sie müssen Ihren zusätzlichen Header als Zeichenfolge hinzufügen\r\n
, um sicherzustellen, dass er in der nächsten Zeile hinzugefügt wird.Beispiel:
Bitte beachten Sie auch, dass Sie endlich zusätzliche Header mit Priorität hinzufügen,
99
damit kein anderes Plugin diese ersetzen kann, wenn nicht überprüft wird, ob bereits Header vorhanden sind. Wenn nötig, mach es999
.quelle
wp_mail
akzeptiert ein Array für das Header-Argument und WP kümmert sich um das Hinzufügen von \ r \ nPHP headers
nicht erwähnt , was zuwp_mail
akzeptieren. Endlich sind Header Strings. Waswp_mail
akzeptiert, war nicht die Frage! @ JanBeck