Menambahkan alamat email kedua ke pesanan lengkap di WooCommerce [ditutup]

11

Sebelum saya mengajukan pertanyaan ini, saya tahu ada keraguan (sah) untuk menjawab pertanyaan di sini tentang produk Woo karena mereka memiliki dukungan mereka sendiri dan pengguna mereka harus didorong untuk menggunakannya. Saya adalah pengguna Woo yang membayar tetapi tidak bisa menyelesaikan ini dengan dukungan berbayar mereka, dan pertanyaan saya adalah tentang mengesampingkan kelas di WP jadi saya berharap ini akan mendapatkan pendengaran yang adil.

Pertanyaan saya: ketika email pesanan selesai dikirim ke pelanggan, saya juga perlu menerima email ini, kata demi kata dan secara otomatis, persis seperti yang dikirim ke pelanggan daripada dalam beberapa format lain seperti dibuat oleh berbagai faktur PDF plugin untuk WooCommerce. Saya dapat dengan mudah mencapai ini dengan mengubah baris berikut di /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() );

untuk membaca:

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

Namun, jelas peretasan seperti ini tidak akan selamat dari peningkatan. Saya memiliki tema anak yang menimpa templat WooCommerce. Apakah ada mekanisme setara yang dengannya saya dapat mengesampingkan kelas dengan cara yang sama dienkapsulasi? Atau bisakah Anda merekomendasikan pendekatan alternatif (selain mengatur server SMTP untuk mengirim semua email keluar ke alamat kedua) untuk menyelesaikan tugas khusus saya menerima email ini ketika pelanggan juga menerimanya?

Halle
sumber
Saya telah menggunakan gmail / google sebagai server smtp sebelumnya, dan itu benar-benar menempatkan semua email dalam folder yang dikirim ... (untuk apa nilainya dalam kasus Anda)
Ewout

Jawaban:

22

Sebenarnya ada filter yang bisa Anda gunakan, lihat abstract-wc-email.php, baris 214:

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

Anda dapat memasukkan yang berikut ini di functions.php Anda:

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

satu-satunya kelemahan adalah bahwa penerima akan melihat alamat Anda & alamatnya sendiri di bidang Ke :.


Atau, berdasarkan jawaban Steve, Anda dapat menggunakan woocommerce_email_headersfilter. $ object berlalu memungkinkan Anda untuk hanya menerapkan ini ke email pesanan selesai:

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
sumber
Ini terlihat sangat menjanjikan. Apakah saran Anda untuk membuat plugin untuk fungsi ini?
Halle
perbarui jawabannya!
Ewout
Itu bekerja dengan baik , terima kasih banyak. Ini benar-benar melampaui dan melampaui.
Halle
Kode di bawah ini "Atau, membangun berdasarkan jawaban Steve ..." tampaknya tidak bekerja dengan WC 2.3 ... Ada saran?
drake035
Tidak ada kode yang bekerja di WC 2.5.5, tahukah Anda jika mereka mengubah nama filter? Terima kasih!
Jaypee
9

Dan ada filter lain yang akan memberi Anda akses ke variabel $ header yang memungkinkan Anda untuk BCC email Anda sehingga Anda mendapatkan salinan karbon dari setiap email yang masuk ke klien Anda di Woocommerce. Ini semudah kode di atas kecuali klien Anda tidak akan melihat alamat email Anda.

Sama seperti solusi di atas Anda akan menambahkan kode berikut:

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

Filter ini berlaku untuk semua $ header dan juga kode keras jenisnya sebagai teks / html. Perhatikan bahwa Anda tidak menyertakan '/ r / n' dalam deklarasi tipe konten - ini dapat menyebabkan kesalahan di wp_mail () - yang digunakan Woocommerce untuk mengirim pesan Anda.

Saya menggunakan kode ini sehingga saya dapat memverifikasi bahwa Woocommerce v2.0.14. Seharusnya juga berfungsi di versi yang lebih lama tetapi tidak yakin berapa lama filter telah disertakan.

Steve Eldridge
sumber
Mengapa tidak menggunakan / r / n? Saya pikir kesalahan itu hanya muncul ketika Anda menambahkan / r / n dalam array header. Contoh Anda sebenarnya menimpa pengaturan konten, yang dapat Anda gunakan kembali.
Ewout
2
Saya telah menjawab SO dengan metode untuk hanya menambahkan BCC ke email tertentu dan untuk menjaga tajuk yang ada.
Helgatheviking