Диагностика проблемы с отправкой писем в WooCommerce
В стандартной установке WooCommerce письма о заказах отправляются сразу после определённых событий (например, создание заказа или смена статуса). Иногда возникает необходимость отложить отправку уведомлений, например, чтобы избежать спама, сгруппировать письма или отправлять их в определённое время. Если вы замечаете, что письма уходят слишком быстро, не успевают корректно формироваться, или хотите реализовать кастомный тайминг — стандартных настроек WooCommerce недостаточно.
Как реализовать отложенную отправку писем WooCommerce через wp_cron
Общая идея
Мы отменим стандартную отправку письма по событию, сохраним данные письма в опции или в пользовательской таблице, а затем запустим отложенную отправку через wp_cron с нужной задержкой.
Пошаговое решение
- Отменяем стандартную отправку письма при смене статуса заказа — используем хук
woocommerce_order_status_changedи отключаем отправку через фильтр. - Сохраняем данные письма для последующей отправки, например, в опции или пользовательской таблице.
- Регистрируем периодический wp_cron, который проверяет отложенные письма и отправляет их.
Пример кода
add_filter('woocommerce_email_enabled_customer_processing_order', 'disable_immediate_order_email', 10, 2);
function disable_immediate_order_email($enabled, $order) {
// Отключаем стандартную отправку письма при смене статуса на processing
return false;
}
add_action('woocommerce_order_status_changed', 'schedule_delayed_order_email', 10, 4);
function schedule_delayed_order_email($order_id, $old_status, $new_status, $order) {
if ($new_status === 'processing') {
// Сохраняем ID заказа и время отправки через 10 минут
$delayed_emails = get_option('delayed_woocommerce_emails', []);
$delayed_emails[$order_id] = time() + 600; // 10 минут задержка
update_option('delayed_woocommerce_emails', $delayed_emails);
}
}
// Регистрируем wp_cron событие для отправки писем
if (!wp_next_scheduled('send_delayed_woocommerce_emails')) {
wp_schedule_event(time(), 'minute', 'send_delayed_woocommerce_emails');
}
add_action('send_delayed_woocommerce_emails', 'process_delayed_woocommerce_emails');
function process_delayed_woocommerce_emails() {
$delayed_emails = get_option('delayed_woocommerce_emails', []);
if (empty($delayed_emails)) return;
foreach ($delayed_emails as $order_id => $send_time) {
if ($send_time <= time()) {
$order = wc_get_order($order_id);
if ($order) {
// Отправляем письмо
WC()->mailer()->get_emails()['WC_Email_Customer_Processing_Order']->trigger($order_id);
}
unset($delayed_emails[$order_id]);
}
}
update_option('delayed_woocommerce_emails', $delayed_emails);
}Проверка результата
- Создайте заказ с переходом в статус
processing. - Проверьте, что сразу письмо не отправляется (например, отключите все внешние SMTP-сервисы для теста или проверьте логи).
- Через 10 минут письмо должно быть отправлено.
- Для отладки можно добавить логи в функцию
process_delayed_woocommerce_emailsлибо временно уменьшить задержку.
Частые ошибки и как их исправить
- Письма не отправляются вообще
Проверьте, что wp_cron работает на сервере. Если сайт не получает трафик, wp_cron может не запускаться. Для надёжности настройте системный cron (например, через crontab) на вызовwp cron event run --due-now. - Письма отправляются сразу, несмотря на код
Проверьте, что фильтрwoocommerce_email_enabled_customer_processing_orderвозвращаетfalse. Возможно, он конфликтует с другими плагинами, отключите их для теста. - Письма отправляются, но с некорректным содержимым
Отправляйте письма через стандартный метод WooCommerce, как в примере, чтобы сохранить шаблоны и данные.
Практические советы по безопасности и производительности
- Храните данные отложенных писем в виде массива в опции только для небольшого количества заказов. При большом количестве лучше использовать отдельную таблицу в базе.
- Регулярно чистите устаревшие записи, чтобы не накапливать мусор.
- Для повышения надёжности настройки wp_cron используйте системный cron.
- При большом трафике и объёмах заказов рассмотрите использование сторонних очередей (например, с Redis или RabbitMQ) для управления отправкой писем.
Сравнение вариантов реализации отложенной отправки писем WooCommerce
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Код на wp_cron (описано выше) | Гибкость, не требует сторонних плагинов, легко настраивается | Зависит от работы wp_cron, проблемы при низком трафике | Отложенная отправка заказов с кастомной задержкой |
| Плагины очередей писем (например, WP Mail SMTP с очередью) | Простота настройки, поддержка SMTP, надежность доставки | Дополнительные затраты, ограниченная кастомизация | Общая оптимизация отправки почты |
| Внешние сервисы (SendGrid, Mailgun) | Высокая надежность, аналитика, масштабируемость | Необходима интеграция, платные тарифы | Массовая рассылка, маркетинговые кампании |