Диагностика проблемы с дублирующимися письмами в WooCommerce
Если клиенты или администраторы получают два и более одинаковых письма о создании заказа, это может приводить к путанице и негативно сказываться на репутации магазина. Основные причины дублирования писем:
- Конфликты между плагинами, отправляющими уведомления;
- Ошибка в кастомных хуках, добавленных в functions.php или плагинах;
- Повторный вызов функции отправки письма;
- Особенности работы некоторых SMTP-плагинов;
- Ошибки в коде темы, повторно вызывающие отправку.
Для начала нужно включить логирование почты и отследить, какие именно функции делают вызов отправки писем.
Пошаговое решение: как устранить дублирование писем в WooCommerce
1. Включение логирования почты WooCommerce
Добавьте следующий код в файл wp-config.php для включения логирования писем WooCommerce:
define( 'WC_LOG_HANDLER', true );
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
Логи сохраняются в wp-content/uploads/wc-logs/. Проверьте, сколько раз отправляется письмо при оформлении заказа.
2. Проверка сторонних плагинов SMTP и уведомлений
Отключите плагины, которые могут влиять на отправку писем (например, WP Mail SMTP, Postman SMTP, или кастомные плагины уведомлений). Проверьте, сохраняется ли дублирование.
3. Анализ кастомных хуков и функций
В файлах темы и плагинов ищите добавления на хуки WooCommerce, связанные с отправкой писем, например:
add_action( 'woocommerce_order_status_processing', 'custom_send_order_email' );
function custom_send_order_email( $order_id ) {
$order = wc_get_order( $order_id );
// доп. отправка письма
}
Убедитесь, что такие функции не вызывают WC()->mailer()->get_emails() для отправки стандартных писем, если WooCommerce уже делает это.
4. Пример корректной отмены дублирующей отправки
Если дублирование происходит из-за дополнительного вызова стандартного письма, можно отключить стандартный хук и заменить на свой:
remove_action( 'woocommerce_order_status_processing_notification', array( WC()->mailer()->get_emails()['WC_Email_Customer_Processing_Order'], 'trigger' ), 10 );
add_action( 'woocommerce_order_status_processing_notification', 'custom_processing_order_email', 10, 1 );
function custom_processing_order_email( $order_id ) {
$order = wc_get_order( $order_id );
// кастомный код отправки письма
}
Проверка результата
- Оформите тестовый заказ с включенным логированием.
- Проверьте логи в
wp-content/uploads/wc-logs/, что письмо отправлено ровно один раз. - Проверьте почтовый ящик получателей, чтобы убедиться в отсутствии дубликатов.
Частые ошибки и как их исправить
- Повторный вызов функции отправки — часто происходит при неправильном использовании хуков. Решение: внимательно проверьте, что функция не вызывается дважды на одном и том же хукe.
- Конфликт SMTP-плагинов — если используется более одного плагина для SMTP, это может вызвать повторную отправку. Решение: оставьте только один SMTP-плагин.
- Кэширование почты — некоторые плагины кэширования могут мешать корректной отправке почты. Решение: исключите страницы оформления заказа из кэширования.
Практические советы по оптимизации и безопасности
- Используйте профессиональные SMTP-плагины с поддержкой логирования и очередей (например, WP Mail SMTP Pro).
- Не добавляйте кастомные отправки писем, если WooCommerce уже отправляет нужные уведомления.
- Регулярно проверяйте логи почты и обновляйте плагины для избежания багов.
- Для повышения безопасности используйте SSL для SMTP-соединения и ограничьте права доступа к логам.
Сравнение вариантов решения проблемы
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Отключение конфликтующих плагинов | Быстро и без кода | Может потерять нужный функционал | Отключить WP Mail SMTP на время теста |
| Исправление кастомных хуков | Контроль над отправкой | Требует навыков PHP | remove_action + custom email trigger |
| Использование стороннего SMTP с очередями | Надёжность и логирование | Платные решения, настройка | WP Mail SMTP Pro |