Добавление второго email адреса к завершенному заказу в WooCommerce

23 мар. 2013 г., 11:44:36
Просмотры: 52.7K
Голосов: 15

Прежде чем задать этот вопрос, я понимаю, что существует (обоснованное) нежелание отвечать здесь на вопросы о продуктах 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, когда клиент также его получает?

1
Комментарии

Я раньше использовал Gmail/Google в качестве SMTP-серверов, и все письма действительно попадали в папку "Отправленные"... (на случай, если это будет полезно в вашей ситуации)

Ewout Ewout
23 мар. 2013 г. 13:20:20
Все ответы на вопрос 2
6
27

На самом деле есть фильтр, который можно использовать, см. 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;
}
23 мар. 2013 г. 13:28:29
Комментарии

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

Halle Halle
23 мар. 2013 г. 14:02:41

обновите ответ!

Ewout Ewout
23 мар. 2013 г. 15:45:14

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

Halle Halle
23 мар. 2013 г. 16:02:36

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

drake035 drake035
22 июл. 2015 г. 15:07:39

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

Jaypee Jaypee
14 июн. 2016 г. 01:17:55

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

Ewout Ewout
17 июн. 2016 г. 12:02:09
Показать остальные 1 комментариев
2
10

Также существует еще один фильтр, который даст вам доступ к переменной $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. Он также должен работать в более ранних версиях, но не уверен, как долго этот фильтр был включен.

28 сент. 2013 г. 22:29:54
Комментарии

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

Ewout Ewout
6 мар. 2014 г. 15:37:03

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

helgatheviking helgatheviking
7 окт. 2014 г. 14:32:30