Добавление второго email адреса к завершенному заказу в WooCommerce
Прежде чем задать этот вопрос, я понимаю, что существует (обоснованное) нежелание отвечать здесь на вопросы о продуктах Woo, поскольку у них есть собственная поддержка, которой следует пользоваться. Я являюсь платным пользователем Woo, но не смог решить эту проблему с их платной поддержкой, и мой вопрос касается переопределения классов в WP, поэтому надеюсь на справедливое рассмотрение.
Мой вопрос: когда клиенту отправляется email о выполненном заказе, мне также нужно получить этот email, дословно и автоматически, точно так же, как он отправляется клиенту, а не в каком-то другом формате, как это делается с помощью различных плагинов PDF-счетов для WooCommerce. Я могу легко сделать это, изменив следующую строку в /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() );
на:
$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() );
Однако, очевидно, что такой хак не переживет обновление. У меня есть дочерняя тема, которая переопределяет шаблоны WooCommerce. Существует ли какой-либо аналогичный механизм, с помощью которого я могу переопределить класс таким же инкапсулированным способом? Или вы можете порекомендовать альтернативный подход (помимо настройки SMTP-сервера для отправки копии всех исходящих писем на второй адрес) для выполнения моей конкретной задачи получения этого email, когда клиент также его получает?
На самом деле есть фильтр, который можно использовать, см. abstract-wc-email.php
, строка 214:
return apply_filters( 'woocommerce_email_recipient_' . $this->id, $this->recipient, $this->object );
Вы можете добавить следующий код в ваш 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;
}
Единственный недостаток в том, что получатель увидит как ваш адрес, так и свой собственный в поле "Кому:".
Альтернативно, основываясь на ответе Стива, вы можете использовать фильтр woocommerce_email_headers
. Передаваемый $object позволяет применять это только к письму о завершенном заказе:
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@email.com>' . "\r\n";
}
return $headers;
}

Это выглядит очень многообещающе. Вы предлагаете создать плагин для этой функциональности?

Это работает идеально, большое спасибо. Вы действительно превзошли все ожидания.

Приведённый ниже код "В качестве альтернативы, на основе ответа Стива..." не работает с WC 2.3... Есть предложения?

Ни один из кодов не работает на WC 2.5.5, вы знаете, изменили ли они название фильтра? Спасибо!

Всё ещё работает у меня на WC 2.5.5. Если у вас не работает, вероятно, конфликт с плагинами. Фильтр остался прежним: https://github.com/woothemes/woocommerce/blob/2.5.5/includes/emails/class-wc-email.php#L281

Также существует еще один фильтр, который даст вам доступ к переменной $header, позволяя добавлять скрытую копию (BCC) ваших писем. Это позволяет получать копию каждого письма, отправляемого вашим клиентам в WooCommerce. Решение такое же простое, как и в предыдущем коде, но клиенты не будут видеть ваш email-адрес.
Аналогично предыдущему решению, вам нужно добавить следующий код:
add_filter( 'woocommerce_email_headers', 'mycustom_headers_filter_function', 10, 2);
function mycustom_headers_filter_function($headers, $object) {
$headers = array();
$headers[] = 'Bcc: ваше имя <me@myemail.com>';
$headers[] = 'Content-Type: text/html';
return $headers;
}
Этот фильтр применяется ко всем заголовкам $headers и жестко устанавливает тип контента как text/html. Обратите внимание, что не нужно включать '/r/n' в объявлении типа контента — это может вызвать ошибку в wp_mail(), который используется WooCommerce для отправки сообщений.
Я использую этот код для проверки в WooCommerce v2.0.14. Он также должен работать в более ранних версиях, но не уверен, как долго этот фильтр был включен.

Почему бы не использовать /r/n? Я думаю, эта ошибка возникает только когда вы добавляете /r/n в массив заголовков. Ваш пример фактически перезаписывает настройку содержимого, которую можно использовать повторно.

Я ответил на Stack Overflow с методом добавления BCC только к определенным письмам и сохранения существующих заголовков.
