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

В Woocommerce у меня есть собственный шаблон электронной почты (id = 'wc_course_order'), который отправляется при покупке определенного продукта (онлайн-курса).

Ниже я использую подключенную функцию, которая добавляет получателей на основе метаданных заказа из настраиваемых полей (например, «Электронная почта студента»). Он основан на ответе в этой ветке.

Как я могу добавить этих получателей в качестве скрытой копии, взять их поле «Имя» и добавить его в текст электронного письма, особенно с учетом того, что два количества продукта курса могут быть приобретены вместе с двумя разными именами / адресами электронной почты учащихся?

Вывод строки:

"meta_data": [{"id": 652,
   "key": "First Name - 1",
    "value": "John"},
    {"id": 653,
    "key": "Last Name - 1",
    "value": "Doe"},
    {"id": 654,
    "key": "Student Email - 1",
    "value": "[email protected]"}]

А затем для дополнительного учащегося, зарегистрированного в той же покупке, выводом будет «ключ»: «Имя - 2», «значение»: «Джейн» и «... - 3» и т. Д.

Я понимаю, что это можно разделить на два вопроса:

  1. Как мне получить их имена в дополнение к электронным письмам (которые я уже получил, полный список функций см. Ниже)?
  2. Как мне добавить их адреса электронной почты в виде BCC вместо того, чтобы добавлять $ получателей в виде обычного "TO:"?

Полная функция, которую я использую:

add_filter( 'woocommerce_email_recipient_wc_course_order', 'student_email_notification', 10, 2 );
function student_email_notification( $recipient, $order) {
    $student_emails = array();
    $enroll_num = 0;

    // Loop though  Order IDs
    foreach( $order->get_items() as $item_id => $item_data ){
        $course_qty = $item_data->get_quantity();
        $q = 1;
        while ( $q <= $course_qty){
            // Get the student email
            $enroll_num++;
            $student_email = wc_get_order_item_meta( $item_id, 'Student Email - '.$enroll_num, true );
            if( ! empty($student_email) )
                $student_emails[] = $student_email; // Add email to the array
            $q++;
        }
    }

    // If any student email exist we add it
    if( count($student_emails) > 0 ){
        // Remove duplicates (if there is any)
        $student_emails = array_unique($student_emails);
        // Add the emails to existing recipients
    $recipient .= ',' . implode( ',', $student_emails );
    }
    return $recipient;
}

Можно ли все это сделать в functions.php или это нужно сделать в отдельном файле шаблона электронной почты, который у меня есть?


person calwex718    schedule 10.04.2018    source источник


Ответы (1)


Поскольку 'wc_course_order' - это пользовательский идентификатор уведомления по электронной почте, который я не могу проверить с его помощью (поэтому для целей тестирования я прокомментировал его, когда тестировал функцию сам) ...

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

Теперь, чтобы добавить эти электронные письма как BCC, вам нужно будет изменить ловушку:

add_filter( 'woocommerce_email_headers', 'student_email_notification', 20, 3 );
function student_email_notification( $header, $email_id, $order ) {
    // Only for 'wc_course_order' notification
    if( 'wc_course_order' != $email_id ) return $header; 

    $student_emails = array();
    $enroll_num = 0;

    // Loop though  Order IDs
    foreach( $order->get_items() as $item_id => $item_data ){
        $course_qty = $item_data->get_quantity();
        $q = 1;
        while ( $q <= $course_qty){
            $enroll_num++;
            // Get the student full Name
            $full_name     = wc_get_order_item_meta( $item_id, 'First Name - '.$enroll_num, true );
            $full_name    .= ' ' . wc_get_order_item_meta( $item_id, 'Last Name - '.$enroll_num, true );
            // Get the student email
            $student_email = wc_get_order_item_meta( $item_id, 'Student Email - '.$enroll_num, true );
            if( ! empty($student_email) && $full_name != ' ' )
                // Format the name and the email and set it in an array
                $student_emails[] = utf8_decode($full_name . ' <' . $student_email . '>'); // Add name + email to the array
            $q++;
        }
    }

    // If any student email exist we add it
    if( count($student_emails) > 0 ){
        // Remove duplicates (if there is any)
        $student_emails = array_unique($student_emails);
        // Add the emails to existing recipients
        $header .= 'Bcc: ' . implode(',', $student_emails) . "\r\n";
    }
    return $header;
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы). Протестировано и работает
(я не могу проверить ваш код на 100%, но он должен работать, надеюсь).


Связано: Как получить идентификатор заказа в крючок woocommerce_email_headers

person LoicTheAztec    schedule 10.04.2018
comment
Это сработает, как только я обязательно укажу адрес электронной почты в поле «Кому» (не буду отправлять, если у меня есть только в BCC). - person calwex718; 11.04.2018
comment
Но есть ли еще способ отправить $full_name в шаблон электронного письма для использования в теле письма, например, Уважаемый $full_name,? Я использую <p style="color:white;"><?php printf( __( 'This was purchased by %s.', 'woocommerce' ), $order->get_formatted_billing_full_name() ); ?></p>, чтобы получить и распечатать имя покупателя. - person calwex718; 11.04.2018
comment
@ calwex718 Woocommerce по умолчанию отправляет электронное письмо клиенту (TO) ... Вам необходимо удалить другой связанный код и использовать только этот код ответа ... Так что он будет работать так, как задумано ... - person LoicTheAztec; 11.04.2018
comment
Есть ли способ добавить эти адреса электронной почты в тело письма? У меня есть шаблон, и я пытался использовать $ get_recipient и $ recipient в своем шаблоне электронной почты, но он их не передает. Я использую эту функцию в functions.php и настраиваемом плагине электронной почты для создания электронного письма, если введен конкретный продукт курса. (Я ответил еще на один вопрос, хотя он все еще является продолжением этого: stackoverflow.com/questions/50419736/) - person calwex718; 23.05.2018