WooCommerce: как решить проблему с дублированием писем о заказах

Диагностика проблемы с дублирующимися письмами в 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 на время теста
Исправление кастомных хуковКонтроль над отправкойТребует навыков PHPremove_action + custom email trigger
Использование стороннего SMTP с очередямиНадёжность и логированиеПлатные решения, настройкаWP Mail SMTP Pro

Наш каталог плагинов WordPress