it-swarm.com.ru

Добавление второго адреса электронной почты к завершенному заказу в WooCommerce

Прежде чем задавать этот вопрос, я знаю, что есть (законное) сомнение ответить на вопросы о продуктах Woo, поскольку они имеют собственную поддержку, и их следует поощрять к использованию пользователями. Я платный пользователь Woo, но не смог решить эту проблему с помощью их платной поддержки, и мой вопрос касается переопределения классов в WP, поэтому я надеюсь, что он будет справедливым.

Мой вопрос: когда отправленное заказчику электронное письмо отправляется заказчику, мне также необходимо получать это письмо, дословно и автоматически, точно так же, как оно отправляется клиенту, а не в каком-либо другом формате, например, созданном из различных счетов-фактур 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( [email protected], $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );

Однако очевидно, что подобный хак не переживет апгрейд. У меня есть дочерняя тема, которая переопределяет шаблоны WooCommerce. Есть ли эквивалентный механизм, с помощью которого я могу переопределить класс аналогичным образом инкапсулированным способом? Или вы можете порекомендовать альтернативный подход (помимо установки на SMTP-сервере значения bcc для всех исходящих писем на второй адрес) для выполнения моей конкретной задачи получения этого письма, когда клиент также получает его?

10
Halle

На самом деле есть фильтр, который вы можете использовать, см. 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 . ', [email protected]';
    return $recipient;
}

единственным недостатком является то, что получатель будет видеть ваш адрес и его собственный в поле To :.


Кроме того, основываясь на ответе Стива, вы можете использовать фильтр woocommerce_email_headers. переданный объект $ позволяет применить это только к электронному письму с завершенным заказом:

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

И есть еще один фильтр, который даст вам доступ к переменной $ header, которая может позволить вам BCC ваши письма, чтобы вы получали точную копию каждого письма, которое отправляется вашим клиентам в Woocommerce. Это так же просто, как приведенный выше код, за исключением того, что ваши клиенты не увидят ваш адрес электронной почты.

Как и в приведенном выше решении, вы добавили бы следующий код:

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

Этот фильтр применяется ко всем $ заголовкам, а также жестко кодирует тип как text/html. Обратите внимание, что вы не включаете/r/n в объявление типа контента - это может привести к ошибке в wp_mail () - именно это Woocommerce использует для отправки ваших сообщений.

Я использую этот код, чтобы я мог проверить, что Woocommerce v2.0.14. Также должен работать в более ранних версиях, но не уверен, как долго фильтр был включен.

8
Steve Eldridge