@@ -62,6 +62,7 @@ public function init() {
6262 add_action ( 'wp_ajax_redis_queue_create_test_job ' , array ( $ this , 'ajax_create_test_job ' ) );
6363 add_action ( 'wp_ajax_redis_queue_diagnostics ' , array ( $ this , 'ajax_diagnostics ' ) );
6464 add_action ( 'wp_ajax_redis_queue_debug_test ' , array ( $ this , 'ajax_debug_test ' ) );
65+ add_action ( 'wp_ajax_redis_queue_reset_stuck_jobs ' , array ( $ this , 'ajax_reset_stuck_jobs ' ) );
6566 }
6667
6768 /**
@@ -234,9 +235,13 @@ public function render_dashboard_page() {
234235 <button type="button" class="button button-secondary" id="debug-test">
235236 <?php esc_html_e ( 'Full Debug Test ' , 'redis-queue-demo ' ); ?>
236237 </button>
238+ <button type="button" class="button button-secondary" id="reset-stuck-jobs">
239+ <?php esc_html_e ( 'Reset Stuck Jobs ' , 'redis-queue-demo ' ); ?>
240+ </button>
237241 </div>
238242 <div id="diagnostics-result" style="margin-top: 15px;"></div>
239243 <div id="debug-test-result" style="margin-top: 15px;"></div>
244+ <div id="reset-result" style="margin-top: 15px;"></div>
240245 </div>
241246
242247 <!-- Queue Overview -->
@@ -722,15 +727,15 @@ public function ajax_trigger_worker() {
722727
723728 // Use the helper function to process jobs safely if available
724729 if ( function_exists ( 'redis_queue_process_jobs ' ) ) {
725- $ results = redis_queue_process_jobs ( array ( 'default ' ), 10 );
730+ $ results = redis_queue_process_jobs ( array ( 'default ' , ' email ' , ' media ' , ' api ' ), 10 );
726731 } else {
727732 // Fallback to direct instantiation
728733 if ( ! class_exists ( 'Sync_Worker ' ) ) {
729734 wp_send_json_error ( 'Sync_Worker class not available ' );
730735 return ;
731736 }
732737 $ sync_worker = new Sync_Worker ( $ this ->queue_manager , $ this ->job_processor );
733- $ results = $ sync_worker ->process_jobs ( array ( 'default ' ), 10 );
738+ $ results = $ sync_worker ->process_jobs ( array ( 'default ' , ' email ' , ' media ' , ' api ' ), 10 );
734739 }
735740
736741 // Validate results
@@ -879,28 +884,28 @@ public function ajax_debug_test() {
879884 }
880885
881886 try {
882- $ plugin = redis_queue_demo ();
887+ $ plugin = redis_queue_demo ();
883888 $ debug_results = array ();
884889
885890 // Test 1: Plugin initialization
886- $ debug_results ['plugin_init ' ] = array (
891+ $ debug_results [ 'plugin_init ' ] = array (
887892 'queue_manager ' => is_object ( $ plugin ->queue_manager ),
888893 'job_processor ' => is_object ( $ plugin ->job_processor ),
889894 );
890895
891896 // Test 2: Redis connection
892897 if ( $ plugin ->queue_manager ) {
893- $ debug_results ['redis_connection ' ] = array (
898+ $ debug_results [ 'redis_connection ' ] = array (
894899 'connected ' => $ plugin ->queue_manager ->is_connected (),
895900 );
896901
897902 // Run diagnostics
898- $ diagnostics = $ plugin ->queue_manager ->diagnostic ();
899- $ debug_results ['redis_diagnostics ' ] = $ diagnostics ;
903+ $ diagnostics = $ plugin ->queue_manager ->diagnostic ();
904+ $ debug_results [ 'redis_diagnostics ' ] = $ diagnostics ;
900905 }
901906
902907 // Test 3: Create a test job
903- $ debug_results ['job_creation ' ] = array ();
908+ $ debug_results [ 'job_creation ' ] = array ();
904909 try {
905910 $ job_id = $ plugin ->enqueue_job ( 'email ' , array (
906911 'to ' => 'test@example.com ' ,
@@ -909,47 +914,47 @@ public function ajax_debug_test() {
909914 ) );
910915
911916 if ( $ job_id ) {
912- $ debug_results ['job_creation ' ][ 'job_id ' ] = $ job_id ;
913- $ debug_results ['job_creation ' ][ 'created ' ] = true ;
917+ $ debug_results [ 'job_creation ' ][ 'job_id ' ] = $ job_id ;
918+ $ debug_results [ 'job_creation ' ][ 'created ' ] = true ;
914919
915920 // Check Redis keys after job creation
916- $ diagnostics_after = $ plugin ->queue_manager ->diagnostic ();
917- $ debug_results ['job_creation ' ][ 'redis_keys_after ' ] = $ diagnostics_after ['redis_keys ' ];
921+ $ diagnostics_after = $ plugin ->queue_manager ->diagnostic ();
922+ $ debug_results [ 'job_creation ' ][ 'redis_keys_after ' ] = $ diagnostics_after [ 'redis_keys ' ];
918923
919- // Try to dequeue the job
920- $ dequeued = $ plugin ->queue_manager ->dequeue ( array ( 'default ' ) );
924+ // Try to dequeue the job (check email queue since that's where email jobs go)
925+ $ dequeued = $ plugin ->queue_manager ->dequeue ( array ( 'email ' ) );
921926 if ( $ dequeued ) {
922- $ debug_results ['job_creation ' ][ 'dequeued ' ] = true ;
923- $ debug_results ['job_creation ' ][ 'dequeued_job_id ' ] = $ dequeued ['job_id ' ];
924- $ debug_results ['job_creation ' ][ 'dequeued_type ' ] = $ dequeued ['job_type ' ];
925- $ debug_results ['job_creation ' ][ 'dequeued_payload ' ] = $ dequeued ['payload ' ];
927+ $ debug_results [ 'job_creation ' ][ 'dequeued ' ] = true ;
928+ $ debug_results [ 'job_creation ' ][ 'dequeued_job_id ' ] = $ dequeued [ 'job_id ' ];
929+ $ debug_results [ 'job_creation ' ][ 'dequeued_type ' ] = $ dequeued [ 'job_type ' ];
930+ $ debug_results [ 'job_creation ' ][ 'dequeued_payload ' ] = $ dequeued [ 'payload ' ];
926931 } else {
927- $ debug_results ['job_creation ' ][ 'dequeued ' ] = false ;
928- $ debug_results ['job_creation ' ][ 'dequeue_error ' ] = 'No job found to dequeue ' ;
932+ $ debug_results [ 'job_creation ' ][ 'dequeued ' ] = false ;
933+ $ debug_results [ 'job_creation ' ][ 'dequeue_error ' ] = 'No job found to dequeue ' ;
929934 }
930935 } else {
931- $ debug_results ['job_creation ' ][ 'created ' ] = false ;
932- $ debug_results ['job_creation ' ][ 'error ' ] = 'Failed to create job ' ;
936+ $ debug_results [ 'job_creation ' ][ 'created ' ] = false ;
937+ $ debug_results [ 'job_creation ' ][ 'error ' ] = 'Failed to create job ' ;
933938 }
934939 } catch (Exception $ e ) {
935- $ debug_results ['job_creation ' ][ 'exception ' ] = $ e ->getMessage ();
940+ $ debug_results [ 'job_creation ' ][ 'exception ' ] = $ e ->getMessage ();
936941 }
937942
938943 // Test 4: Check database
939944 global $ wpdb ;
940- $ table_name = $ wpdb ->prefix . 'redis_queue_jobs ' ;
941- $ job_count = $ wpdb ->get_var ( "SELECT COUNT(*) FROM {$ table_name }" );
942- $ debug_results ['database ' ] = array (
945+ $ table_name = $ wpdb ->prefix . 'redis_queue_jobs ' ;
946+ $ job_count = $ wpdb ->get_var ( "SELECT COUNT(*) FROM {$ table_name }" );
947+ $ debug_results [ 'database ' ] = array (
943948 'table_exists ' => $ wpdb ->get_var ( "SHOW TABLES LIKE ' {$ table_name }' " ) === $ table_name ,
944- 'job_count ' => intval ( $ job_count ),
949+ 'job_count ' => intval ( $ job_count ),
945950 );
946951
947952 // Get recent jobs from database
948- $ recent_jobs = $ wpdb ->get_results (
953+ $ recent_jobs = $ wpdb ->get_results (
949954 "SELECT job_id, job_type, status, created_at FROM {$ table_name } ORDER BY created_at DESC LIMIT 5 " ,
950955 ARRAY_A
951956 );
952- $ debug_results ['database ' ][ 'recent_jobs ' ] = $ recent_jobs ;
957+ $ debug_results [ 'database ' ][ 'recent_jobs ' ] = $ recent_jobs ;
953958
954959 wp_send_json_success ( $ debug_results );
955960
@@ -958,6 +963,29 @@ public function ajax_debug_test() {
958963 }
959964 }
960965
966+ /**
967+ * AJAX handler to reset stuck jobs.
968+ *
969+ * @since 1.0.0
970+ */
971+ public function ajax_reset_stuck_jobs () {
972+ check_ajax_referer ( 'redis_queue_admin ' , 'nonce ' );
973+
974+ if ( ! current_user_can ( 'manage_options ' ) ) {
975+ wp_die ( -1 );
976+ }
977+
978+ try {
979+ $ reset_count = $ this ->queue_manager ->reset_stuck_jobs ( 30 );
980+ wp_send_json_success ( array (
981+ 'message ' => sprintf ( 'Reset %d stuck jobs back to queued status. ' , $ reset_count ),
982+ 'count ' => $ reset_count ,
983+ ) );
984+ } catch (Exception $ e ) {
985+ wp_send_json_error ( 'Failed to reset stuck jobs: ' . ( $ e ? $ e ->getMessage () : 'Unknown error ' ) );
986+ }
987+ }
988+
961989 /**
962990 * Get system health status.
963991 *
0 commit comments