Проблема: массовая рассылка уведомлений после отмены заказа
В WooCommerce по умолчанию при отмене заказа отправляется стандартное письмо покупателю и другим получателям. Иногда это не нужно, например, при автоматическом отменении или если магазин не хочет уведомлять клиента об отмене, чтобы не создавать лишнюю нагрузку на поддержку или не портить впечатление.
Задача — отключить отправку email-уведомлений именно после отмены заказа, сохранив остальные уведомления WooCommerce.
Диагностика проблемы
Для начала убедитесь, что именно стандартные письма WooCommerce отправляются после изменения статуса заказа на cancelled.
- Перейдите в WooCommerce > Настройки > Email и найдите уведомление "Отмена заказа".
- Проверьте, включена ли отправка уведомлений для этого статуса.
- Если письма приходят, значит, именно этот механизм активен.
Если письма приходят с другими статусами, возможно, нужна более сложная фильтрация.
Пошаговое решение: отключение email после отмены заказа
Лучший способ — использовать фильтр WooCommerce, который управляет отправкой email. Это woocommerce_email_enabled_{email_id}. Для отмены заказа email ID — cancelled_order.
Добавьте следующий код в functions.php вашей темы или в отдельный плагин:
add_filter('woocommerce_email_enabled_cancelled_order', 'disable_cancelled_order_email', 10, 2);
function disable_cancelled_order_email($enabled, $order) {
// Можно добавить дополнительные проверки, например, по способу оплаты или метаданным
return false; // Отключаем отправку письма отмены заказа
}Если нужно отключить уведомления для других email-типов, используйте аналогичные фильтры, например:
woocommerce_email_enabled_customer_cancelled_order— если есть такой emailwoocommerce_email_enabled_new_order— для новых заказов и т.д.
Как добавить условие по метаданным заказа
Если отмена производится автоматически и вы хотите отключать письма только в этом случае, можно использовать метаданные заказа:
add_filter('woocommerce_email_enabled_cancelled_order', 'disable_cancelled_order_email_conditional', 10, 2);
function disable_cancelled_order_email_conditional($enabled, $order) {
if ($order instanceof WC_Order) {
$auto_cancel = $order->get_meta('_auto_cancel'); // пример мета ключа
if ($auto_cancel === 'yes') {
return false;
}
}
return $enabled;
}В этом примере нужно добавить метаданные _auto_cancel при автоматической отмене заказа.
Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce.
- Измените статус заказа на
cancelledчерез админку или программно. - Убедитесь, что никаких писем об отмене заказа не отправляется (проверьте почтовый лог, например, через плагин WP Mail Logging).
- Проверьте, что остальные email-уведомления работают корректно.
Частые ошибки и как их исправить
- Код не работает, письма всё равно отправляются. Проверьте, что фильтр подключён в functions.php активной темы или плагина и не конфликтует с другими фильтрами.
- Используется кэш почты или SMTP-сервера. Очистите кэш, проверьте настройки SMTP, иногда письма отправляются вне WordPress.
- Неверный email ID в фильтре. Используйте правильный ID, например,
cancelled_order. Можно посмотреть ID в WooCommerce > Email. - Код добавлен, но после обновления темы исчез. Используйте дочернюю тему или плагин для пользовательских функций.
Практические советы по безопасности и производительности
- Не отключайте email уведомления без веской причины, чтобы не потерять важные коммуникации с клиентами.
- Если автоматизируете отмену заказов, добавляйте метаданные для точной фильтрации писем.
- Используйте плагины для логирования почты (например, WP Mail Logging), чтобы отследить отправку сообщений и ошибки.
- Минимизируйте количество кастомных фильтров в functions.php, чтобы не замедлять загрузку сайта.
Сравнение вариантов решения отключения email уведомлений
| Метод | Плюсы | Минусы |
|---|---|---|
Отключение через фильтр woocommerce_email_enabled_cancelled_order | Простой, точечный, не требует плагинов | Требует навыков кода, легко забыть при смене темы |
| Отключение через настройки WooCommerce Email | Просто, не требует кода | Отключает все письма отмены, без условий |
| Использование плагина для управления письмами | Гибкость, UI для настройки | Дополнительная нагрузка, зависимость от стороннего ПО |