Woocommerce - необходимо отправить электронное письмо на определенный адрес на основе почтового индекса
Как правило, в woocommerce у вас есть возможность ввести несколько адресов электронной почты (разделенных запятыми), кому отправлять завершенный заказ, в WooCommerce -> Настройки -> Электронная почта -> Новый заказ. Но мне нужен способ отправки только одному из этих получателей на основе почтового индекса клиента, который заказывает продукт. Или полностью переписать способ обработки в WooCommerce.
Как я могу подключиться к функции, ответственной за это, чтобы отправить правильному получателю? В принципе, есть ли для этого определенный хук, или существует плагин для чего-то подобного, или мне придется редактировать основные файлы WooCommerce? Если необходимо внести изменения в основные файлы, может ли кто-нибудь указать мне правильное направление относительно того, какие файлы нужно будет редактировать?
1 ответ
Каждое письмо имеет фильтр, который позволяет настроить получателей этого письма. Название фильтра по существу woocommerce_email_recipient_{$email_id}
,
Таким образом, следующее отфильтровывает адреса "to" для электронной почты "new_order".
add_filter( 'new_order' , 'so_26429482_add_recipient', 20, 2 );
function so_26429482_add_recipient( $email, $order ) {
$additional_email = "somebody@somewhere.net";
if( $order->shipping_postcode == "90210" ){
$email = explode( ',', $email );
array_push( $email, $additional_email );
}
return $email;
}
Я не на 100% уверен в условной логике, но я думаю, что следует проверить почтовый индекс доставки и затем отправить на дополнительный адрес электронной почты.
У меня были небольшие проблемы с ответом helgatheviking выше, а также с немного другим вариантом использования. Мои проблемы / потребности были:
- Я не совсем понял название фильтра, представленное выше.
- В
public function get_recipient()
внутри class-wc-email.php ожидал строку, но получал массив. - А также хотел условно добавить дополнительного получателя в зависимости от способа оплаты, а не почтового индекса.
Вот что я сделал вместо этого:
- Добавлено полное имя фильтра, а не только суффикс:
woocommerce_email_recipient_new_order
- Заменены
explode()
а такжеarray_push()
с конкатенацией строк$email .= ',' . $additional_email;
. - Условно проверенный способ оплаты:
if( $order->get_payment_method() == "cod" )
.
Полный пример:
add_filter( 'woocommerce_email_recipient_new_order' , 'so_26429482_add_recipient', 20, 2 );
function so_26429482_add_recipient( $email, $order ) {
// !empty($order) prevents a fatal error in WooCommerce Settings
// !empty($email) prevents the duplicate email from being sent in cases where the filter is run outside of when emails are normally sent. In my case, when using https://wordpress.org/plugins/woo-preview-emails/
if(!empty($order) && !empty($email)) {
$additional_email = "isf@domain.co";
if( $order->get_payment_method() == "cod" ) {
$email .= ',' . $additional_email;
} else {
$email .= ',another@domain.co';
}
}
return $email;
}