Ajouter une deuxième adresse e-mail à une commande terminée dans WooCommerce [fermé]

11

Avant de poser cette question, je sais qu'il y a une hésitation (légitime) à répondre ici aux questions sur les produits Woo car ils ont leur propre support et leurs utilisateurs devraient être encouragés à l'utiliser. Je suis un utilisateur payant de Woo mais je n'ai pas pu résoudre ce problème avec leur support payant, et ma question concerne la redéfinition des classes dans WP, donc j'espère qu'il sera entendu de manière équitable.

Ma question: lorsqu'un e-mail de commande terminé est envoyé à un client, je dois également recevoir cet e-mail, mot pour mot et automatiquement, exactement comme il est envoyé au client plutôt que dans un autre format tel que celui créé par les différentes factures PDF plugins pour WooCommerce. Je peux très facilement accomplir cela en modifiant la ligne suivante dans /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() );

lire:

$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() );

Cependant, évidemment, un hack comme celui-ci ne survivra pas à une mise à niveau. J'ai un thème enfant qui remplace les modèles WooCommerce. Existe-t-il un mécanisme équivalent par lequel je peux remplacer une classe d'une manière similaire encapsulée? Ou pouvez-vous recommander une autre approche (en plus de définir le serveur SMTP pour que tous les e-mails sortants soient affectés à la deuxième adresse) pour accomplir ma tâche spécifique de réception de cet e-mail lorsque le client le reçoit également?

Halle
la source
J'ai déjà utilisé gmail / google comme serveurs smtp, et il place en fait tous les e-mails dans le dossier envoyé ... (pour ce que ça vaut dans votre cas)
Ewout

Réponses:

22

Il y a en fait un filtre que vous pouvez utiliser, voyez abstract-wc-email.php, ligne 214:

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

vous pouvez mettre ce qui suit dans votre functions.php:

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;
}

le seul inconvénient est que le destinataire verra à la fois votre adresse et la sienne dans le champ À :.


Alternativement, en s'appuyant sur la réponse de Steve, vous pouvez utiliser le woocommerce_email_headersfiltre. l'objet $ passé vous permet de l'appliquer uniquement à l'e-mail de commande terminé:

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
la source
Cela semble très prometteur. Votre suggestion est-elle de créer un plugin pour cette fonctionnalité?
Halle
mettez à jour la réponse!
Ewout
Cela fonctionne parfaitement , merci beaucoup. Cela allait vraiment au-delà.
Halle
Le code ci-dessous "Alternativement, en s'appuyant sur la réponse de Steve ..." ne semble pas fonctionner avec WC 2.3 ... Une suggestion?
drake035
Aucun des codes ne fonctionne sur WC 2.5.5, savez-vous s'ils ont changé le nom du filtre? Merci!
Jaypee
9

Et il existe un autre filtre qui vous donnera accès à la variable $ header qui peut vous permettre de BCC vos e-mails afin que vous obteniez une copie conforme de chaque e-mail qui va à vos clients sur Woocommerce. C'est aussi simple que le code ci-dessus, sauf que vos clients ne verront pas votre adresse e-mail.

Tout comme la solution ci-dessus, vous ajouteriez le code suivant:

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;
}

Ce filtre s'applique à tous les en-têtes $ et également aux codes en dur du type texte / html. Notez que vous n'incluez pas le '/ r / n' dans la déclaration de type de contenu - cela pourrait provoquer une erreur dans wp_mail () - qui est ce que Woocommerce utilise pour envoyer vos messages.

J'utilise ce code pour pouvoir vérifier que Woocommerce v2.0.14. Devrait également fonctionner dans les versions antérieures mais ne sait pas combien de temps le filtre a été inclus.

Steve Eldridge
la source
Pourquoi ne pas utiliser le / r / n? Je pense que cette erreur n'apparaît que lorsque vous ajoutez le / r / n dans le tableau des en-têtes. Votre exemple remplace en fait le paramètre de contenu, que vous pouvez réutiliser.
Ewout
2
J'ai répondu sur SO avec une méthode pour ajouter uniquement BCC à des e-mails spécifiques et pour maintenir les en-têtes existants.
helgatheviking