WooCommerce: установка и настройка отложенного отправления писем

Диагностика проблемы с отправкой писем в WooCommerce

В стандартной установке WooCommerce письма о заказах отправляются сразу после определённых событий (например, создание заказа или смена статуса). Иногда возникает необходимость отложить отправку уведомлений, например, чтобы избежать спама, сгруппировать письма или отправлять их в определённое время. Если вы замечаете, что письма уходят слишком быстро, не успевают корректно формироваться, или хотите реализовать кастомный тайминг — стандартных настроек WooCommerce недостаточно.

Как реализовать отложенную отправку писем WooCommerce через wp_cron

Общая идея

Мы отменим стандартную отправку письма по событию, сохраним данные письма в опции или в пользовательской таблице, а затем запустим отложенную отправку через wp_cron с нужной задержкой.

Пошаговое решение

  1. Отменяем стандартную отправку письма при смене статуса заказа — используем хук woocommerce_order_status_changed и отключаем отправку через фильтр.
  2. Сохраняем данные письма для последующей отправки, например, в опции или пользовательской таблице.
  3. Регистрируем периодический wp_cron, который проверяет отложенные письма и отправляет их.

Пример кода

add_filter('woocommerce_email_enabled_customer_processing_order', 'disable_immediate_order_email', 10, 2);
function disable_immediate_order_email($enabled, $order) {
    // Отключаем стандартную отправку письма при смене статуса на processing
    return false;
}

add_action('woocommerce_order_status_changed', 'schedule_delayed_order_email', 10, 4);
function schedule_delayed_order_email($order_id, $old_status, $new_status, $order) {
    if ($new_status === 'processing') {
        // Сохраняем ID заказа и время отправки через 10 минут
        $delayed_emails = get_option('delayed_woocommerce_emails', []);
        $delayed_emails[$order_id] = time() + 600; // 10 минут задержка
        update_option('delayed_woocommerce_emails', $delayed_emails);
    }
}

// Регистрируем wp_cron событие для отправки писем
if (!wp_next_scheduled('send_delayed_woocommerce_emails')) {
    wp_schedule_event(time(), 'minute', 'send_delayed_woocommerce_emails');
}

add_action('send_delayed_woocommerce_emails', 'process_delayed_woocommerce_emails');
function process_delayed_woocommerce_emails() {
    $delayed_emails = get_option('delayed_woocommerce_emails', []);
    if (empty($delayed_emails)) return;

    foreach ($delayed_emails as $order_id => $send_time) {
        if ($send_time <= time()) {
            $order = wc_get_order($order_id);
            if ($order) {
                // Отправляем письмо
                WC()->mailer()->get_emails()['WC_Email_Customer_Processing_Order']->trigger($order_id);
            }
            unset($delayed_emails[$order_id]);
        }
    }
    update_option('delayed_woocommerce_emails', $delayed_emails);
}

Проверка результата

  • Создайте заказ с переходом в статус processing.
  • Проверьте, что сразу письмо не отправляется (например, отключите все внешние SMTP-сервисы для теста или проверьте логи).
  • Через 10 минут письмо должно быть отправлено.
  • Для отладки можно добавить логи в функцию process_delayed_woocommerce_emails либо временно уменьшить задержку.

Частые ошибки и как их исправить

  • Письма не отправляются вообще
    Проверьте, что wp_cron работает на сервере. Если сайт не получает трафик, wp_cron может не запускаться. Для надёжности настройте системный cron (например, через crontab) на вызов wp cron event run --due-now.
  • Письма отправляются сразу, несмотря на код
    Проверьте, что фильтр woocommerce_email_enabled_customer_processing_order возвращает false. Возможно, он конфликтует с другими плагинами, отключите их для теста.
  • Письма отправляются, но с некорректным содержимым
    Отправляйте письма через стандартный метод WooCommerce, как в примере, чтобы сохранить шаблоны и данные.

Практические советы по безопасности и производительности

  • Храните данные отложенных писем в виде массива в опции только для небольшого количества заказов. При большом количестве лучше использовать отдельную таблицу в базе.
  • Регулярно чистите устаревшие записи, чтобы не накапливать мусор.
  • Для повышения надёжности настройки wp_cron используйте системный cron.
  • При большом трафике и объёмах заказов рассмотрите использование сторонних очередей (например, с Redis или RabbitMQ) для управления отправкой писем.

Сравнение вариантов реализации отложенной отправки писем WooCommerce

МетодПлюсыМинусыПример использования
Код на wp_cron (описано выше)Гибкость, не требует сторонних плагинов, легко настраиваетсяЗависит от работы wp_cron, проблемы при низком трафикеОтложенная отправка заказов с кастомной задержкой
Плагины очередей писем (например, WP Mail SMTP с очередью)Простота настройки, поддержка SMTP, надежность доставкиДополнительные затраты, ограниченная кастомизацияОбщая оптимизация отправки почты
Внешние сервисы (SendGrid, Mailgun)Высокая надежность, аналитика, масштабируемостьНеобходима интеграция, платные тарифыМассовая рассылка, маркетинговые кампании

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
WooCommerce: решение проблем с обновлением остатков и стоков товаров
26.05.2026
Автоматическое управление очисткой кеша в WordPress с помощью WPRemark
30.03.2026
Как автоматизировать управление меню в WordPress с помощью кода
14.01.2026
Исправление ошибки 429 в WordPress: практическое руководство
20.12.2025
Решение проблем с очисткой кешей в WordPress без плагинов
10.12.2025
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее