Skip to content

Commit ef862e4

Browse files
author
Алексей Тихомиров
committed
fix: исправлена регистрация одноразовых задач через at()
- Добавлена обработка одноразовых задач (с префиксом 'once_') в методе scheduleEvent - Обновлена документация в README.md и README.ru.md с примерами использования at() - Добавлены комментарии к коду для лучшего понимания работы планировщика
1 parent b12e37f commit ef862e4

3 files changed

Lines changed: 30 additions & 1 deletion

File tree

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ add_action('wp_queue_schedule', function ($scheduler) {
141141
// From settings
142142
$scheduler->job(BackupJob::class)
143143
->interval(get_option('backup_interval', 'daily'));
144+
145+
// One-time execution (at specific timestamp)
146+
$scheduler->job(OneTimeJob::class)->at(time() + 3600);
144147
});
145148
```
146149

README.ru.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ add_action('wp_queue_schedule', function ($scheduler) {
141141
// Из настроек
142142
$scheduler->job(BackupJob::class)
143143
->interval(get_option('backup_interval', 'daily'));
144+
145+
// Одноразовое выполнение (в указанное время)
146+
$scheduler->job(OneTimeJob::class)->at(time() + 3600);
144147
});
145148
```
146149

src/Scheduler.php

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,10 +149,33 @@ protected function registerJob(string $jobClass, ScheduledJob $scheduled): void
149149
$this->scheduleEvent($hook, $interval);
150150
}
151151

152+
/**
153+
* Schedule an event in WP-Cron.
154+
* Handles both recurring events (hourly, daily, etc.) and one-time events (prefixed with 'once_').
155+
*/
152156
protected function scheduleEvent(string $hook, string $interval): void
153157
{
154158
$existing = wp_get_scheduled_event($hook);
155159

160+
// Handle one-time events
161+
if (str_starts_with($interval, 'once_')) {
162+
$timestamp = (int) substr($interval, 5);
163+
164+
if ($existing !== false) {
165+
// If exists but different timestamp or is recurring
166+
if ($existing->timestamp !== $timestamp || $existing->schedule) {
167+
wp_clear_scheduled_hook($hook);
168+
$existing = false;
169+
}
170+
}
171+
172+
if ($existing === false) {
173+
wp_schedule_single_event($timestamp, $hook);
174+
}
175+
176+
return;
177+
}
178+
156179
// If exists but different interval, reschedule
157180
if ($existing !== false && $existing->schedule !== $interval) {
158181
wp_clear_scheduled_hook($hook);
@@ -178,7 +201,7 @@ protected function getHook(string $jobClass): string
178201
// Извлекаем короткое имя класса без ReflectionClass
179202
$name = substr(strrchr($jobClass, '\\') ?: $jobClass, 1) ?: $jobClass;
180203

181-
return 'wp_queue_'.strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', $name));
204+
return 'wp_queue_' . strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', $name));
182205
}
183206

184207
/**

0 commit comments

Comments
 (0)