Как создать расписание задач в WordPress с помощью WP-Cron и реального cron

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

Что такое WP-Cron и почему его стоит использовать с системным cron

WP-Cron — это имитация системного планировщика задач в WordPress. Он запускается при каждом посещении сайта и проверяет, не пора ли выполнить запланированную задачу. Это удобно, но имеет недостатки:

  • Если на сайт долго не заходят — задачи задерживаются.
  • При большом трафике WP-Cron может запускаться слишком часто.
  • Невозможно гарантировать точное время запуска задачи.

Чтобы решить эти проблемы, рекомендуется отключить встроенный WP-Cron и настроить системный cron на сервере, который будет запускать WP-Cron по расписанию с точностью до минуты.

Как создать собственное расписание задач в WP-Cron

WordPress позволяет создавать собственные интервалы запуска задач. Для этого нужно добавить фильтр, который зарегистрирует новый интервал.

add_filter('wordpressy_custom_cron_schedules', function($schedules) {
    $schedules['every_five_minutes'] = [
        'interval' => 300, // 300 секунд = 5 минут
        'display' => __('Каждые 5 минут')
    ];
    return $schedules;
});

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

add_filter('cron_schedules', 'wordpressy_register_custom_cron_schedules');
function wordpressy_register_custom_cron_schedules($schedules) {
    return apply_filters('wordpressy_custom_cron_schedules', $schedules);
}

Теперь у нас есть расписание с интервалом 5 минут.

Как добавить задачу для выполнения по расписанию в WordPressy

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

function wordpressy_schedule_my_task() {
    if (!wp_next_scheduled('wordpressy_my_custom_event')) {
        wp_schedule_event(time(), 'every_five_minutes', 'wordpressy_my_custom_event');
    }
}
add_action('wp', 'wordpressy_schedule_my_task');

Далее описываем функцию-обработчик задачи:

add_action('wordpressy_my_custom_event', 'wordpressy_do_my_task');
function wordpressy_do_my_task() {
    // Здесь ваш код, который нужно выполнить по расписанию
    error_log('Задача WordPressy выполнена в ' . current_time('mysql'));
}

Как отключить WP-Cron и настроить системный cron на сервере

Чтобы WP-Cron не запускался при каждом посещении сайта, в wp-config.php добавьте:

define('DISABLE_WP_CRON', true);

После этого нужно настроить системный cron, чтобы он запускал WP-Cron по расписанию. Для этого добавьте в crontab команду:

* * * * * wget -q -O - https://ваш-домен.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Или, если хотите использовать PHP напрямую:

* * * * * /usr/bin/php /путь/до/wordpress/wp-cron.php > /dev/null 2>&1

Это гарантирует запуск WP-Cron каждую минуту, что гораздо надежнее и стабильнее, чем запуск от посещений.

Практическое применение: пример плагина для WordPressy с расписанием задач

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

/**
 * Plugin Name: WordPressy Scheduled Cleanup
 * Description: Пример плагина с WP-Cron и собственным расписанием.
 */

add_filter('cron_schedules', 'wordpressy_register_custom_cron_schedules');
function wordpressy_register_custom_cron_schedules($schedules) {
    $schedules['every_five_minutes'] = [
        'interval' => 300,
        'display' => __('Каждые 5 минут')
    ];
    return $schedules;
}

add_action('wp', 'wordpressy_schedule_cleanup_task');
function wordpressy_schedule_cleanup_task() {
    if (!wp_next_scheduled('wordpressy_cleanup_event')) {
        wp_schedule_event(time(), 'every_five_minutes', 'wordpressy_cleanup_event');
    }
}

add_action('wordpressy_cleanup_event', 'wordpressy_do_cleanup');
function wordpressy_do_cleanup() {
    global $wpdb;
    $table = $wpdb->prefix . 'wordpressy_cleanup_log';

    // Пример: удаляем записи старше 30 дней
    $wpdb->query($wpdb->prepare(
        "DELETE FROM $table WHERE created_at < NOW() - INTERVAL 30 DAY"
    ));

    error_log('WordPressy cleanup выполнен: ' . current_time('mysql'));
}

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

Дополнительные советы по работе с WP-Cron в WordPressy

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

2. Для отладки используйте плагины, например Clearfy Pro, который позволяет управлять WP-Cron и просматривать запланированные задачи.

3. Не помещайте тяжелые задачи в WP-Cron без ограничения, лучше разбивайте их на части или используйте очереди.

4. При использовании реального cron избегайте частого запуска с интервалом менее минуты, чтобы не нагружать сервер.

Заключение

WP-Cron — мощный инструмент для автоматизации задач в WordPress, но его особенности нужно учитывать при разработке. Использование системного cron позволяет сделать запуск задач более стабильным и предсказуемым. Создание собственных расписаний и обработчиков дает гибкость для решения любых задач автоматизации на вашем сайте WordPress.

Для удобного управления и расширенных возможностей рекомендую обратить внимание на Clearfy Pro — плагин, который помогает оптимизировать и управлять WP-Cron и другими процессами в WordPress.

Как использовать WP REST API для автоматического обновления товаров WooCommerce
01.05.2026
Как настроить отложенный запуск задач в WordPress без WP-Cron
12.02.2026
Как избежать проблем с неправильно отслеживаемыми заказами в WooCommerce
23.05.2026
Как избежать проблем с неправильным выполнением AJAX в WordPress
18.01.2026
Как установить приватный REST API в WordPress
31.01.2026