WP-Cron — это встроенный механизм планировщика задач в WordPress, который позволяет автоматически запускать определённые функции по расписанию. В отличие от системного cron на сервере, WP-Cron запускается при загрузке любой страницы сайта, что иногда вызывает задержки или несвоевременный запуск задач.
Что такое WP-Cron и как он работает в WordPress
WP-Cron реализован как PHP-скрипт, который проверяет наличие запланированных задач при каждом запросе к сайту. Если приходит время для выполнения задачи, она запускается. Это удобно, поскольку не требует доступа к системному cron, однако имеет и ограничения:
- Задачи запускаются только при посещении сайта, а значит при низкой посещаемости задачи могут не выполняться вовремя.
- Если на сайте много посетителей, WP-Cron может запускаться слишком часто, создавая нагрузку.
Для решения этих ограничений часто рекомендуют отключать встроенный WP-Cron и настраивать системный cron на сервере, который будет вызывать скрипт wp-cron.php с нужным интервалом.
Основные функции для работы с WP-Cron
WordPress предоставляет несколько функций для управления планировщиком задач. Рассмотрим самые важные:
wp_schedule_event($timestamp, $recurrence, $hook, $args)— планирует повторяющуюся задачу.
Параметры: время первого запуска (timestamp), интервал (например, 'hourly', 'daily'), имя хука, аргументы для хука.wp_schedule_single_event($timestamp, $hook, $args)— планирует однократную задачу.wp_clear_scheduled_hook($hook, $args)— удаляет запланированные задачи по имени хука и аргументам.wp_next_scheduled($hook, $args)— проверяет, запланирована ли задача.
Используя эти функции, можно гибко создавать, проверять и удалять задачи.
Пример: создание повторяющейся задачи для очистки временных файлов
Допустим, нужно раз в день запускать функцию, которая очищает временную директорию плагина. Сделаем это через WP-Cron.
Шаг 1. Регистрируем задачу при активации плагина
function wp0_register_daily_cleanup() {
if (!wp_next_scheduled('wp0_daily_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wp0_daily_cleanup_hook');
}
}
register_activation_hook(__FILE__, 'wp0_register_daily_cleanup');Здесь мы проверяем, не запланирована ли уже задача, и, если нет, запускаем её с интервалом «daily» (раз в сутки).
Шаг 2. Определяем функцию-обработчик задачи
function wp0_daily_cleanup_function() {
$temp_dir = WP_CONTENT_DIR . '/uploads/wp0_temp';
if (!is_dir($temp_dir)) {
return;
}
$files = glob($temp_dir . '/*');
foreach ($files as $file) {
if (is_file($file)) {
unlink($file);
}
}
}
add_action('wp0_daily_cleanup_hook', 'wp0_daily_cleanup_function');Функция удаляет все файлы из временной директории плагина.
Шаг 3. Очищаем расписание при деактивации
function wp0_clear_daily_cleanup() {
wp_clear_scheduled_hook('wp0_daily_cleanup_hook');
}
register_deactivation_hook(__FILE__, 'wp0_clear_daily_cleanup');Это важно, чтобы при удалении плагина не оставались ненужные задачи в расписании.
Как добавить собственный интервал повторения
По умолчанию в WordPress доступны интервалы: 'hourly', 'twicedaily', 'daily'. Если нужно, например, запускать задачу раз в 10 минут, нужно добавить свой интервал.
function wp0_custom_cron_intervals($schedules) {
if (!isset($schedules['every_ten_minutes'])) {
$schedules['every_ten_minutes'] = array(
'interval' => 600, // 600 секунд = 10 минут
'display' => __('Каждые 10 минут')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wp0_custom_cron_intervals');После этого можно использовать 'every_ten_minutes' в функции wp_schedule_event.
Рекомендации по отладке и мониторингу WP-Cron задач
WP-Cron не всегда работает как ожидается, особенно на малопосещаемых сайтах. Вот несколько советов для отладки:
- Используйте плагин WP Crontrol — он позволяет просматривать, запускать и удалять запланированные задачи прямо из админки.
- Для тестирования задач можно временно запускать их вручную с помощью функции
do_action('hook_name')или через WP Crontrol. - Если задачи не запускаются, проверьте, не отключён ли WP-Cron в файле
wp-config.php(константаDISABLE_WP_CRONдолжна быть false или отсутствовать). - Для сайтов с низкой посещаемостью настройте системный cron, чтобы вызывать
wp-cron.phpпо расписанию. Пример команды:
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Заключение: когда использовать WP-Cron и как избежать проблем
WP-Cron отлично подходит для большинства задач автоматизации в WordPress: очистка кэша, отправка писем, обновления и т.д. Однако для сайтов с высокой нагрузкой или низкой посещаемостью лучше подключать системный cron.
Обязательно удаляйте задачи при деактивации плагинов и добавляйте пользовательские интервалы при необходимости. Мониторьте задачи через WP Crontrol, чтобы гарантировать их запуск.
Используя WP-Cron грамотно, вы сможете автоматизировать множество рутинных процессов без необходимости сложных настроек сервера.