Фильтр cron_schedules
в WordPress позволяет расширить стандартный набор интервалов для выполнения задач. Этот фильтр особенно полезен, когда необходимо создать задачу с кастомной периодичностью, такой как каждую неделю, каждые 5 минут или раз в месяц.
apply_filters( ‘cron_schedules’, array $new_schedules )
Параметры
$new_schedules
— массив новых интервалов времени, которые добавляются к стандартным. Структура массива:interval
— интервал в секундах.display
— описание интервала.
Основные интервалы по умолчанию
WordPress включает в себя следующие интервалы:
$schedules = array(
'hourly' => array( 'interval' => HOUR_IN_SECONDS, 'display' => __( 'Once Hourly' ) ),
'twicedaily' => array( 'interval' => 12 * HOUR_IN_SECONDS, 'display' => __( 'Twice Daily' ) ),
'daily' => array( 'interval' => DAY_IN_SECONDS, 'display' => __( 'Once Daily' ) ),
);
1. Создание недельного интервала
Чтобы создать задачу, выполняемую раз в неделю, можно добавить следующий код в файл functions.php
вашей темы или плагина:
function add_weekly_schedule( $schedules ) {
$schedules['weekly'] = array(
'interval' => 604800, // 60 * 60 * 24 * 7 секунд
'display' => __( 'Once Weekly' )
);
return $schedules;
}
add_filter( 'cron_schedules', 'add_weekly_schedule' );
2. Создание интервалов на 5 и 15 минут
Иногда требуется более частое выполнение задач, например, каждые 5 или 15 минут:
function add_custom_intervals( $schedules ) {
$schedules['five_minutes'] = array(
'interval' => 300, // 5 * 60 секунд
'display' => __( 'Every 5 Minutes' )
);
$schedules['fifteen_minutes'] = array(
'interval' => 900, // 15 * 60 секунд
'display' => __( 'Every 15 Minutes' )
);
return $schedules;
}
add_filter( 'cron_schedules', 'add_custom_intervals' );
3. Добавление пользовательского интервала на основе опции
Можно создать интервал, зависящий от значения, установленного в опциях:
function add_custom_interval_from_option( $schedules ) {
$custom_interval = get_option( 'custom_interval' );
$interval = ! empty( $custom_interval ) ? absint( $custom_interval ) * HOUR_IN_SECONDS : DAY_IN_SECONDS;
$schedules['custom_interval'] = array(
'interval' => $interval,
'display' => esc_html__( 'Custom Interval' )
);
return $schedules;
}
add_filter( 'cron_schedules', 'add_custom_interval_from_option' );
Использование добавленных интервалов
Чтобы использовать добавленный интервал, можно назначить задачу через wp_schedule_event
. Пример использования интервала every_5_minutes
:
if ( ! wp_next_scheduled( 'custom_cron_task' ) ) {
wp_schedule_event( time(), 'five_minutes', 'custom_cron_task' );
}
add_action( 'custom_cron_task', 'execute_custom_task' );
function execute_custom_task() {
// Ваш код для выполнения задачи
}
Отмена расписания
Для удаления задач перед их добавлением можно использовать wp_clear_scheduled_hook
:
wp_clear_scheduled_hook( 'custom_cron_task' );
Логирование ошибок при выполнении задач
Чтобы записывать ошибки выполнения задач, можно добавить обработчик wp_mail_failed
:
add_action( 'wp_mail_failed', 'log_cron_errors' );
function log_cron_errors( $wp_error ) {
error_log( $wp_error->get_error_message() );
}
Заключение
Фильтр cron_schedules
позволяет значительно расширить возможности планировщика задач WordPress, добавляя индивидуальные интервалы.