В стандартной установке WordPress для планирования задач используется WP-Cron — виртуальный обработчик, который срабатывает при посещении сайта. Однако этот механизм имеет ряд ограничений, особенно на сайтах с низкой посещаемостью или на больших проектах, где важна точность и надежность запуска задач. В этой статье мы подробно рассмотрим, как настроить отложенный запуск задач в WordPress без использования WP-Cron, используя системный cron и альтернативные подходы.
Почему стандартный WP-Cron не всегда подходит для отложенных задач
WP-Cron запускается только когда кто-то посещает ваш сайт. Это значит, что если трафик низкий, задачи могут не запускаться вовремя или с задержкой. Также при высоких нагрузках запуск по событию посещения может добавлять лишнюю нагрузку и замедлять отклик сервера.
Кроме того, WP-Cron не является системным демоном, который работает постоянно, поэтому точность тайминга ограничена.
Из-за этих особенностей многие разработчики предпочитают отключать WP-Cron и настраивать системный cron для запуска задач WordPress.
Отключение WP-Cron и настройка системного cron
Отключение WP-Cron
Для отключения WP-Cron в файле wp-config.php добавьте следующую строку перед комментарием /* That's all, stop editing! Happy publishing. */:
define('DISABLE_WP_CRON', true);
Это предотвратит автоматический запуск задач при посещении сайта.
Настройка системного cron
Далее нужно настроить системный cron на сервере, чтобы он запускал скрипт wp-cron.php с нужной периодичностью.
Для этого выполните команду crontab -e и добавьте строку, которая будет запускать WP-Cron, например, каждую минуту:
* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Или используя curl:
* * * * * curl --silent https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Замените https://example.com/ на URL вашего сайта.
Таким образом системный cron будет выполнять задачи с точностью до минуты, независимо от посещаемости сайта.
Использование плагинов для управления отложенными задачами и cron
Если вы не хотите настраивать системный cron вручную, можно использовать плагины, которые облегчают управление задачами и cron-запусками.
WP Crontrol
Плагин WP Crontrol позволяет просматривать, редактировать, удалять и создавать задачи WP-Cron прямо из админки WordPress.
С его помощью можно проверить, какие задачи запланированы, и убедиться, что ваш системный cron правильно запускает задачи.
Advanced Cron Manager
Еще один полезный плагин — Advanced Cron Manager. Он предлагает удобный интерфейс для управления событиями cron, включая ручной запуск и отладку.
Создание собственных отложенных задач с точным запуском
Для примера рассмотрим, как создать отложенную задачу в WordPress с учетом отключенного WP-Cron и запуском через системный cron.
Регистрация задачи
Добавим в файл functions.php вашей темы или в отдельный плагин следующий код, который создаст задачу, выполняющуюся раз в час:
function wpteam_schedule_hourly_task() {
if (!wp_next_scheduled('wpteam_hourly_event')) {
wp_schedule_event(time(), 'hourly', 'wpteam_hourly_event');
}
}
add_action('wp', 'wpteam_schedule_hourly_task');
function wpteam_do_hourly_task() {
// Ваш код задачи - например, очистка кэша или отправка отчета
error_log('WP-Team: Hourly task executed at ' . current_time('mysql'));
}
add_action('wpteam_hourly_event', 'wpteam_do_hourly_task');
Объяснение:
wpteam_schedule_hourly_taskпроверяет, существует ли уже запланированное событие с хукомwpteam_hourly_event, если нет — создает его.wpteam_do_hourly_task— функция, которая выполняется по событию, здесь можно разместить нужный вам код.- Хук
add_action('wpteam_hourly_event', ...)связывает событие с функцией.
Рекомендации по созданию собственных интервалов
По умолчанию WordPress поддерживает интервалы «hourly», «twicedaily» и «daily». Если нужна кастомная периодичность, добавьте фильтр:
function wpteam_custom_cron_schedules($schedules) {
$schedules['every_five_minutes'] = array(
'interval' => 300, // 300 секунд = 5 минут
'display' => __('Каждые 5 минут')
);
return $schedules;
}
add_filter('cron_schedules', 'wpteam_custom_cron_schedules');
Затем в wp_schedule_event используйте 'every_five_minutes' вместо 'hourly'.
Отладка и мониторинг cron-задач
Для контроля запуска задач рекомендуется использовать логи и специальные плагины. В нашем примере мы записываем время выполнения задачи в системный лог с помощью error_log. Это поможет убедиться, что задачи действительно выполняются.
Если задачи не запускаются, проверьте корректность настройки системного cron, URL сайта, а также права доступа к файлам.
Заключение по настройке отложенных задач без WP-Cron
Перемещение запуска cron-задач из WP-Cron в системный cron значительно повышает надежность и точность выполнения плановых задач. Это особенно важно для сайтов с низкой посещаемостью или критичными по времени операциями, например, рассылками, очисткой кэша, обновлением данных.
Используйте плагины WP Crontrol или Advanced Cron Manager для удобного управления событиями, а для более сложных задач создавайте собственные планировщики с кастомными интервалами.
Если хотите узнать больше о продвинутых способах оптимизации и автоматизации WordPress, обратите внимание на решения от WPSHOP, где есть готовые инструменты для управления задачами и производительностью.