В 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, однако я установил это) дважды, то есть отправляет одно и то же электронное письмо дважды всем. Как я могу заставить его отправлять дважды, но каждый раз только одному из получателей? Спасибо за любые предложения!