Как использовать REST API для установки и управления WP-Cron задачами в WordPress

Диагностика проблемы: почему стандартный WP-Cron может быть неудобен

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

Пользователь хочет создавать и контролировать задачи WP-Cron через REST API для гибкой интеграции и точного запуска.

Пошаговое решение: создание REST API эндпоинтов для управления WP-Cron

1. Регистрируем REST маршрут для добавления Cron задачи

add_action('rest_api_init', function () {
    register_rest_route('custom-cron/v1', '/schedule', [
        'methods' => 'POST',
        'callback' => 'custom_cron_schedule_task',
        'permission_callback' => function () {
            return current_user_can('manage_options');
        }
    ]);
});

function custom_cron_schedule_task(WP_REST_Request $request) {
    $timestamp = $request->get_param('timestamp');
    $hook = $request->get_param('hook');
    if (!$timestamp || !$hook) {
        return new WP_Error('missing_params', 'Missing timestamp or hook parameter', ['status' => 400]);
    }
    if (!wp_next_scheduled($hook, [])) {
        wp_schedule_single_event($timestamp, $hook);
        return ['status' => 'success', 'message' => 'Task scheduled'];
    } else {
        return ['status' => 'exists', 'message' => 'Task already scheduled'];
    }
}

2. Регистрируем маршрут для удаления задачи

add_action('rest_api_init', function () {
    register_rest_route('custom-cron/v1', '/unschedule', [
        'methods' => 'POST',
        'callback' => 'custom_cron_unschedule_task',
        'permission_callback' => function () {
            return current_user_can('manage_options');
        }
    ]);
});

function custom_cron_unschedule_task(WP_REST_Request $request) {
    $hook = $request->get_param('hook');
    if (!$hook) {
        return new WP_Error('missing_hook', 'Missing hook parameter', ['status' => 400]);
    }
    $timestamp = wp_next_scheduled($hook);
    if ($timestamp) {
        wp_unschedule_event($timestamp, $hook);
        return ['status' => 'success', 'message' => 'Task unscheduled'];
    } else {
        return ['status' => 'not_found', 'message' => 'No scheduled task found'];
    }
}

3. Создаём функцию для задачи и регистрируем хук

add_action('my_custom_cron_hook', function () {
    // Логика задачи
    error_log('Custom cron task executed at ' . current_time('mysql'));
});

Проверка результата после внедрения

Используйте инструменты типа Postman или curl для вызова REST API:

curl -X POST https://example.com/wp-json/custom-cron/v1/schedule \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{"timestamp": 1710000000, "hook": "my_custom_cron_hook"}'

curl -X POST https://example.com/wp-json/custom-cron/v1/unschedule \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{"hook": "my_custom_cron_hook"}'

После успешного запланирования проверьте wp-cron.log или error_log на выполнение задачи. Для теста можно вручную вызвать wp cron event run --due-now через WP-CLI.

Частые ошибки и как их исправить

  • Неверные права доступа: Убедитесь, что в permission_callback правильно проверяется роль. Иначе API будет недоступен.
  • Дублирование задач: Используйте wp_next_scheduled() чтобы избежать повторного создания.
  • Неправильный timestamp: Timestamp должен быть UNIX-временем в будущем, иначе задача не запланируется.
  • Отсутствие регистрации хука: Если задача не выполняется, проверьте, что хук зарегистрирован через add_action().

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

  • Всегда защищайте REST маршруты проверкой прав (current_user_can('manage_options') или OAuth/JWT аутентификацией).
  • Избегайте частого планирования задач с одинаковыми хук-событиями — это нагрузит сервер.
  • Для длительных или ресурсоёмких задач лучше использовать внешние CRON на сервере с вызовом REST API, а не полагаться на имитацию WP-Cron.
  • Логируйте выполнение задач для мониторинга и отладки.

Сравнение способов управления WP-Cron задачами

МетодПлюсыМинусыПрименимость
Стандартный WP-CronПростота, встроен в WPНет точного запуска, зависит от посещенийДля простых задач
WP-Cron + REST API (как в статье)Удалённый контроль, удобство интеграцииНужно писать код и обеспечивать безопасностьДля кастомных решений и автоматизации
Настоящий системный CRON вызова wp-cron.phpТочный запуск, высокая надёжностьТребует доступа к серверуДля проектов с критичными задачами
Как сделать автоматический импорт новостей в WordPress из RSS
09.01.2026
Автоматическое удаление неактивных товаров в WooCommerce: практическое решение
23.05.2026
Как создать подробный лог для отладки в WordPress
21.11.2025
Как создать поддержку многоязычности в WordPress без плагинов
18.11.2025
Как создать автоматический фидер новостей в WordPress с помощью AJAX
01.04.2026