Диагностика проблемы повторной отправки писем в WooCommerce
Повторная отправка уведомлений клиенту при изменении статуса заказа может привести к негативному пользовательскому опыту и загромождению почтового ящика. Чаще всего проблема возникает, когда статус заказа меняется несколько раз подряд на один и тот же, либо когда автоматизированные процессы обновляют статус без необходимости отправлять письмо.
Чтобы проверить, что именно вызывает повторные письма, изучите логи почтового сервера, а также WooCommerce Action Scheduler, который отвечает за очереди задач. Включите отладку WooCommerce (define('WP_DEBUG', true); define('WC_LOG_HANDLER', true);) и проверьте файл wp-content/uploads/wc-logs/ на предмет ошибок и повторных вызовов почты.
Пошаговое решение: исключаем повторную отправку писем по условиям
1. Подключаемся к хуку отправки письма
Для контроля отправки писем WooCommerce использует класс WC_Email и хук woocommerce_email_send. Для изменения логики отправки применим фильтр woocommerce_email_enabled_{email_id}, где {email_id} — ID письма (например, customer_completed_order).
2. Добавляем условие в functions.php или в кастомный плагин
add_filter('woocommerce_email_enabled_customer_completed_order', 'disable_duplicate_email_by_condition', 10, 2);
function disable_duplicate_email_by_condition($enabled, $order) {
// Проверяем, что $order — объект WC_Order
if (!is_a($order, 'WC_Order')) {
return $enabled;
}
// Получаем мета-данные или свойство, по которому определяем необходимость отправки
$disable_email = get_post_meta($order->get_id(), '_disable_duplicate_email', true);
if ($disable_email === 'yes') {
return false; // Отключаем отправку письма
}
return $enabled;
}В этом примере мы основываемся на кастомном мета-поле _disable_duplicate_email, которое можно устанавливать программно при определённых условиях (например, при повторном изменении статуса заказа).
3. Устанавливаем мета-поле при изменении статуса заказа
add_action('woocommerce_order_status_changed', 'set_disable_email_flag_on_status_change', 10, 4);
function set_disable_email_flag_on_status_change($order_id, $old_status, $new_status, $order) {
// Пример условия: если статус меняется с "completed" на "completed" (повторное присвоение)
if ($old_status === 'completed' && $new_status === 'completed') {
update_post_meta($order_id, '_disable_duplicate_email', 'yes');
} else {
// Иначе сбрасываем флаг
delete_post_meta($order_id, '_disable_duplicate_email');
}
}Проверка результата после внедрения
Для проверки:
- Измените статус заказа на нужный несколько раз подряд.
- Отслеживайте почтовые уведомления — при повторном изменении статуса письмо не должно отправляться.
- Проверьте в админке WooCommerce, что мета-поле
_disable_duplicate_emailустанавливается и удаляется корректно. - Используйте инструменты отладки WooCommerce и логов почтового сервера для контроля срабатывания фильтра.
Частые ошибки и способы их исправления
- Неверный ID письма в фильтре: Убедитесь, что используете правильный ID, например
customer_completed_orderилиcustomer_processing_order. Чтобы узнать ID, смотрите класс письма вwoocommerce/includes/emails/. - Неправильная проверка типа объекта: Функция должна проверять, что $order — объект
WC_Order, иначе может быть ошибка. - Флаг мета-поля не сбрасывается: При смене статуса на другой необходимо удалить мета-поле, иначе письма отключатся навсегда.
- Кэширование и очереди: Если используется Action Scheduler, письма могут отправляться с задержкой. Очищайте очередь после внесения изменений.
Практические советы по безопасности и производительности
- Не используйте глобальные флаги без проверки — это может привести к отключению важных писем.
- Храните флаги в мета-данных заказа, не в опциях сайта — так сохраняется контекст.
- Используйте правильные хуки для минимизации нагрузки: фильтры отправки писем обрабатываются только при необходимости.
- Тестируйте изменения на staging-сайте, чтобы избежать сбоев на рабочем магазине.
Сравнение решений: плагин vs код
| Подход | Плюсы | Минусы |
|---|---|---|
| Готовые плагины (например, WooCommerce Email Customizer) | Простота настройки, визуальный интерфейс, поддержка | Может не поддерживать тонкую логику по условиям, нагрузка на сайт, платные функции |
| Кастомный код (фильтры и хуки) | Полный контроль, легковесность, гибкость под конкретные условия | Требует навыков разработки, возможны ошибки без тестирования |