Диагностика проблемы с отправкой писем в WooCommerce
В стандартной конфигурации WooCommerce письма (уведомления о заказах, смене статуса и другие) отправляются сразу после события. В некоторых случаях это приводит к задержкам в работе сайта, особенно при большом количестве заказов, а также к проблемам с доставкой почты, если сервер перегружен. Отложенная отправка писем помогает разгрузить сервер и избежать блокировок почтовых сервисов.
Как реализовать отложенную отправку писем в WooCommerce
Использование стандартных хуков для отложенного выполнения
WooCommerce использует класс WC_Email для отправки писем. Чтобы отложить отправку, можно перехватить событие и поставить отправку письма в очередь с помощью WP-Cron. Пример кода, который помещает письмо в очередь с задержкой 10 минут:
add_action('woocommerce_email', 'wpmanager_defer_woocommerce_email', 10, 3);
function wpmanager_defer_woocommerce_email($email_class, $email_id, $order) {
if ( ! $order instanceof WC_Order ) {
return;
}
// Отменяем стандартную отправку
remove_action('woocommerce_order_status_pending_to_processing_notification', array($email_class->emails['WC_Email_Customer_Processing_Order'], 'trigger'), 10);
// Запускаем отложенную отправку через WP-Cron
wp_schedule_single_event(time() + 600, 'wpmanager_send_deferred_email', array($order->get_id(), $email_id));
}
add_action('wpmanager_send_deferred_email', 'wpmanager_process_deferred_email', 10, 2);
function wpmanager_process_deferred_email($order_id, $email_id) {
$order = wc_get_order($order_id);
if (!$order) return;
$mailer = WC()->mailer();
$emails = $mailer->get_emails();
if (isset($emails[$email_id])) {
$emails[$email_id]->trigger($order_id);
}
}
Этот код отключает стандартное мгновенное уведомление о переходе заказа в статус «обработка» и ставит отправку письма в очередь с задержкой 10 минут.
Настройка WP-Cron для надежной работы
WP-Cron по умолчанию запускается только при посещении сайта, что может привести к задержкам. Для повышения надежности рекомендуем отключить WP-Cron и настроить системный cron на сервере:
- В
wp-config.phpдобавить:define('DISABLE_WP_CRON', true); - В панели управления хостингом или через SSH добавить задание:
* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Замена https://example.com на адрес вашего сайта.
Проверка результата после настройки отложенной отправки
- Создайте тестовый заказ в WooCommerce и переведите его в нужный статус, например, «обработка».
- Проверьте, что письмо не пришло мгновенно, а через 10 минут.
- Для отладки можно добавить логирование, например, в файл
wp-content/debug.log:
if (defined('WP_DEBUG') && WP_DEBUG) {
error_log('Отложенное письмо отправлено для заказа ' . $order_id);
}
Частые ошибки при реализации отложенной отправки писем
- WP-Cron не запускается: если на сайте мало трафика или отключён WP-Cron, запланированные задачи не выполняются. Решение — настроить системный cron.
- Удаление событий WP-Cron: неаккуратная работа с хуками может привести к удалению или дублированию задач.
- Неправильный вызов метода trigger: обязательно передайте ID заказа, иначе письмо не отправится.
- Не учтены разные типы писем: код выше ориентирован на конкретный email, для отправки других писем нужно адаптировать логику.
Практические советы по безопасности и производительности
- Избегайте слишком большого количества отложенных задач — это может замедлить сайт.
- Логируйте события отправки писем, чтобы отслеживать сбои.
- Используйте SMTP-плагины (например, WP Mail SMTP) для улучшения доставки писем.
- Ограничьте права на выполнение WP-Cron для безопасности.
Сравнение способов реализации отложенной отправки писем
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Стандартный WP-Cron | Простота внедрения, без установки новых сервисов | Зависимость от трафика, возможные задержки | Подходит для сайтов с хорошей посещаемостью |
| Системный cron | Надёжность и своевременность выполнения задач | Требуется доступ к серверу или хостинг с поддержкой cron | Лучший выбор для высоконагруженных сайтов |
| Плагины отложенной отправки (например, WP Offload SES) | Готовые решения с расширенными настройками | Дополнительная нагрузка и возможные расходы | Для сложных проектов с большим объёмом писем |