Hinzufügen einer zweiten E-Mail-Adresse zu einer abgeschlossenen Bestellung in WooCommerce [geschlossen]

11

Bevor ich diese Frage stelle, weiß ich, dass es ein (legitimes) Zögern gibt, hier Fragen zu Woo-Produkten zu beantworten, da sie ihren eigenen Support haben und ihre Benutzer dazu ermutigt werden sollten, diesen zu verwenden. Ich bin ein zahlender Woo-Benutzer, konnte dies jedoch nicht mit seiner bezahlten Unterstützung lösen. Meine Frage bezieht sich auf das Überschreiben von Klassen in WP, daher hoffe ich, dass es eine faire Anhörung gibt.

Meine Frage: Wenn eine abgeschlossene Bestell-E-Mail an einen Kunden gesendet wird, muss ich diese E-Mail auch wörtlich und automatisch erhalten, genau so, wie sie an den Kunden gesendet wird, und nicht in einem anderen Format, wie es durch die verschiedenen Rechnungs-PDFs erstellt wird Plugins für WooCommerce. Ich kann dies sehr leicht erreichen, indem ich die folgende Zeile in ändere /woocommerce/classes/emails/class-wc-email-customer-completed-order.php:

$this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );

lesen:

$this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
$this->send( me@myemail.com, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );

Offensichtlich wird ein solcher Hack ein Upgrade jedoch nicht überleben. Ich habe ein untergeordnetes Thema, das WooCommerce-Vorlagen überschreibt. Gibt es einen äquivalenten Mechanismus, mit dem ich eine Klasse auf ähnlich gekapselte Weise überschreiben kann? Oder können Sie einen alternativen Ansatz empfehlen (abgesehen davon, dass der SMTP-Server so eingestellt ist, dass alle ausgehenden E-Mails an die zweite Adresse gesendet werden), um meine spezifische Aufgabe zu erfüllen, diese E-Mail zu empfangen, wenn der Kunde sie auch empfängt?

Halle
quelle
Ich habe Google Mail / Google schon einmal als SMTP-Server verwendet und es legt tatsächlich alle E-Mails in den gesendeten Ordner ... (für das, was es in Ihrem Fall wert ist)
Ewout

Antworten:

22

Es gibt tatsächlich einen Filter, den Sie verwenden können, siehe abstract-wc-email.phpZeile 214:

return apply_filters( 'woocommerce_email_recipient_' . $this->id, $this->recipient, $this->object );

Sie können Folgendes in Ihre functions.php einfügen:

add_filter( 'woocommerce_email_recipient_customer_completed_order', 'your_email_recipient_filter_function', 10, 2);

function your_email_recipient_filter_function($recipient, $object) {
    $recipient = $recipient . ', [email protected]';
    return $recipient;
}

Der einzige Nachteil ist, dass der Empfänger sowohl Ihre als auch seine eigene Adresse im Feld An: sieht.


Alternativ können Sie, basierend auf Steves Antwort, den woocommerce_email_headersFilter verwenden. Mit dem übergebenen $ -Objekt können Sie dies nur auf die abgeschlossene Bestell-E-Mail anwenden:

add_filter( 'woocommerce_email_headers', 'mycustom_headers_filter_function', 10, 2);

function mycustom_headers_filter_function( $headers, $object ) {
    if ($object == 'customer_completed_order') {
        $headers .= 'BCC: My name <[email protected]>' . "\r\n";
    }

    return $headers;
}
Ewout
quelle
Das sieht sehr vielversprechend aus. Ist Ihr Vorschlag, ein Plugin für diese Funktionalität zu erstellen?
Halle
Aktualisiere die Antwort!
Ewout
Das funktioniert perfekt , vielen Dank. Das ging wirklich weit darüber hinaus.
Halle
Der folgende Code "Alternativ kann ich auf Steves Antwort aufbauen ..." scheint mit WC 2.3 nicht zu funktionieren ... Irgendwelche Vorschläge?
Drake035
Keiner der Codes funktioniert in WC 2.5.5. Wissen Sie, ob der Name des Filters geändert wurde? Vielen Dank!
Jaypee
9

Außerdem gibt es einen weiteren Filter, mit dem Sie auf die Variable $ header zugreifen können, mit der Sie Ihre E-Mails per BCC bearbeiten können, sodass Sie eine Kopie jeder E-Mail erhalten, die an Ihre Kunden bei Woocommerce gesendet wird. Dies ist genauso einfach wie der obige Code, außer dass Ihre Kunden Ihre E-Mail-Adresse nicht sehen.

Genau wie bei der obigen Lösung würden Sie den folgenden Code hinzufügen:

add_filter( 'woocommerce_email_headers', 'mycustom_headers_filter_function', 10, 2);

function mycustom_headers_filter_function($headers, $object) {
    $headers = array();
    $headers[] = 'Bcc: your name <[email protected]>';
    $headers[] = 'Content-Type: text/html';
    return $headers;
}

Dieser Filter gilt für alle $ -Header und codiert den Typ auch hart als Text / HTML. Beachten Sie, dass Sie das '/ r / n' nicht in die Deklaration des Inhaltstyps aufnehmen - dies kann zu einem Fehler in wp_mail () führen -, mit dem Woocommerce Ihre Nachrichten sendet.

Ich verwende diesen Code, um zu überprüfen, ob Woocommerce v2.0.14 vorhanden ist. Sollte auch in früheren Versionen funktionieren, ist sich aber nicht sicher, wie lange der Filter enthalten war.

Steve Eldridge
quelle
Warum nicht das / r / n verwenden? Ich denke, dass dieser Fehler nur auftritt, wenn Sie das / r / n in das Array der Header einfügen. Ihr Beispiel überschreibt tatsächlich die Inhaltseinstellung, die Sie wiederverwenden können.
Ewout
2
Ich habe auf SO mit einer Methode geantwortet , um nur bestimmten E-Mails BCC hinzuzufügen und die vorhandenen Header beizubehalten.
Helgatheviking