Вопрос или проблема
Я очень запутался с 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()
.
Решение
-
Удалите
include_once
: Замените ваши вызовыinclude_once
наinclude
. Это позволит повторно генерировать шаблон для каждого вызоваwp_mail()
. -
Разделите функции:
Рекомендуется разделить процесс отправки электронных писем на отдельные функции для клиента и администратора. Это не только улучшит читаемость кода, но и повысит его производительность:
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);
}
-
Оптимизация роста нагрузки:
Чтобы избежать долговременных задержек при отправке множества электронных писем, рассмотрите возможность использования фоновых процессов (каких-то job-менеджеров) для массовой рассылки писем.
Заключение
Функция wp_mail()
в WordPress может не всегда правильно работать в циклах из-за ограничений в самой функции. Следуя рекомендациям выше, вы сможете эффективно отправлять электронные письма как клиентам, так и администраторам без возникшей путаницы. Также следует помнить о возможности использования сторонних API или плагинов для массовой рассылки, если вы планируете отправку большего количества писем.
Если у вас остались дополнительные вопросы или нужны более детальные пояснения, не стесняйтесь обращаться за помощью.