Как использовать WP-Cron для решения проблем с отправкой писем в WordPress

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

Многие сайты на WordPress сталкиваются с проблемой, когда стандартная функция wp_mail() не отправляет письма или делает это с задержкой. Основные симптомы:

  • Письма не доходят или попадают в спам;
  • Почтовый сервер блокирует исходящие письма;
  • Задержки в отправке уведомлений пользователям;
  • Провалы в регистрации, восстановлении пароля и других процессах, связанных с почтой.

Первая проверка — убедиться, что хостинг поддерживает функцию mail() PHP и что WordPress не блокирует отправку писем. Для этого можно использовать плагин Check Email или написать простой тест:

if(wp_mail('your-email@example.com', 'Тест отправки почты', 'Тестовое письмо')) {
    echo 'Письмо отправлено успешно';
} else {
    echo 'Проблема с отправкой';
}

Если отправка не срабатывает, вероятнее всего, причина на стороне сервера или настроек PHP.

Почему WP-Cron помогает с отправкой писем

WP-Cron — это имитация планировщика задач, которая запускает события при обращении к сайту. Отправка писем с помощью WP-Cron позволяет:

  • Отложить отправку, разгрузив основной процесс;
  • Повторить попытки отправки при неудаче;
  • Автоматизировать массовую отправку писем;
  • Избежать проблем с блокировками на хостинге, выполняя отправку в фоне.

Пошаговое решение: как настроить отправку писем через WP-Cron

1. Отключаем стандартную отправку и создаем очередь писем

Создаем таблицу в базе данных или используем transient для хранения очереди писем. Для примера — очередь в опции:

function add_mail_to_queue($to, $subject, $message, $headers = '', $attachments = []) {
    $queue = get_option('wp_mail_queue', []);
    $queue[] = compact('to', 'subject', 'message', 'headers', 'attachments');
    update_option('wp_mail_queue', $queue);
    return true;
}

2. Отправка писем из очереди через WP-Cron

Регистрируем событие и функцию для обработки очереди:

add_action('wp_mail_cron_send', 'process_mail_queue');
function process_mail_queue() {
    $queue = get_option('wp_mail_queue', []);
    if (empty($queue)) return;

    foreach ($queue as $key => $mail) {
        $sent = wp_mail($mail['to'], $mail['subject'], $mail['message'], $mail['headers'], $mail['attachments']);
        if ($sent) {
            unset($queue[$key]);
        }
    }
    update_option('wp_mail_queue', $queue);
}

if (!wp_next_scheduled('wp_mail_cron_send')) {
    wp_schedule_event(time(), 'five_minutes', 'wp_mail_cron_send');
}

Важно: стандартных интервалов WP-Cron недостаточно, поэтому добавим кастомный интервал «five_minutes»:

add_filter('cron_schedules', function($schedules) {
    $schedules['five_minutes'] = [
        'interval' => 300, // 5 минут
        'display' => __('Каждые 5 минут')
    ];
    return $schedules;
});

3. Используем функцию add_mail_to_queue вместо wp_mail

В коде или плагинах, где вызывается wp_mail(), меняем на нашу функцию:

add_mail_to_queue('user@example.com', 'Тема письма', 'Текст письма');

Проверка результата после внедрения

Чтобы проверить, что отправка через WP-Cron работает:

  1. Добавьте письмо в очередь через add_mail_to_queue().
  2. Запустите вручную событие WP-Cron (если сайт не получает много трафика) через плагин WP Crontrol или вызов do_action('wp_mail_cron_send');.
  3. Проверьте, что письма пришли и очередь пуста (get_option('wp_mail_queue') должен вернуть пустой массив).
  4. Если письма не приходят, проверьте логи сервера и настройки почтового сервера.

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

  • WP-Cron не запускается из-за отсутствия трафика: используйте системный Cron для вызова wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1 каждые 5 минут.
  • Очередь не очищается после отправки: проверьте корректность удаления обработанных писем из массива и обновления опции.
  • Письма попадают в спам: настройте SMTP-сервер через плагины, например WP Mail SMTP, вместо стандартной функции mail().
  • Дублирование писем: убедитесь, что не вызываете функцию добавления в очередь несколько раз для одного события.

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

  • Используйте SMTP-серверы с поддержкой аутентификации, чтобы повысить надежность доставки.
  • Ограничьте размер очереди, чтобы избежать перегрузок базы данных.
  • Добавьте логирование ошибок отправки для последующего анализа.
  • Если письмо не отправляется после нескольких попыток, удаляйте его из очереди или перемещайте в отдельный лог ошибок.

Сравнение вариантов реализации очереди отправки писем

МетодПреимуществаНедостатки
Опции WordPress (как в примере)Просто реализовать, не требует доп. таблицНе масштабируется для больших объемов, возможны конфликты
Собственная таблица в базеМасштабируемость, удобство управления очередьюСложнее в реализации, требует миграций
Использование плагинов SMTP и очередейНадежность, поддержка авторизации и шифрованияЗависимость от сторонних решений, возможные конфликты
Как автоматизировать удаление старых пустых записей в WordPress
10.02.2026
Как установить автоматическое удаление просмотров в WordPress
17.03.2026
WooCommerce: как автоматически удалять товары без заказов за указанный период
13.06.2026
Как настроить автоматическую отправку email уведомлений в WordPress
01.01.2026
Как автоматически удалять старые записи в WordPress через Cron
18.01.2026