web-dev-qa-db-de.com

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

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

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

$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( [email protected], $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );

Offensichtlich wird ein solcher Hack ein Upgrade 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 (außer den SMTP-Server so einzustellen, 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 erhält?

10
Halle

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

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

du kannst folgendes in deine functions.php schreiben:

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 Adresse im Feld An: sehen kann.


Alternativ können Sie auf der Antwort von Steve aufbauen und den woocommerce_email_headers-Filter verwenden. Mit dem übergebenen $ -Objekt können Sie dies nur auf die ausgefüllte 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;
}
19
Ewout

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

Genau wie in 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 '/ r/n' nicht in die Deklaration des Inhaltstyps aufnehmen. Dies kann zu einem Fehler in wp_mail () führen. Dies wird von Woocommerce zum Senden Ihrer Nachrichten verwendet.

Ich verwende diesen Code, damit ich Woocommerce v2.0.14 überprüfen kann. Sollte auch in früheren Versionen funktionieren, aber nicht sicher, wie lange der Filter enthalten ist.

8
Steve Eldridge