Как использовать WP-Cron для автоматизации задач в WordPress

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 грамотно, вы сможете автоматизировать множество рутинных процессов без необходимости сложных настроек сервера.

Наш каталог плагинов WordPress