Электронная почта Woocommerce - отправка нескольких электронных писем в зависимости от количества товаров
В Woocommerce у меня есть продукт курса, который использует поля WC для сбора имен и адресов электронной почты учащихся, а также пользовательский шаблон электронной почты, который отправляет электронное письмо при покупке этого продукта курса. На данный момент, основываясь на ответе в этой теме, я могу собирать адреса электронной почты, добавленные в эти настраиваемые поля, и отправлять по одному письму каждому студенту в качестве получателя BCC.
Сейчас я пытаюсь, чтобы электронные письма включали имя студента и адрес электронной почты в текст письма, но я не хочу, чтобы все имена появлялись в одном и том же письме. Например, если учащийся A (studenta@example.com) и учащийся B (studentb@example.com) оба зарегистрированы в одной покупке, электронное письмо, полученное студентом A, должно просто содержать в теле что-то вроде "Уважаемый студент A, Благодарим Вас за регистрацию. Используйте свой адрес электронной почты studenta@example.com для входа." и в электронном письме, полученном Студентом Б, должно быть то же самое, но с информацией Студента Б, и они не должны видеть информацию другого.
Поэтому мне придется отправлять несколько электронных писем, основываясь на количестве студентов, зачисленных в эту покупку (которая задается в метадане заказа, добавленной из мета купленного продукта).
Я попытался добавить 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, однако я их установил) дважды, то есть отправляет одно и то же электронное письмо дважды всем. Как я могу заставить его отправлять дважды, но каждый раз только одному из получателей? Спасибо за любые предложения!
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/>');
}
?>
Это печатает различных пользователей и их электронные письма в теле письма.