Aggiungere un secondo indirizzo email a un ordine completato in WooCommerce
Prima di porre questa domanda, so che c'è un'esitazione (legittima) nel rispondere qui a domande sui prodotti Woo dato che hanno il proprio supporto e i loro utenti dovrebbero essere incoraggiati ad utilizzarlo. Sono un utente Woo pagante ma non sono riuscito a risolvere questo problema con il loro supporto a pagamento, e la mia domanda riguarda l'override delle classi in WP quindi spero che riceva un'equa considerazione.
La mia domanda: quando viene inviata un'email di ordine completato a un cliente, ho anche bisogno di ricevere questa email, testualmente e automaticamente, esattamente come viene inviata al cliente piuttosto che in un altro formato come quello creato dai vari plugin PDF per le fatture di WooCommerce. Posso facilmente ottenere questo modificando la seguente riga in /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() );
per diventare:
$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() );
Tuttavia, ovviamente una modifica del genere non sopravviverà a un aggiornamento. Ho un tema child che sovrascrive i template di WooCommerce. Esiste un meccanismo equivalente con cui posso sovrascrivere una classe in modo similmente incapsulato? O potete suggerire un approccio alternativo (oltre a impostare il server SMTP per mettere in bcc tutti i messaggi in uscita al secondo indirizzo) per realizzare il mio compito specifico di ricevere questa email quando anche il cliente la riceve?

In realtà esiste un filtro che puoi utilizzare, vedi abstract-wc-email.php
, riga 214:
return apply_filters( 'woocommerce_email_recipient_' . $this->id, $this->recipient, $this->object );
puoi inserire il seguente codice nel tuo 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 . ', me@myemail.com';
return $recipient;
}
l'unico svantaggio è che il destinatario vedrà sia il tuo indirizzo che il suo nel campo A:.
In alternativa, basandoti sulla risposta di Steve, puoi usare il filtro woocommerce_email_headers
. L'oggetto $object passato ti permette di applicarlo solo all'email di ordine completato:
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: Mio nome <my@email.com>' . "\r\n";
}
return $headers;
}

Sembra molto promettente. Il tuo suggerimento è quello di creare un plugin per questa funzionalità?

Funziona perfettamente, grazie mille. Hai davvero superato ogni aspettativa.

Il codice qui sotto "In alternativa, basandosi sulla risposta di Steve..." non sembra funzionare con WC 2.3... Qualche suggerimento?

Nessuno dei codici funziona su WC 2.5.5, sai se hanno cambiato il nome del filtro? Grazie!

Funziona ancora per me in WC 2.5.5. Se non funziona per te probabilmente è un conflitto con un plugin. Il filtro è ancora lo stesso: https://github.com/woothemes/woocommerce/blob/2.5.5/includes/emails/class-wc-email.php#L281

Esiste un altro filtro che ti darà accesso alla variabile $header e che può permetterti di mettere in BCC le tue email, così da ricevere una copia carbone di ogni email inviata ai tuoi clienti su Woocommerce. È semplice quanto il codice precedente, con la differenza che i tuoi clienti non vedranno il tuo indirizzo email.
Proprio come la soluzione precedente, dovrai aggiungere il seguente codice:
add_filter( 'woocommerce_email_headers', 'mycustom_headers_filter_function', 10, 2);
function mycustom_headers_filter_function($headers, $object) {
$headers = array();
$headers[] = 'Bcc: tuo nome <me@myemail.com>';
$headers[] = 'Content-Type: text/html';
return $headers;
}
Questo filtro si applica a tutti gli $headers e imposta anche il tipo come text/html in modo fisso. Nota che non devi includere '/r/n' nella dichiarazione del tipo di contenuto - questo potrebbe causare un errore in wp_mail() - la funzione che Woocommerce utilizza per inviare i messaggi.
Sto usando questo codice per verificare che funzioni con Woocommerce v2.0.14. Dovrebbe funzionare anche con versioni precedenti, ma non sono sicuro da quanto tempo questo filtro è stato incluso.

Perché non usare /r/n? Penso che quell'errore compaia solo quando aggiungi /r/n nell'array degli header. Il tuo esempio in realtà sovrascrive l'impostazione del contenuto, che potresti riutilizzare.

Ho risposto su SO con un metodo per aggiungere BCC solo a email specifiche e mantenere gli header esistenti.
