Диагностика проблемы: почему WooCommerce отправляет письма по неоплаченным заказам
По умолчанию WooCommerce отправляет уведомления клиентам и администратору о различных изменениях статуса заказа, в том числе при создании нового заказа. Если заказ создан, но не оплачен, например, при выборе способа оплаты с отложенной оплатой или при ошибках в платежных системах, клиент получает письма, которые могут вводить в заблуждение.
Это приводит к повышенной нагрузке на службу поддержки и ухудшению пользовательского опыта. Поэтому задача — отключить автоматическую отправку писем по заказам, которые так и не были оплачены.
Пошаговое решение: отключение писем по неоплаченным заказам через хуки
1. Определяем, какие письма нужно отключить
Основные письма WooCommerce, связанные с заказом:
- new_order — уведомление администратору о новом заказе;
- customer_processing_order — уведомление клиенту о начале обработки заказа (обычно после оплаты);
- customer_completed_order — уведомление клиенту о выполнении заказа;
- customer_on_hold_order — уведомление клиенту о заказе в состоянии ожидания;
- customer_invoice — счет клиенту;
Нам нужно отключить отправку писем customer_processing_order и customer_on_hold_order для неоплаченных заказов.
2. Реализуем фильтр для отключения писем по статусам неоплаченных заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
add_filter('woocommerce_email_enabled_customer_processing_order', 'disable_emails_for_unpaid_orders', 10, 2);
add_filter('woocommerce_email_enabled_customer_on_hold_order', 'disable_emails_for_unpaid_orders', 10, 2);
function disable_emails_for_unpaid_orders($enabled, $order) {
if (!$order instanceof WC_Order) {
return $enabled;
}
// Проверяем статус оплаты
if ('pending' === $order->get_status() || 'failed' === $order->get_status()) {
// Отключаем отправку письма
return false;
}
return $enabled;
}Этот код отключает отправку писем, если статус заказа pending (ожидание оплаты) или failed (отказ).
3. Дополнительно: отключение письма new_order администратору для неоплаченных заказов
Если нужно, чтобы админ не получал уведомления о неоплаченных заказах, добавьте:
add_filter('woocommerce_email_enabled_new_order', 'disable_admin_email_for_unpaid_orders', 10, 2);
function disable_admin_email_for_unpaid_orders($enabled, $order) {
if (!$order instanceof WC_Order) {
return $enabled;
}
if ('pending' === $order->get_status() || 'failed' === $order->get_status()) {
return false;
}
return $enabled;
}Проверка результата после внедрения
- Создайте тестовый заказ со статусом
pending(например, выбрав оплату при получении без фактической оплаты). - Проверьте, что письма
customer_processing_orderиcustomer_on_hold_orderне отправляются на почту клиента. - Если применяли отключение для
new_order, убедитесь, что администратор тоже не получает письмо. - Для проверки можно включить режим отладки WooCommerce и просмотреть логи отправки писем (
WooCommerce > Статус > Логи).
Частые ошибки и как исправить
- Письма всё равно отправляются. Возможно, код добавлен в неподходящее место или тема/плагин переопределяет фильтры. Убедитесь, что код выполняется (например, добавьте
error_logвнутри функции). - Неверный статус заказа. Статусы могут отличаться, если есть кастомные платежные шлюзы. Проверьте текущий статус заказа через
$order->get_status(). - Конфликты с плагинами для рассылок. Если используются сторонние SMTP или сервисы рассылок, они могут игнорировать стандартные фильтры WooCommerce. В этом случае настройте фильтрацию на уровне плагина.
- Функция не получает объект WC_Order. Проверьте, что в фильтр передаётся правильный объект, иначе добавьте проверку и возвращайте исходное значение.
Практические советы по безопасности и производительности
- Добавляйте код через дочернюю тему или собственный плагин, чтобы избежать потери при обновлении.
- Используйте кэширование и минимизируйте вызовы функций внутри фильтров для ускорения обработки.
- Тестируйте изменения на staging-сайте перед применением на продакшене.
- Для расширенной настройки уведомлений используйте плагин Clearfy Pro, позволяющий гибко управлять уведомлениями и оптимизировать сайт.
Сравнение вариантов отключения писем WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Фильтры хуков (как в статье) | Просто, быстро, не требует сторонних плагинов | Ограничено стандартными статусами, требует знаний PHP |
| Отключение писем через настройки WooCommerce | Простота настройки без кода | Не позволяет селективно отключать письма по статусу |
| Плагины управления email (например, Clearfy Pro) | Гибкая настройка, удобный интерфейс, дополнительные функции | Платные решения, дополнительная нагрузка |