Woocommerce电子邮件 - 根据产品数量发送多封电子邮件

时间:2018-05-18 21:57:50

标签: php wordpress woocommerce custom-fields email-notifications

在Woocommerce中,我有一个使用WC Fields收集学生姓名和电子邮件地址的课程产品,以及在购买本课程产品时发送电子邮件的自定义电子邮件模板。截至目前,基于answer in this thread,我可以收集添加到这些自定义字段的电子邮件地址,并向每位学生发送一封电子邮件作为BCC收件人。

我现在正在尝试将电子邮件包含在电子邮件正文中的学生姓名和电子邮件地址,但我不希望所有姓名都出现在同一封电子邮件中。例如,如果学生A(studenta@example.com)和学生B(studentb@example.com)都注册在同一次购买中,则学生A收到的电子邮件应该包含在身体内容中,例如"亲爱的学生A,谢谢你的报名。使用您的电子邮件地址studenta@example.com登录。"并且学生B收到的电子邮件应该与学生B的信息相同,并且他们不应该看到其他人的信息。

所以我必须发送多封电子邮件,根据购买的学生数量(在订购元中设置,从购买的产品元数据中添加)。

我尝试在for()之外添加一个while()来继续检查项目,直到它完成所有项目,并在每次发现时再次发送,但我认为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文件中的代码来自this answer,是:

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 个答案:

答案 0 :(得分:0)

我找到了问题上半部分的解决方案 - 将用户的名称和电子邮件从产品元数据添加到电子邮件正文中 - 但仍然无法让它发送一封独特的电子邮件每个电子邮件地址(电子邮件地址来自此元数据):

我将自定义电子邮件模板(这只是电子邮件模板,而不是创建/发送电子邮件的自定义功能)更新为以下内容:

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

}

?>

这会在电子邮件正文中打印各种用户及其电子邮件。