Что такое WP-Cron и зачем он нужен для email-отчетов?
WP-Cron — встроенный планировщик задач в WordPress, который позволяет запускать определённые функции по расписанию. В отличие от системного cron, WP-Cron запускается при посещении сайта, что требует правильной настройки для надёжной работы. Автоматическая отправка email-отчетов — одна из типичных задач, которую можно реализовать через WP-Cron, например, для рассылки статистики, новостей или напоминаний.
Диагностика: почему автоматические email-отчеты не отправляются?
Если вы настроили WP-Cron для отправки писем, но письма не приходят, проверьте следующие моменты:
- WP-Cron отключён через define('DISABLE_WP_CRON', true) в wp-config.php без запуска системного cron;
- Отсутствие посещений сайта (WP-Cron срабатывает при заходе на сайт);
- Ошибки в callback-функции, которая должна отправлять письмо;
- Проблемы с почтовым сервером или функцией wp_mail();
- Конфликты с другими плагинами или темой, которые влияют на отправку почты.
Пошаговое решение: как настроить WP-Cron для отправки email-отчетов
1. Создаём функцию отправки email
function wp3_send_email_report() {
$to = 'admin@example.com';
$subject = 'Еженедельный отчет сайта';
$message = 'Это автоматический отчет за неделю.';
$headers = array('Content-Type: text/html; charset=UTF-8');
if ( wp_mail($to, $subject, $message, $headers) ) {
error_log('Email report sent successfully.');
} else {
error_log('Failed to send email report.');
}
}2. Регистрируем кастомное событие WP-Cron
add_action('wp3_weekly_email_event', 'wp3_send_email_report');3. Добавляем интервал для еженедельного запуска (если не нужен стандартный)
add_filter('cron_schedules', function($schedules) {
if (!isset($schedules['weekly'])) {
$schedules['weekly'] = [
'interval' => 7 * 24 * 60 * 60, // 1 неделя в секундах
'display' => 'Еженедельно'
];
}
return $schedules;
});4. Запускаем событие при активации темы или плагина
if (! wp_next_scheduled('wp3_weekly_email_event')) {
wp_schedule_event(time(), 'weekly', 'wp3_weekly_email_event');
}5. Рекомендуется настроить системный cron для надёжности
Добавьте в системный cron на сервере вызов wp-cron.php каждые 15 минут, если в wp-config.php отключён WP-Cron:
wget -q -O - https://yourdomain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
# или
curl https://yourdomain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Проверка результата после внедрения
- Посмотрите логи ошибок сервера и error_log, чтобы убедиться, что функция wp3_send_email_report вызывается и письма отправляются;
- Проверьте папку «Входящие» почтового ящика, указанный в переменной
$to; - Запустите вручную событие для теста, выполнив в админке или через WP-CLI:
do_action('wp3_weekly_email_event');Если письмо приходит после ручного запуска, но не приходит по расписанию — проблема с WP-Cron или системным cron.
Частые ошибки и способы их исправления
- DISABLE_WP_CRON установлен, но системный cron не настроен.
Решение: настроить cron на сервере или удалить define('DISABLE_WP_CRON', true) из wp-config.php. - Функция отправки письма содержит ошибки PHP.
Решение: включить вывод ошибок или error_log для отладки. - Почтовый сервер блокирует письма.
Решение: проверить настройки SMTP, использовать плагины SMTP (например, WP Mail SMTP) для надежной отправки. - Период запуска cron-события не подходит.
Решение: проверить интервал и время запуска, можно временно заменить на 'hourly' для тестов. - Проблемы с кешированием страниц, которые блокируют WP-Cron.
Решение: исключить wp-cron.php из кеширования на уровне сервера или плагина.
Практические советы по безопасности и производительности
- Не отправляйте большие объемы данных в письмах — лучше использовать ссылки на отчет или сокращать контент.
- Используйте nonce и проверки прав в функциях, если они вызываются не только из WP-Cron.
- Для высокой нагрузки рекомендуем настроить системный cron вместо стандартного WP-Cron.
- Логируйте успешные и проваленные попытки отправки, чтобы своевременно обнаруживать проблемы.
Сравнение вариантов реализации автоматических email-отчетов
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron (встроенный) | Прост в настройке, не требует доступа к серверу | Зависит от посещаемости сайта, может быть ненадежен |
| Системный cron + wp-cron.php | Надежный запуск по расписанию, подходит для больших сайтов | Требует доступа к серверу и базовых навыков Linux |
| Плагины SMTP + планировщик задач в админке | Упрощают настройку почты, имеют удобный интерфейс | Зависимость от сторонних решений, возможны конфликты |