Электронная почта Woocommerce - отправка нескольких электронных писем в зависимости от количества товаров - PullRequest
0 голосов
/ 19 мая 2018

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

IСейчас я пытаюсь, чтобы в письме были указаны имя и адрес электронной почты учащегося, но я не хочу, чтобы все имена появлялись в одном и том же письме.Например, если учащийся A (studenta@example.com) и учащийся B (studentb@example.com) оба зарегистрированы в одной и той же покупке, электронное письмо, полученное студентом A, должно просто содержать в теле что-то вроде «Уважаемый студент A,Благодарим Вас за регистрацию. Используйте свой адрес электронной почты studenta@example.com для входа. "и в электронном письме, полученном студентом 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;
}

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

1 Ответ

0 голосов
/ 24 мая 2018

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

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

<?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/>');

}

?>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...