Диагностика проблемы: почему WooCommerce отправляет письма по неоплаченным заказам
По умолчанию WooCommerce отправляет уведомления на почту покупателя и администратора при создании заказа, даже если оплата не была завершена. Это может приводить к путанице и излишним письмам, если клиент не оплатил заказ, а уведомление уже отправлено.
Типичные признаки проблемы:
- Письма с информацией о новом заказе приходят сразу после оформления, даже если оплата не прошла.
- Администратор получает уведомления о заказах в статусе «Ожидает оплаты».
- Клиенты получают письма с подтверждением заказа, но затем не завершают оплату.
Пошаговое решение: отключение отправки писем для заказов со статусом «Ожидает оплаты»
1. Выявление хуков, отвечающих за отправку писем
WooCommerce отправляет письма через класс WC_Emails. Для каждого статуса заказа есть свои email уведомления, например, WC_Email_New_Order и WC_Email_Customer_Processing_Order.
Нужно перехватить отправку и отменить ее, если статус заказа - pending (ожидает оплаты).
2. Добавление фильтра в functions.php или в кастомный плагин
Пример кода для отключения отправки писем по неоплаченным заказам:
add_filter('woocommerce_email_enabled_new_order', 'disable_emails_for_unpaid_orders', 10, 2);
add_filter('woocommerce_email_enabled_customer_processing_order', 'disable_emails_for_unpaid_orders', 10, 2);
function disable_emails_for_unpaid_orders($enabled, $order) {
if (!is_a($order, 'WC_Order')) {
return $enabled;
}
// Статус 'pending' означает, что заказ создан, но оплата не прошла
if ($order->get_status() === 'pending') {
return false;
}
return $enabled;
}Этот код отключит отправку двух основных писем — для администратора и для клиента — если заказ еще не оплачен.
3. Расширение решения для других email уведомлений
Если используются другие письма, например, отмена заказа или возврат, можно добавить аналогичные фильтры:
add_filter('woocommerce_email_enabled_customer_completed_order', 'disable_emails_for_unpaid_orders', 10, 2);
// и так далее, по аналогииПроверка результата после внедрения
Для проверки:
- Создайте тестовый заказ через сайт, выбрав вариант оплаты, который не завершаете (например, банковский перевод без подтверждения).
- Проверьте, что письма о новом заказе и обработке не отправляются.
- Завершите оплату вручную, изменив статус заказа в админке на
processing, и убедитесь, что письма теперь приходят.
Частые ошибки и как их исправить
- Код не срабатывает для всех типов писем: Некоторые письма имеют другие фильтры, например
woocommerce_email_enabled_customer_on_hold_order. Нужно убедиться, что добавлены все нужные фильтры. - Код помещен в неподходящее место: Размещайте код в
functions.phpдочерней темы или в пользовательском плагине, чтобы избежать потери при обновлениях. - Используются сторонние плагины для email: Они могут игнорировать стандартные фильтры WooCommerce. В таком случае нужно смотреть документацию плагина.
Практические советы по безопасности и производительности
- Отслеживайте логи почты, чтобы убедиться, что уведомления не пропадают для важных статусов.
- Используйте отдельный SMTP-сервер или сервис для отправки писем, чтобы повысить надежность доставки.
- Храните кастомный код в отдельном плагине, чтобы легче обновлять и контролировать изменения.
Сравнение способов отключения отправки писем
| Метод | Преимущества | Недостатки |
|---|---|---|
| Фильтры WooCommerce (как в статье) | Простой, не требует сторонних плагинов, гибкий | Требует базовых знаний PHP, нужно добавить для каждого email |
| Плагины для управления email (например, WP Mail SMTP) | Интерфейс для настройки, логирование писем | Могут не поддерживать фильтрацию по статусу заказа |
| Отключение email в настройках WooCommerce | Очень просто, без кода | Отключает все письма, нет гибкости |