Что такое WP-Cron и зачем он нужен для отложенных задач
WP-Cron — это встроенный механизм планировщика задач в WordPress, который используется для автоматического выполнения запланированных событий, таких как публикация отложенных постов, проверка обновлений и другие периодические операции. В отличие от системного cron, WP-Cron запускается при посещении сайта, что может привести к задержкам или несрабатыванию задач на сайтах с низкой посещаемостью.
Основные проблемы при работе с WP-Cron
- Задачи не запускаются вовремя из-за отсутствия трафика
- Избыточные вызовы wp-cron.php при высоком трафике замедляют сайт
- Сложности с отладкой и мониторингом выполнения заданий
Диагностика проблем с WP-Cron
Чтобы понять, работает ли WP-Cron корректно, выполните следующие шаги:
- Проверка наличия запланированных задач: используйте функцию
wp_get_scheduled_event()или плагин Debug Bar Cron (только для проверки). Например, можно вывести список задач в теме:
add_action('admin_notices', function() {
$crons = _get_cron_array();
echo '<pre>';
print_r($crons);
echo '</pre>';
});- Проверка запуска wp-cron.php: зайдите в браузере на
https://ваш-сайт.ru/wp-cron.php?doing_wp_cron. Если на экране нет ошибок, значит скрипт доступен. - Логи ошибок: проверьте логи сервера на предмет ошибок при выполнении wp-cron.php или PHP ошибок, связанных с запланированными задачами.
Пошаговое решение для надёжного запуска отложенных задач через WP-Cron без плагинов
1. Отключение стандартного запуска WP-Cron при каждом визите
Добавьте в wp-config.php строку:
define('DISABLE_WP_CRON', true);Это позволит контролировать запуск cron самостоятельно, снижая нагрузку.
2. Настройка системного cron для вызова wp-cron.php
Настройте системный cron на сервере для регулярного запуска скрипта:
*/15 * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Или с помощью curl:
*/15 * * * * curl -s https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Рекомендуемый интервал — 15 минут, можно уменьшать до 5 при необходимости.
3. Создание собственной отложенной задачи
Добавьте в functions.php или в плагин следующий код для регистрации и обработки задачи:
function wpnews_schedule_custom_task() {
if (!wp_next_scheduled('wpnews_custom_task_hook')) {
wp_schedule_event(time(), 'hourly', 'wpnews_custom_task_hook');
}
}
add_action('wp', 'wpnews_schedule_custom_task');
function wpnews_custom_task_function() {
// Ваш код, выполняемый по расписанию
error_log('WPNews: Custom cron task executed at ' . date('Y-m-d H:i:s'));
}
add_action('wpnews_custom_task_hook', 'wpnews_custom_task_function');Здесь задача запускается каждый час, можно заменить 'hourly' на 'twicedaily' или 'daily'. Для кастомных интервалов регистрируйте их через фильтр cron_schedules.
4. Добавление кастомного интервала (если нужно)
add_filter('cron_schedules', function($schedules) {
$schedules['every_five_minutes'] = [
'interval' => 300,
'display' => __('Каждые 5 минут')
];
return $schedules;
});Вызовите в wp_schedule_event вместо 'hourly' — 'every_five_minutes'.
Проверка результата после внедрения
- Проверьте логи PHP или error_log на наличие записей выполнения задачи (например, через
error_logиз примера выше). - Запустите вручную системный cron или вызовите wp-cron.php из браузера и убедитесь, что задача срабатывает.
- Используйте WP-CLI команду
wp cron event listдля просмотра запланированных событий (если есть доступ к консоли).
Частые ошибки и как их исправить
- Опечатки в хуках или несогласованность имён: Убедитесь, что хук в
add_actionсовпадает с тем, что используется вwp_schedule_event. - Не отключен стандартный WP-Cron при использовании системного cron: Это ведёт к двойным вызовам и повышенной нагрузке. Проверьте, что
DISABLE_WP_CRONдействительно true. - Неправильный URL в системном cron: Протокол (http/https) и путь к wp-cron.php должны быть корректны и доступны без авторизации.
- Отсутствие прав на выполнение системного cron: Убедитесь, что cron задаётся от имени пользователя с необходимыми правами.
Практические советы по производительности и безопасности
- Минимизируйте количество cron-задач: Удаляйте ненужные задачи с помощью
wp_clear_scheduled_hook('hook_name'). - Используйте системный cron вместо стандартного WP-Cron на живых сайтах с высоким трафиком.
- Защитите вызов wp-cron.php: Добавьте проверку nonce или IP в начале скрипта, если используете нестандартные вызовы.
- Логируйте ошибки и результаты выполнения задач, чтобы быстро обнаруживать сбои.
Сравнение вариантов запуска отложенных задач в WordPress
| Вариант | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Стандартный WP-Cron (по посещениям) | Простота настройки, нет доступа к серверу | Не гарантирует своевременный запуск, нагрузка при большом трафике | Маленькие сайты с постоянным трафиком |
| Системный cron + отключение WP-Cron | Надёжный и своевременный запуск, меньше нагрузки | Требуется доступ к серверу и навыки настройки | Средние и крупные сайты, требующие точного расписания |
| Плагины-менеджеры cron | Удобный интерфейс для управления задачами | Дополнительная нагрузка и возможные конфликты | Если нет доступа к серверу, но нужна удобная настройка |