Добавить адрес электронной почты учетной записи условно при обработке клиентом Уведомление по электронной почте о заказе в Woocommerce

Так что это скорее мое решение, но я хотел открыть его, чтобы посмотреть, сможет ли сообщество найти лучшую альтернативу или потенциально найти применение этому решению.

Наш клиент попросил нас внести следующие изменения в квитанции о заказе по электронной почте, полученные при создании заказа: Квитанции должны отправляться владельцу учетной записи и копировать электронное письмо для выставления счетов, если оно отличается

Как мы знаем, Woocommerce по умолчанию отправляет квитанцию ​​​​о заказе (обработка клиентов) на основе только установленного billing_email при оформлении заказа, поэтому я начал искать способ добавить к нему адрес электронной почты владельца учетной записи как хорошо.

Я немного покопался и нашел в Stackoverflow несколько ответов о том, как это сделать, и в предложенном решении использовалась встроенная функция woocommerce_email_recipient_customer_processing_order. Этот подход только добавит электронное письмо в заголовок «Кому», что не идеально. Он также не учитывает возможные повторные отправки на один и тот же адрес электронной почты, которые, по крайней мере, в случае с нашим сервером здесь, привели к тому, что электронное письмо не было доставлено. Нет буэно.

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

add_filter( 'woocommerce_email_headers', 'add_email_recipient', 10, 3);

function add_email_recipient($header, $email_id, $order) {
    // Only for "Customer Processing Emails"  email notifications
    if( ! ( 'customer_processing_order' == $email_id ) ) return;
    $curr_user = wp_get_current_user();
    $account_holder_email = $curr_user->user_email;
    $billing_email = $order->get_billing_email();
    $header ='';
    if ( $account_holder_email != $billing_email ) {
        $header .= 'Cc: '.$account_holder_email;
    }
    return $header;
}

Логика намерена протекать следующим образом:

  • Настройте заголовки электронной почты woocommerce
  • Если электронное письмо является «customer_processing_order», продолжайте
  • Получить текущую электронную почту пользователя
  • Получите адрес электронной почты для выставления счетов, указанный в заказе
  • назначить поле копии электронной почты текущего пользователя
  • сделано

Насколько я мог судить, не было более простого способа справиться с этим, поэтому я публикую это здесь в надежде увидеть, есть ли у кого-то более элегантное решение. Приведенный выше код работает при размещении в дочерней теме functions.php.


person Kaustav Acharya    schedule 08.11.2018    source источник
comment
Уведомления по электронной почте об заказе клиента уже используют адрес электронной почты для выставления счетов по умолчанию в Woocommerce… Электронная почта учетной записи пользователя используется для уведомлений по электронной почте, связанных с аккаунтом. Поэтому вам следует переосмыслить/переформулировать свой вопрос и связанный с ним код. Таким образом, для уведомления клиента об обработке заказа используется электронная почта для выставления счетов (без необходимости какого-либо кода).   -  person LoicTheAztec    schedule 08.11.2018
comment
@LoicTheAztec - вы правы в том, что в электронном письме с заказом используется только адрес электронной почты для выставления счетов, однако клиент специально запросил адрес электронной почты владельца учетной записи, который будет уведомлен при отправке заказа, но только в том случае, если адрес электронной почты отличается от электронного письма для выставления счетов. Возможно, я что-то упускаю здесь, но это был единственный способ подойти к этому... какие-либо предложения о том, как сделать это по-другому?   -  person Kaustav Acharya    schedule 08.11.2018


Ответы (1)


Вы не можете получить текущего пользователя или текущий идентификатор пользователя в ловушках уведомлений по электронной почте.
Сначала вам нужно получить идентификатор клиента из заказа, а затем вы можете получить объект WP_User, чтобы получить адрес электронной почты учетной записи.

Существует 2 различных способа добавить адрес электронной почты учетной записи клиента, если он отличается от адреса электронной почты для выставления счетов за заказ в электронном уведомлении об обработке заказа клиентом:

1) Добавьте адрес электронной почты учетной записи клиента в качестве дополнительного получателя:

add_filter( 'woocommerce_email_recipient_customer_processing_order', 'add_customer_processing_order_email_recipient', 10, 2 );
function add_customer_processing_order_email_recipient( $recipient, $order ) {
    // Not in backend (avoiding errors)
    if( is_admin() ) return $recipient;

    if( $order->get_customer_id() > 0 ){

        // Get the customer WP_User object
        $wp_user = new WP_User($order->get_customer_id());

        if ( $wp_user->user_email != $order->get_billing_email() ) {
            // Add account user email  to existing recipient
            $recipient .= ','.$wp_user->user_email;
        }
    }

    return $recipient;
}

Код находится в файле function.php вашей активной дочерней темы (активной темы). Это должно работать.


2) Добавьте адрес электронной почты учетной записи клиента в качестве адреса электронной почты CC:

add_filter( 'woocommerce_email_headers', 'add_cc_email_to_headers', 10, 3);
function add_cc_email_to_headers($header, $email_id, $order) {
    // Only for "Customer Processing Emails"  email notifications
    if( 'customer_processing_order' == $email_id ) {

        if( $order->get_customer_id() > 0 ){
            // Get the customer WP_User object
            $wp_user = new WP_User($order->get_customer_id());

            if ( $wp_user->user_email != $order->get_billing_email() ) {
                $header .= 'Cc: ' . utf8_decode($order->get_formatted_billing_full_name() . ' <' . $wp_user->user_email . '>') . "\r\n";
            }
        }
    }
    return $header;
}

Код находится в файле function.php вашей активной дочерней темы (активной темы). Это должно работать.

person LoicTheAztec    schedule 08.11.2018
comment
Я ценю ответ! У меня возник вопрос, хотя $curr_user = wp_get_current_user(); $account_holder_email = $curr_user-›user_email; Мне кажется, что это в основном выполняет работу, которую вы пытаетесь получить с точки зрения идентификатора клиента. Вы используете WP_User, получая идентификатор клиента, я получаю текущего пользователя, потому что так и должно быть, это текущий пользователь, который вошел в систему и использует эту функцию. Возможно, я что-то упускаю здесь. Я действительно вижу ваш подход как другой способ приблизиться к этому, хотя - person Kaustav Acharya; 09.11.2018
comment
@KaustavAcharya Извините, но ваш код не работает, $curr_user = wp_get_current_user(); не может работать, так как это не связано с внешним интерфейсом (поэтому текущий пользователь недоступен). Как видите, оба хука связаны с данными заказа (из бэкэнда)… Я точно знаю, о чем говорю. Единственный способ получить пользователя — это идентификатор клиента заказа. Код из этого ответа действительно работает, и у вас есть 2 разных варианта. Других путей нет. Так что вы должны рассматривать это как хороший ответ. - person LoicTheAztec; 09.11.2018
comment
Ах, я понимаю, что вы говорите, и вы никак не могли знать, что он был вызван ранее в потоке и был установлен глобально, поэтому моя часть работает, но не в другой сборке. Спасибо за помощь! Я отрегулировал на основе вашего предложения и ценю отзывы здесь! надеюсь, это поможет другим! - person Kaustav Acharya; 10.11.2018