Как использовать WP-Cron для отложенных задач в WordPress без системного Cron

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

Что такое WP-Cron и зачем он нужен для отложенных задач

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

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

WP-Cron подходит, если на сайте есть регулярные посетители, но для сайтов с низким трафиком рекомендуется настроить системный cron, вызывающий wp-cron.php по расписанию.

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

Регистрация собственной задачи с функцией и расписанием

Для начала создадим свою функцию, которая будет выполняться по расписанию. Например, пусть это будет функция wptemp_custom_cron_task(), которая пишет в лог дату и время запуска.

function wptemp_custom_cron_task() {
    if ( defined('WP_DEBUG') && WP_DEBUG ) {
        error_log('WP-Cron задача выполнена: ' . current_time('mysql'));
    }
}
add_action('wptemp_custom_cron_hook', 'wptemp_custom_cron_task');

Теперь нужно зарегистрировать событие с помощью wp_schedule_event(). Обычно это делается при активации плагина или темы, чтобы не создавать дубликаты:

function wptemp_activate_cron() {
    if ( ! wp_next_scheduled('wptemp_custom_cron_hook') ) {
        wp_schedule_event(time(), 'hourly', 'wptemp_custom_cron_hook');
    }
}
register_activation_hook(__FILE__, 'wptemp_activate_cron');

function wptemp_deactivate_cron() {
    $timestamp = wp_next_scheduled('wptemp_custom_cron_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wptemp_custom_cron_hook');
    }
}
register_deactivation_hook(__FILE__, 'wptemp_deactivate_cron');

В этом примере мы планируем запуск функции каждый час.

Добавление собственного интервала расписания

По умолчанию WordPress поддерживает только несколько интервалов: hourly (час), twicedaily (два раза в день), daily (день). Для других интервалов можно добавить свой, используя фильтр cron_schedules:

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

Теперь можно использовать 'every_five_minutes' как интервал при планировании задач.

Практические советы по надежной работе WP-Cron

Отключение встроенного WP-Cron и запуск по системному Cron

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

define('DISABLE_WP_CRON', true);

Далее на сервере нужно создать cron-задачу, например, вызывающую wp-cron.php каждые 5 минут:

*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
<

Это обеспечит выполнение задач по расписанию без участия посетителей сайта.

Диагностика и отладка задач WP-Cron

Если задачи не выполняются, проверьте:

  • Активность задач в базе — посмотреть в таблице wp_options под ключом cron.
  • Ошибки в логах — добавьте логирование в функции задач.
  • Совместимость с плагинами безопасности, которые могут блокировать wp-cron.php.

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

Пример использования WP-Cron для автоматического удаления устаревших ревизий

Рассмотрим практическую задачу: регулярно удалять ревизии записей старше 30 дней, чтобы оптимизировать базу данных.

function wptemp_delete_old_revisions() {
    global $wpdb;
    $date = date('Y-m-d H:i:s', strtotime('-30 days'));
    $revisions = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM $wpdb->posts WHERE post_type = 'revision' AND post_date < %s",
        $date
    ));
    if (!empty($revisions)) {
        foreach ($revisions as $revision_id) {
            wp_delete_post($revision_id, true);
        }
    }
}
add_action('wptemp_delete_revisions_hook', 'wptemp_delete_old_revisions');

function wptemp_schedule_revision_cleanup() {
    if (!wp_next_scheduled('wptemp_delete_revisions_hook')) {
        wp_schedule_event(time(), 'daily', 'wptemp_delete_revisions_hook');
    }
}
add_action('wp', 'wptemp_schedule_revision_cleanup');

Этот код создаёт ежедневную задачу, которая удаляет старые ревизии. Для повышения надежности рекомендуется использовать системный cron, как описано выше.

Интеграция WP-Cron с плагинами WPShop для расширения функционала

Если вы используете на сайте плагины из WPShop, например, для рассылок или отзывов, WP-Cron поможет автоматизировать их задачи.

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

Важно убедиться, что задачи плагинов запускаются вовремя — для этого настройте системный cron и проверяйте состояние задач через WP Crontrol.

Успешное использование временных таблиц в WordPress: практические советы и примеры
06.01.2026
Как использовать WP_Temp для работы с временными данными в WordPress
15.04.2026
Как создать свой плагин для WordPress с обратной связью
30.11.2025
Как использовать REST API для динамического обновления контента в WordPress
21.02.2026
Как избежать конфликтов между плагинами в WordPress
12.03.2026