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;
}
Другие вопросы по тегам