WooCommerce: автоматическое отключение отправки писем по заказам без оплаты

Проблема: нежелательная рассылка писем по неоплаченным заказам в WooCommerce

В стандартной работе WooCommerce после оформления заказа по умолчанию отправляется письмо подтверждения, даже если заказ не был оплачен (например, для оплаты при получении). Это может быть нежелательно, если вы хотите информировать клиента только после успешного платежа, чтобы избежать недопониманий и лишних уведомлений.

Диагностика проблемы

Для проверки, отправляется ли письмо по неоплаченным заказам, достаточны следующие шаги:

  • Создайте тестовый заказ с одним из способов оплаты «Оплата при получении» или другим методом, не предполагающим моментальную оплату.
  • Завершите оформление заказа, но не подтверждайте оплату.
  • Проверьте почтовый ящик клиента на наличие письма с подтверждением заказа.

Если письмо приходит, значит, WooCommerce отправляет уведомления сразу после создания заказа, независимо от оплаты.

Пошаговое решение: отключаем отправку писем для неоплаченных заказов

Для управления отправкой писем в WooCommerce используется система хуков и фильтров. Нам нужно перехватить отправку письма с подтверждением заказа и проверить статус оплаты — и отменить отправку, если заказ не оплачен.

1. Отмена отправки письма 'new_order' и 'customer_processing_order' для неоплаченных заказов

В WooCommerce письма отправляются через классы WC_Email. Нас интересует customer_processing_order — письмо, информирующее о принятии заказа к обработке.

Добавьте следующий код в functions.php вашей темы или в кастомный плагин:

add_filter('woocommerce_email_recipient_customer_processing_order', 'disable_processing_email_for_unpaid_orders', 10, 2);
function disable_processing_email_for_unpaid_orders($recipient, $order) {
    if (!$order instanceof WC_Order) return $recipient;

    // Проверяем, оплачен ли заказ
    if ($order->get_status() !== 'processing' && $order->get_status() !== 'completed') {
        // Отключаем отправку письма
        return '';
    }
    return $recipient;
}

Этот фильтр отменит отправку письма, если статус заказа не processing или completed, то есть заказ еще не оплачен.

2. Дополнительная проверка для письма 'customer_completed_order'

Если у вас настроены письма о завершении заказа, можно аналогично отключить их для неоплаченных заказов:

add_filter('woocommerce_email_recipient_customer_completed_order', 'disable_completed_email_for_unpaid_orders', 10, 2);
function disable_completed_email_for_unpaid_orders($recipient, $order) {
    if (!$order instanceof WC_Order) return $recipient;
    if ($order->get_status() !== 'completed') {
        return '';
    }
    return $recipient;
}

Проверка результата после внедрения

  1. Создайте новый тестовый заказ с оплатой при получении.
  2. После оформления заказа проверьте, что письма с подтверждением не приходят.
  3. Измените вручную статус заказа в админке на processing (оплаченный).
  4. Проверьте, что после изменения статуса письма начинают отправляться.

Частые ошибки и как их исправить

  • Письма продолжают приходить после внедрения кода: проверьте, что код добавлен именно в активную тему или плагин. Очистите кэш сайта и почты.
  • Некорректная проверка статуса: некоторые магазины используют нестандартные статусы заказов. Убедитесь, что в условиях get_status() указаны именно те статусы, которые соответствуют оплате.
  • Письма не приходят вообще: возможно, код возвращает пустую строку для всех заказов. Проверьте, что условие корректно и не блокирует письма для оплаченных заказов.

Практические советы по безопасности и производительности

  • Не храните логику отключения писем в шаблонах — используйте хуки и фильтры, как показано выше.
  • Проверяйте статусы заказов через методы WC_Order, а не напрямую через метаданные, чтобы избежать ошибок при обновлениях WooCommerce.
  • Для крупных магазинов с большим потоком заказов можно дополнительно кешировать результаты проверки статуса, чтобы снизить нагрузку.

Сравнение вариантов реализации

МетодПлюсыМинусы
Отключение через фильтры WC_EmailГибко, работает с любыми письмами, не затрагивает логику заказовТребует понимания хуков WooCommerce
Изменение статуса заказов вручнуюПростота, не требует кодаРиск забыть изменить статус, письма могут уйти не вовремя
Использование сторонних плагинов для управления письмамиИнтерфейс для настройки, дополнительные функцииМожет влиять на производительность, не всегда гибко
WooCommerce: массовое обновление цен товаров через код
24.06.2026
Как создать подробный отчет по KPI в WordPress
09.01.2026
WooCommerce: автоматическое создание возвратов товаров по счетчику продаж
08.06.2026
WooCommerce: автоматическое отключение отправки писем по заказам без оплаты
30.05.2026
Как избежать проблем с подключением стилей и скриптов в WordPress
27.01.2026