Менеджер очередей для WordPress, вдохновленный Laravel Horizon
Простая, мощная и современная обработка фоновых задач.
Возможности • Установка • Быстрый старт • Админ панель • REST API • Тестирование • 🇬🇧 English
- 🚀 API в стиле Laravel — Чистый, fluent API для отправки задач с атрибутами PHP 8
- 📦 Несколько драйверов — Database, Redis, Memcached, Sync (автоопределение)
- 🔄 Автоматические повторы — Экспоненциальная задержка для неудачных задач
- ⏰ Планирование — Cron-подобное планирование задач
- 👁️ Монитор WP-Cron — Просмотр, запуск, пауза, возобновление, редактирование cron событий
- 📊 Панель управления — Красивый интерфейс админ-панели со статистикой
- 🔌 REST API — Полный API для интеграций
- 💻 WP-CLI — Полный интерфейс командной строки
- 🌍 i18n Ready — Включены переводы (русский язык)
- PHP 8.3+
- WordPress 6.0+
- Клонируйте или загрузите в
wp-content/plugins/wp-queue - Запустите
composer install - Активируйте плагин
use WPQueue\Jobs\Job;
use WPQueue\Attributes\{Schedule, Queue, Timeout, Retries};
#[Schedule('hourly')]
#[Queue('imports')]
#[Timeout(120)]
#[Retries(5)]
class ImportProductsJob extends Job
{
public function __construct(
private array $productIds
) {
parent::__construct();
}
public function handle(): void
{
foreach ($this->productIds as $id) {
// Логика импорта
}
}
public function failed(\Throwable $e): void
{
// Обработка ошибки
error_log('Импорт не удался: ' . $e->getMessage());
}
}use WPQueue\WPQueue;
// Отправить в очередь
WPQueue::dispatch(new ImportProductsJob([1, 2, 3]));
// С задержкой (секунды)
WPQueue::dispatch(new ImportProductsJob($ids))->delay(60);
// В конкретную очередь
WPQueue::dispatch(new ImportProductsJob($ids))->onQueue('high-priority');
// Синхронное выполнение (обойти очередь)
WPQueue::dispatchSync(new ImportProductsJob($ids));
// Цепочка задач
WPQueue::chain([
new FetchProductsJob(),
new ImportProductsJob($ids),
new NotifyAdminJob(),
])->dispatch();
// Пакетная обработка
WPQueue::batch([
new ImportProductJob($id1),
new ImportProductJob($id2),
new ImportProductJob($id3),
])->dispatch();// В вашем плагине
add_action('wp_queue_schedule', function ($scheduler) {
// Использование атрибутов (автоматически)
$scheduler->job(ImportProductsJob::class);
// Ручное планирование
$scheduler->job(CleanupJob::class)->daily();
// Пользовательский интервал
$scheduler->job(CheckStopListJob::class)->everyMinutes(15);
// С условием
$scheduler->job(SyncJob::class)
->hourly()
->when(fn() => get_option('sync_enabled'));
// Из настроек
$scheduler->job(BackupJob::class)
->interval(get_option('backup_interval', 'daily'));
// Одноразовое выполнение (в указанное время)
$scheduler->job(OneTimeJob::class)->at(time() + 3600);
});#[Schedule('hourly')] // Фиксированный интервал
#[Schedule('daily', setting: 'my_opt')] // Из wp_optionsДоступные интервалы: min, 5min, 10min, 15min, 30min, hourly, 2hourly, 3hourly, 6hourly, 8hourly, 12hourly, daily, twicedaily, weekly
#[Queue('default')] // Имя очереди
#[Queue('high')] // Приоритетная очередь#[Timeout(60)] // 60 секунд
#[Timeout(300)] // 5 минут#[Retries(3)] // Максимум 3 попытки
#[Retries(5)] // Максимум 5 попыток#[UniqueJob] // Предотвратить дублирование задач
#[UniqueJob(key: 'custom_key')]// Перед выполнением задачи
add_action('wp_queue_job_processing', function($event) {
// $event->job, $event->queue
});
// После успешного выполнения
add_action('wp_queue_job_processed', function($event) {
// $event->job, $event->queue
});
// При ошибке
add_action('wp_queue_job_failed', function($event) {
// $event->job, $event->queue, $event->exception
});
// При повторе
add_action('wp_queue_job_retrying', function($event) {
// $event->job, $event->queue, $event->attempt, $event->exception
});use WPQueue\WPQueue;
// Проверка статуса
WPQueue::isProcessing('default'); // bool
WPQueue::isPaused('default'); // bool
WPQueue::queueSize('default'); // int
// Управление
WPQueue::pause('default');
WPQueue::resume('default');
WPQueue::cancel('default'); // Очистить + пауза
WPQueue::clear('default'); // Удалить все задачи
// Логи
WPQueue::logs()->recent(100);
WPQueue::logs()->failed();
WPQueue::logs()->forJob(ImportProductsJob::class);
WPQueue::logs()->metrics();
WPQueue::logs()->clearOld(7); // Очистить логи старше 7 днейДоступна через WP Admin → WP Queue
| Вкладка | Описание |
|---|---|
| Панель управления | Статистика (ожидание, выполнение, завершено, ошибки), управление очередями |
| Запланированные задачи | Задачи WP Queue с кнопкой "Запустить сейчас" |
| Логи | История выполнения с фильтрацией |
| WP-Cron | Мониторинг всех событий WordPress cron |
| Система | Статус окружения и проверка здоровья |
Просмотр и управление всеми событиями WordPress cron:
- Фильтрация по источнику (WordPress, WooCommerce, Плагины, WP Queue)
- Просмотр просроченных событий
- Ручной запуск событий
- Удаление запланированных событий
- Просмотр зарегистрированных расписаний
Проверка здоровья и информация об окружении:
- Версии PHP/WordPress
- Лимит памяти и использование
- Статус WP-Cron (отключен/альтернативный)
- Проверка loopback запросов
- Статистика Action Scheduler (если установлен)
- Информация о часовом поясе и времени
GET /wp-json/wp-queue/v1/queues
POST /wp-json/wp-queue/v1/queues/{queue}/pause
POST /wp-json/wp-queue/v1/queues/{queue}/resume
POST /wp-json/wp-queue/v1/queues/{queue}/clear
POST /wp-json/wp-queue/v1/jobs/{job}/run
GET /wp-json/wp-queue/v1/logs
POST /wp-json/wp-queue/v1/logs/clear
GET /wp-json/wp-queue/v1/metrics
# Cron & Система
GET /wp-json/wp-queue/v1/cron
POST /wp-json/wp-queue/v1/cron/run
POST /wp-json/wp-queue/v1/cron/delete
GET /wp-json/wp-queue/v1/systemWP Queue поддерживает несколько бэкендов хранения:
| Драйвер | Описание | Требования |
|---|---|---|
database |
Использует таблицу wp_options (по умолчанию) | Нет |
redis |
Сервер Redis | расширение phpredis |
memcached |
Сервер Memcached | расширение memcached |
sync |
Синхронное выполнение | Нет |
auto |
Автоопределение лучшего доступного | Нет |
Добавьте в wp-config.php:
// Выбор драйвера очереди
define('WP_QUEUE_DRIVER', 'redis'); // или 'memcached', 'database', 'sync', 'auto'
// Настройки Redis (совместимо с плагином redis-cache)
define('WP_REDIS_HOST', 'redis'); // или '127.0.0.1'
define('WP_REDIS_PORT', '6379');
define('WP_REDIS_PREFIX', 'mysite_'); // опционально
define('WP_REDIS_PASSWORD', 'secret'); // опционально
define('WP_REDIS_DATABASE', 0); // опционально, 0-15
// Настройки Memcached
define('WP_MEMCACHED_HOST', '127.0.0.1');
define('WP_MEMCACHED_PORT', 11211);use WPQueue\WPQueue;
use WPQueue\Contracts\QueueInterface;
// Установка драйвера программно
WPQueue::manager()->setDefaultDriver('redis');
// Проверка доступных драйверов
$drivers = WPQueue::manager()->getAvailableDrivers();
// ['database' => ['available' => true, 'info' => '...'], ...]
// Проверка доступности конкретного драйвера
if (WPQueue::manager()->isDriverAvailable('redis')) {
WPQueue::manager()->setDefaultDriver('redis');
}
// Регистрация пользовательского драйвера
WPQueue::manager()->extend('sqs', function() {
return new SqsQueue(['region' => 'us-east-1']);
});Если вы используете плагин Redis Object Cache, WP Queue автоматически использует те же настройки подключения Redis. Дополнительная конфигурация не требуется!
// Эти константы из redis-cache автоматически используются:
// WP_REDIS_HOST, WP_REDIS_PORT, WP_REDIS_PASSWORD, WP_REDIS_DATABASE
// WP_REDIS_PREFIX, WP_REDIS_SCHEME, WP_REDIS_PATH, WP_REDIS_TIMEOUTas_schedule_recurring_action(time(), HOUR_IN_SECONDS, 'my_hourly_task');
add_action('my_hourly_task', function() {
// код задачи
});#[Schedule('hourly')]
class MyHourlyTask extends Job
{
public function handle(): void
{
// код задачи
}
}
// Регистрация
add_action('wp_queue_schedule', fn($s) => $s->job(MyHourlyTask::class));| Функция | Action Scheduler | WP Queue |
|---|---|---|
| База данных | 2 пользовательские таблицы | wp_options |
| API | 20+ функций | 1 фасад |
| Версия PHP | 7.4+ | 8.3+ |
| Регистрация | Ручная | Атрибуты |
| Логика повторов | Сложная | #[Retries(3)] |
| Интерфейс | Встроенный | Встроенный |
| Количество файлов | 50+ | ~15 |
WP Queue использует CI-first подход к тестированию с полным покрытием.
Быстрые изолированные тесты без окружения WordPress:
composer test:unitРезультаты: 69 тестов, 130 утверждений ✅
Интеграционные тесты с реальным WordPress запускаются автоматически в CI:
- ✅ WordPress latest (6.7+) + PHP 8.3
- ✅ WordPress 6.7 + PHP 8.3
E2E тесты запускаются при каждом push в ветки main/develop и в pull requests.
# Проверка стиля кода
composer lint
# Запуск всех тестов
composer testПримечание: Покрытие кода требует расширения PCOV или Xdebug. В Docker окружении используйте:
docker exec wp_site-php composer lint
docker exec wp_site-php composer test:unitПодробнее: tests/README.md
Смотрите полный рабочий пример: wp-queue-example-plugin
Пример плагина демонстрирует:
- ✅ Создание пользовательских задач с атрибутами PHP 8
- ✅ Планирование задач с разными интервалами
- ✅ Обработку ошибок и повторы
- ✅ Цепочку и пакетную обработку
- ✅ Управление очередями и мониторинг
- ✅ Интеграцию REST API
- ✅ Команды WP-CLI
Идеально подходит для изучения того, как интегрировать WP Queue в ваши плагины WordPress!
GPL-2.0-or-later