Диагностика проблемы: почему стандартный 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 | Точный запуск, высокая надёжность | Требует доступа к серверу | Для проектов с критичными задачами |