Использование фильтра cron_schedules в WordPress для создания пользовательского расписания задач

В WordPress встроена система крон-задач, которая позволяет запускать запланированные задачи в определённое время. По умолчанию, WordPress поддерживает несколько стандартных расписаний, таких как ежечасное, ежедневно и дважды в день. Однако иногда может возникнуть необходимость в создании собственного пользовательского расписания для выполнения задач через определённые интервалы времени.

Фильтр cron_schedules позволяет добавить новые интервалы для крон-задач. В этой статье мы рассмотрим, как это сделать, и предоставим пример добавления нового расписания.

Что такое cron_schedules?

Фильтр cron_schedules в WordPress позволяет разработчикам изменить список доступных интервалов выполнения задач. Это полезно, если вам нужно добавить собственный интервал, отличный от стандартных (например, каждые 5 минут или раз в месяц).

Как работает cron_schedules?

Фильтр принимает массив существующих расписаний и позволяет вам добавить в него собственные варианты. Каждый интервал имеет два параметра:

  • interval — время в секундах между задачами.
  • display — название интервала, которое отображается для администратора или разработчика.

Пример: Добавление пользовательского интервала

Давайте рассмотрим, как добавить собственное расписание, которое будет запускать задачи каждые 5 минут.

Шаг 1: Добавление кода через фильтр cron_schedules

// Добавляем новое расписание через фильтр 'cron_schedules'
add_filter( 'cron_schedules', 'custom_cron_schedule' );

/**
 * Добавляет новый интервал в крон-задачи.
 *
 * @param array $schedules Существующие расписания крон-задач.
 * @return array Модифицированный массив с пользовательскими интервалами.
 */
function custom_cron_schedule( $schedules ) {
    // Добавляем расписание каждые 5 минут
    $schedules['every_five_minutes'] = array(
        'interval' => 300, // 5 минут = 300 секунд
        'display'  => __( 'Каждые 5 минут' )
    );
    
    return $schedules;
}

Этот код добавляет новый интервал every_five_minutes, который будет доступен для назначения крон-задачам.

Шаг 2: Регистрация крон-задачи

Теперь, когда у нас есть новое расписание, давайте создадим задачу, которая будет выполняться каждые 5 минут.

// Хук для регистрации крон-задачи при активации плагина или темы
add_action( 'wp', 'custom_cron_activation' );

/**
 * Планируем запуск задачи, если она еще не запланирована.
 */
function custom_cron_activation() {
    if ( ! wp_next_scheduled( 'custom_five_minute_event' ) ) {
        wp_schedule_event( time(), 'every_five_minutes', 'custom_five_minute_event' );
    }
}

// Хук для выполнения задачи
add_action( 'custom_five_minute_event', 'custom_five_minute_task' );

/**
 * Функция, которая будет выполняться каждые 5 минут.
 */
function custom_five_minute_task() {
    // Ваш код, который нужно выполнять каждые 5 минут
    error_log( 'Задача выполнена: ' . current_time( 'mysql' ) );
}

Шаг 3: Удаление задачи при деактивации

Важно очищать запланированные задачи при деактивации плагина или темы, чтобы они не оставались в расписании WordPress.

// Хук для удаления крон-задачи при деактивации плагина или темы
register_deactivation_hook( __FILE__, 'custom_cron_deactivation' );

/**
 * Удаляем запланированную задачу.
 */
function custom_cron_deactivation() {
    $timestamp = wp_next_scheduled( 'custom_five_minute_event' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'custom_five_minute_event' );
    }
}

Как проверить выполнение задачи

Чтобы убедиться, что ваша задача работает, вы можете просматривать логи ошибок сервера. В нашем примере каждые 5 минут будет добавляться запись в лог через функцию error_log.

Почитаем еще?: