Электронные письма Woocommerce - отправка нескольких писем в зависимости от количества товаров

В Woocommerce у меня есть продукт курса, который использует поля WC для сбора имен студентов и адресов электронной почты, а также настраиваемый шаблон электронной почты, который отправляет электронное письмо при покупке этого продукта курса. На данный момент, на основании ответа в этой теме, я могу собрать адреса электронной почты, добавленные в эти настраиваемые поля, и отправить по одному электронному письму каждому студенту в качестве получателя скрытой копии.

Теперь я пытаюсь включить в электронные письма имя и адрес электронной почты студента в теле письма, но я не хочу, чтобы все имена отображались в одном и том же электронном письме. Например, если студент A ([email protected]) и студент B ([email protected]) зарегистрированы в одной и той же покупке, электронное письмо, полученное студентом A, должно содержать в теле что-то вроде «Уважаемый студент A, Спасибо за регистрацию. Используйте свой адрес электронной почты [email protected] для входа ". и в электронном письме, полученном студентом B, должно быть указано то же самое, но с информацией об ученике B, и они не должны видеть другого.

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

Я попытался добавить while () вне for (), чтобы продолжить проверку элементов, пока он не прошел через все элементы, и отправку снова для каждого найденного, но я думаю, что foreach($items as $item) в конечном итоге начинается с первого элемента опять же, так как это отправляет два электронных письма только первому получателю.

*** ОБНОВЛЕНО **** Я изменил собственный код электронной почты (который я сохранил в своих плагинах) на:

    $order = wc_get_order( $order_id );
            $items = $order->get_items(); 
            $course_ordered = false;
            $cqt = 1;
            $emailnum = 0;
        foreach ( $items as $item ) {

            $product_id = $item['product_id'];

            if ( $item['product_id']== 1164 ) {
                $course_ordered = true;
                $emailnum++;
                continue;
            }

        }

    if ( ! $course_ordered )
        return;
    while(  $cqt <= $emailnum ){
        // replace variables in the subject/headings
        $this->find[] = '{order_date}';
        $this->replace[] = date_i18n( woocommerce_date_format(), strtotime( $this->object->order_date ) );
        $this->find[] = '{order_number}';
        $this->replace[] = $this->object->get_order_number();
        if ( ! $this->is_enabled() || ! $this->get_recipient() )
            return;
        // woohoo, send the email!
        $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
        $cqt++;
    }

И код в моем файле functions.php, который был взят из этот ответ:

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++;
    }*/
        // Get the student full Name
        $full_name     = wc_get_order_item_meta( $item_id, 'First Name - 1', true );
        $full_name    .= ' ' . wc_get_order_item_meta( $item_id, 'Last Name - 1', true );
        // Get the student email
        $student_email = wc_get_order_item_meta( $item_id, 'Student Email - 1', 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


}

// 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
    $headers .= 'Cc: ' . implode(',', $student_emails) . "\r\n";
}
return $headers;
}

(Если закомментированный раздел раскомментирован, он отправляется только первому получателю, а не второму, если он вводится как два отдельных продукта, если я удаляю while () и вместо этого использую часть под ним, он отправляет одно электронное письмо всем получателям) Он отправляет всем получателям (т.е. получает все электронные письма из всех настраиваемых полей и использует их как CC или BCC, однако я установил это) дважды, то есть отправляет одно и то же электронное письмо дважды всем. Как я могу заставить его отправлять дважды, но каждый раз только одному из получателей? Спасибо за любые предложения!


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


Ответы (1)


Я нашел решение для первой половины своего вопроса - добавление имен пользователей и электронных писем из метаданных продукта в тело письма - хотя до сих пор не смог заставить его отправлять уникальное электронное письмо на каждый адрес электронной почты (адреса электронной почты исходят из этой меты):

Я обновил свой собственный шаблон электронной почты (это только шаблон электронной почты, а не настраиваемая функция, которая создает / отправляет электронное письмо) следующим образом:

<?php
$student_emails = array();
// Loop though  Order IDs
foreach( $order->get_items() as $item_id => $item_data ){
    // Get the student full Name
        $full_name     = wc_get_order_item_meta( $item_id, 'First Name - 1', true );
        $full_name    .= ' ' . wc_get_order_item_meta( $item_id, 'Last Name - 1', true );
        // Get the student email
        $student_email = wc_get_order_item_meta( $item_id, 'Student Email - 1', true );

        print_r('Name: ' . $full_name . ', Login Email: ');
        print_r($student_email . '<br/>');

}

?>

Это распечатает различных пользователей и их электронные письма в теле письма.

person calwex718    schedule 23.05.2018