Aggiungere un secondo indirizzo email a un ordine completato in WooCommerce

23 mar 2013, 11:44:36
Visualizzazioni: 52.7K
Voti: 15

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?

1
Commenti

Ho già utilizzato gmail/google come server SMTP in passato, e in effetti mette tutte le email nella cartella "Inviati"... (per quello che può valere nel tuo caso)

Ewout Ewout
23 mar 2013 13:20:20
Tutte le risposte alla domanda 2
6
27

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;
}
23 mar 2013 13:28:29
Commenti

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

Halle Halle
23 mar 2013 14:02:41

aggiorna la risposta!

Ewout Ewout
23 mar 2013 15:45:14

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

Halle Halle
23 mar 2013 16:02:36

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

drake035 drake035
22 lug 2015 15:07:39

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

Jaypee Jaypee
14 giu 2016 01:17:55

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

Ewout Ewout
17 giu 2016 12:02:09
Mostra i restanti 1 commenti
2
10

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.

28 set 2013 22:29:54
Commenti

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.

Ewout Ewout
6 mar 2014 15:37:03

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

helgatheviking helgatheviking
7 ott 2014 14:32:30