@@ -26,6 +26,24 @@ public function registerRoutes(): void
2626 'permission_callback ' => [$ this , 'checkPermission ' ],
2727 ]);
2828
29+ register_rest_route ($ namespace , '/queues/(?P<queue>[a-z0-9_-]+) ' , [
30+ 'methods ' => 'GET ' ,
31+ 'callback ' => [$ this , 'getQueue ' ],
32+ 'permission_callback ' => [$ this , 'checkPermission ' ],
33+ ]);
34+
35+ register_rest_route ($ namespace , '/queues/(?P<queue>[a-z0-9_-]+)/jobs ' , [
36+ 'methods ' => 'GET ' ,
37+ 'callback ' => [$ this , 'getQueueJobs ' ],
38+ 'permission_callback ' => [$ this , 'checkPermission ' ],
39+ ]);
40+
41+ register_rest_route ($ namespace , '/queues/(?P<queue>[a-z0-9_-]+)/process ' , [
42+ 'methods ' => 'POST ' ,
43+ 'callback ' => [$ this , 'processQueue ' ],
44+ 'permission_callback ' => [$ this , 'checkPermission ' ],
45+ ]);
46+
2947 register_rest_route ($ namespace , '/queues/(?P<queue>[a-z0-9_-]+)/pause ' , [
3048 'methods ' => 'POST ' ,
3149 'callback ' => [$ this , 'pauseQueue ' ],
@@ -50,6 +68,12 @@ public function registerRoutes(): void
5068 'permission_callback ' => [$ this , 'checkPermission ' ],
5169 ]);
5270
71+ register_rest_route ($ namespace , '/stats ' , [
72+ 'methods ' => 'GET ' ,
73+ 'callback ' => [$ this , 'getStats ' ],
74+ 'permission_callback ' => [$ this , 'checkPermission ' ],
75+ ]);
76+
5377 register_rest_route ($ namespace , '/logs ' , [
5478 'methods ' => 'GET ' ,
5579 'callback ' => [$ this , 'getLogs ' ],
@@ -157,6 +181,98 @@ public function getQueues(): WP_REST_Response
157181 return new WP_REST_Response ($ queues );
158182 }
159183
184+ public function getQueue (WP_REST_Request $ request ): WP_REST_Response |WP_Error
185+ {
186+ $ queueName = $ request ->get_param ('queue ' );
187+ $ optionName = 'wp_queue_jobs_ ' .$ queueName ;
188+
189+ // Проверяем существование очереди
190+ $ jobs = get_site_option ($ optionName , null );
191+
192+ // Очередь существует если есть задачи или это очередь default
193+ if ($ jobs === null && $ queueName !== 'default ' ) {
194+ return new WP_Error ('queue_not_found ' , 'Queue not found ' , ['status ' => 404 ]);
195+ }
196+
197+ $ jobs = $ jobs ?? [];
198+
199+ return new WP_REST_Response ([
200+ 'name ' => $ queueName ,
201+ 'size ' => count ($ jobs ),
202+ 'status ' => WPQueue::isPaused ($ queueName ) ? 'paused ' : 'active ' ,
203+ 'processing ' => WPQueue::isProcessing ($ queueName ),
204+ ]);
205+ }
206+
207+ public function getQueueJobs (WP_REST_Request $ request ): WP_REST_Response
208+ {
209+ $ queueName = $ request ->get_param ('queue ' );
210+ $ jobs = get_site_option ('wp_queue_jobs_ ' .$ queueName , []);
211+
212+ $ result = [];
213+ foreach ($ jobs as $ index => $ job ) {
214+ $ result [] = [
215+ 'id ' => $ index ,
216+ 'class ' => get_class ($ job ),
217+ 'attempts ' => $ job ->attempts ?? 0 ,
218+ 'available_at ' => $ job ->availableAt ?? time (),
219+ ];
220+ }
221+
222+ return new WP_REST_Response ($ result );
223+ }
224+
225+ public function processQueue (WP_REST_Request $ request ): WP_REST_Response
226+ {
227+ $ queueName = $ request ->get_param ('queue ' );
228+ $ maxJobs = (int ) ($ request ->get_param ('max_jobs ' ) ?? 10 );
229+
230+ $ worker = WPQueue::worker ();
231+ $ worker ->setMaxJobs ($ maxJobs );
232+
233+ $ processed = 0 ;
234+ while ($ processed < $ maxJobs && $ worker ->runNextJob ($ queueName )) {
235+ $ processed ++;
236+ }
237+
238+ return new WP_REST_Response ([
239+ 'success ' => true ,
240+ 'processed ' => $ processed ,
241+ ]);
242+ }
243+
244+ public function getStats (): WP_REST_Response
245+ {
246+ global $ wpdb ;
247+
248+ $ queues = [];
249+ $ totalJobs = 0 ;
250+
251+ $ results = $ wpdb ->get_col (
252+ $ wpdb ->prepare (
253+ "SELECT option_name FROM {$ wpdb ->options } WHERE option_name LIKE %s " ,
254+ 'wp_queue_jobs_% ' ,
255+ ),
256+ );
257+
258+ foreach ($ results as $ optionName ) {
259+ $ jobs = get_site_option ($ optionName , []);
260+ $ totalJobs += count ($ jobs );
261+ }
262+
263+ // Получаем статистику из логов
264+ $ logs = WPQueue::logs ();
265+ $ metrics = $ logs ->metrics ();
266+
267+ return new WP_REST_Response ([
268+ 'total_queues ' => count ($ results ) ?: 1 ,
269+ 'total_jobs ' => $ totalJobs ,
270+ 'total_processed ' => $ metrics ['total ' ] ?? 0 ,
271+ 'total_failed ' => $ metrics ['failed ' ] ?? 0 ,
272+ 'total_completed ' => $ metrics ['completed ' ] ?? 0 ,
273+ ]);
274+ }
275+
160276 public function pauseQueue (WP_REST_Request $ request ): WP_REST_Response
161277 {
162278 $ queue = $ request ->get_param ('queue ' );
@@ -201,7 +317,7 @@ public function runJob(WP_REST_Request $request): WP_REST_Response|WP_Error
201317
202318 public function getLogs (WP_REST_Request $ request ): WP_REST_Response
203319 {
204- $ filter = $ request ->get_param ('filter ' ) ?? 'all ' ;
320+ $ filter = $ request ->get_param ('filter ' ) ?? $ request -> get_param ( ' status ' ) ?? 'all ' ;
205321 $ limit = (int ) ($ request ->get_param ('limit ' ) ?? 100 );
206322
207323 $ logs = match ($ filter ) {
0 commit comments