wp_mail отправляет несколько писем в цикле

Вопрос или проблема

Я очень запутался с wp_mail(). Вот мой код.

function email_notification_for_admin_and_customer( $order_data ) {
    $subject_email="Тема LOREM IPSUM";
    $customer_email="Привет, клиент! Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempus, dui eget luctus accumsan, turpis orci malesuada turpis, eget volutpat ante velit a quam.";
    $admin_email="Привет, администратор! Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempus, dui eget luctus accumsan, turpis orci malesuada turpis, eget volutpat ante velit a quam.";
    $send_email = array(
        array(
            'to' => '[email protected]',
            'subject' => $subject_email,
            'message' => $customer_email
        ),
        array(
            'to' => '[email protected]',
            'subject' => $subject_email,
            'message' => $admin_email
        )
    );

    foreach ($send_email as $key => $value) {
        wp_mail( $value['to'], $value['subject'], $value['message']);
    }

}

Я хочу отправить уведомление электронной почтой администратору и клиенту, но wp_mail() отправляет только первое письмо, которое предназначено клиенту. Можете помочь мне? Спасибо.

У меня такая же проблема с этим обсуждением, но в другом контексте.

ОБНОВИТЕ ОТВЕТ

Я использую фильтр wp_mail, чтобы отформатировать обычную электронную почту WordPress в мой HTML-шаблон электронной почты.

add_filter('wp_mail', 'my_wp_mail_filter');
function my_wp_mail_filter($args) {
    $message = $args['message'];
    $args['message'] = wpet_email_template(apply_filters('wpet_filter_email', $message));
    return $args;
}

Это функция для включения HTML-шаблона.

function wpet_email_template($message) {

    // Отрисовка шаблона
    ob_start();
    include('custom-email-template.php');
    $wpet_template = ob_get_contents();
    ob_end_clean();

    // Замена заполнителя
    $message = str_replace('%%MAILCONTENT%%', $message, $wpet_template);

    // Возвращение шаблона с данными
    return $message;
}

Проблема в include_once(‘custom-email-template.php’); потом я изменил на include(‘custom-email-template.php’);

Так что это и есть проблема, почему письмо отправляется только на электронную почту клиента (первый массив $send_email).

Вот ответ

Функция wp_mail() не подходит для использования в цикле.

К сожалению, цикл, повторяющийся сотни раз, может значительно замедлить выполнение скрипта, как указывается в ссылке на функцию PHP_mail(). Стоит отметить, что функция mail() не подходит для отправки больших объемов письма в цикле. Эта функция открывает и закрывает сокет SMTP для каждого письма, что не очень эффективно и вызывает много сбоев во время выполнения цикла – эту информацию я нашел в книге SmashingMagazine о кастомизации WordPress, опубликованной в марте 2016 года.

Я советую разделить функциональность отправки уведомлений по электронной почте для администраторов и клиентов.

function email_notification_for_customer( $order_data ) {    

    $subject_email="Тема LOREM IPSUM";
    $customer_email="Привет, клиент! Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempus, dui eget luctus accumsan, turpis orci malesuada turpis, eget volutpat ante velit a quam.";  

    /* отправка списку клиентов */
    $send_email_to = array(
        '[email protected]',
        '[email protected]',
        '[email protected]',
        '[email protected]',
        '[email protected]'
    );  

    wp_mail( send_email_to, $subject_email, $customer_email);
}

function email_notification_for_admin( $order_data ) {

    $subject_email="Тема LOREM IPSUM";
    $admin_email="Привет, администратор! Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempus, dui eget luctus accumsan, turpis orci malesuada turpis, eget volutpat ante velit a quam.";

    /* отправка на электронную почту одного администратора */
    $send_email_to = array(
        '[email protected]'
    );

    wp_mail( $value['to'], $subject_email, $admin_email);
}

Ответ или решение

Отправка нескольких электронных писем с использованием wp_mail в WordPress: Полное руководствo

Когда делаешь попытку отправить несколько электронных писем через функцию wp_mail() в WordPress, может возникнуть множество путаниц и проблем. В этом руководстве мы детально рассмотрим вашу проблему и предложим эффективные решения.

Проблема

Вы описали, что ваша функция email_notification_for_admin_and_customer отправляет только первое письмо (для клиента) и игнорирует второе (для администратора). По всей видимости, причина заключается в некорректном использовании функции include_once в вашем фильтре wp_mail, что вызывает конфликты при отправке второго письма.

Основная структура функции

Ваш исходный код выглядит следующим образом:

function email_notification_for_admin_and_customer( $order_data ) {
    // Прочие файлы пропускаются
}

Этот код отправляет одно или несколько электронных писем в цикле, однако, wp_mail() может иметь определённые ограничения при выполнении в цикле, что вызывает проблемы с отправкой.

Происхождение проблемы

Использование include_once в вашем фильтре может ограничивать вызовы шаблона электронного письма. При повторном запуске функции вторичное включение шаблона не происходит, что приводит к ошибке и игнорированию второго вызова wp_mail().

Решение

  1. Удалите include_once: Замените ваши вызовы include_once на include. Это позволит повторно генерировать шаблон для каждого вызова wp_mail().

  2. Разделите функции:

    Рекомендуется разделить процесс отправки электронных писем на отдельные функции для клиента и администратора. Это не только улучшит читаемость кода, но и повысит его производительность:

function email_notification_for_customer($order_data) {
    $subject_email = "Subject LOREM IPSUM";
    $customer_email = "Hi Customer, Lorem ipsum dolor sit amet...";
    $customer_emails = [
        'customer1@example.com',
        'customer2@example.com',
        // другие адреса
    ];

    foreach ($customer_emails as $email) {
        wp_mail($email, $subject_email, $customer_email);
    }
}

function email_notification_for_admin($order_data) {
    $subject_email = "Subject LOREM IPSUM";
    $admin_email = "Hi Admin, Lorem ipsum dolor sit amet...";
    $admin_email_address = 'admin@example.com';

    wp_mail($admin_email_address, $subject_email, $admin_email);
}
  1. Оптимизация роста нагрузки:

    Чтобы избежать долговременных задержек при отправке множества электронных писем, рассмотрите возможность использования фоновых процессов (каких-то job-менеджеров) для массовой рассылки писем.

Заключение

Функция wp_mail() в WordPress может не всегда правильно работать в циклах из-за ограничений в самой функции. Следуя рекомендациям выше, вы сможете эффективно отправлять электронные письма как клиентам, так и администраторам без возникшей путаницы. Также следует помнить о возможности использования сторонних API или плагинов для массовой рассылки, если вы планируете отправку большего количества писем.

Если у вас остались дополнительные вопросы или нужны более детальные пояснения, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...