Диагностика проблемы: почему WooCommerce отправляет письма об отмене заказа
По умолчанию WooCommerce отправляет уведомления клиентам и администраторам о различных изменениях статусов заказа, включая статус "Отменён" (cancelled). В некоторых случаях это приводит к лишним письмам, которые могут путать клиентов или создавать ненужную нагрузку на почтовый сервер.
Для начала стоит проверить, действительно ли письма об отмене заказа идут автоматически. Сделать это можно так:
- В админке WordPress зайдите в WooCommerce → Статусы заказов.
- Просмотрите историю заказов, которые были отменены.
- Проверьте почтовый лог, если установлен плагин для логирования почты (например, WP Mail Logging).
Если письма отправляются и это нежелательно, нужно отключить их программно, сохранив при этом остальные уведомления.
Пошаговое решение: отключаем письма при статусе "Отменён"
1. Отключаем письма на уровне хуков WooCommerce
WooCommerce использует классы писем, которые вы можете отключить через фильтры. В нашем случае отключим именно письма, связанные с отменённым заказом.
function disable_cancelled_order_email( $email_classes ) {
if ( isset( $email_classes['WC_Email_Cancelled_Order'] ) ) {
unset( $email_classes['WC_Email_Cancelled_Order'] );
}
return $email_classes;
}
add_filter( 'woocommerce_email_classes', 'disable_cancelled_order_email' );2. Проверяем, что письма действительно не отправляются
После добавления кода в файл functions.php вашей дочерней темы или в плагин для пользовательских функций, сделайте тест:
- Создайте заказ в WooCommerce.
- Измените его статус на "Отменён".
- Проверьте почту и логи — письмо не должно прийти.
Проверка результата после внедрения
Чтобы убедиться, что решение сработало, используйте следующий чек-лист:
- Измените статус заказа на "Отменён" и убедитесь, что письмо не отправилось.
- Измените статус заказа на другие (например, "Выполнен") — письма должны отправляться как обычно.
- Проверьте почтовый лог, если используется — отсутствие записи о письме отмены.
Частые ошибки и как их исправить
- Код добавлен в неправильный файл: убедитесь, что код находится в
functions.phpактивной дочерней темы или в плагине, а не в файлах ядра WooCommerce. - Кэширование почты: на некоторых серверах или при использовании SMTP или плагинов кэширования почты письма могут уходить с задержкой или повторно. Отключите кэширование для проверки.
- Конфликт с другими плагинами: другие плагины могут форсировать отправку писем. Для диагностики временно отключите сторонние плагины.
- Неправильное имя класса письма: убедитесь, что используете правильный ключ класса —
WC_Email_Cancelled_Orderименно для писем отмены заказа в WooCommerce.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию сайта перед внесением изменений в код.
- Используйте дочернюю тему или собственный плагин для пользовательских функций, чтобы не потерять изменения при обновлении WooCommerce.
- Проверьте работу email через SMTP плагин, чтобы точно знать, что письма отправляются корректно.
- Для массовых изменений статусов используйте WP-CLI или кастомные скрипты, чтобы избежать лишних автоматических писем.
Альтернативные варианты и сравнение
| Метод | Плюсы | Минусы | Примечания |
|---|---|---|---|
Отключение класса письма через фильтр woocommerce_email_classes | Просто, не требует внешних плагинов | Отключает все письма отмены, нельзя тонко настроить | Рекомендуется для большинства случаев |
Отключение через woocommerce_email_enabled_{$email_id} фильтр | Позволяет отключать письма динамически | Требует более тонкой настройки, больше кода | Подходит для условий по пользователю, продукту и т.п. |
| Использование плагинов для управления email (например, WP Mail Control) | Управление через интерфейс, без кода | Может быть избыточным, требует установки плагина | Удобно для непрофессионалов |
Пример кода для более гибкого отключения письма по условию
Если нужно отключать письмо об отмене заказа только для определённых ролей пользователей или по другим условиям, используйте следующий код:
add_filter( 'woocommerce_email_enabled_cancelled_order', 'conditional_disable_cancelled_order_email', 10, 2 );
function conditional_disable_cancelled_order_email( $enabled, $order ) {
if ( ! $order instanceof WC_Order ) {
return $enabled;
}
// Отключаем письмо для пользователей с ролью 'customer'
$user_id = $order->get_user_id();
if ( $user_id ) {
$user = get_userdata( $user_id );
if ( in_array( 'customer', (array) $user->roles, true ) ) {
return false;
}
}
return $enabled;
}