120, 'display' => 'Every 2 minutes (Erdo)', ); return $schedules; } ); } /* ------------------------------------------------------------------ BAŞLAT ------------------------------------------------------------------ */ public static function start( array $ids, string $action = 'convert' ) { if ( empty( $ids ) ) { return false; } self::cancel(); // Önceki kuyruğu temizle update_option( 'erdo_queue_ids', $ids, false ); update_option( 'erdo_queue_action', $action, false ); update_option( 'erdo_queue_total', count( $ids ), false ); update_option( 'erdo_queue_done', 0, false ); update_option( 'erdo_queue_errors', array(), false ); update_option( 'erdo_queue_status', 'running', false ); update_option( 'erdo_queue_started', time(), false ); if ( ! wp_next_scheduled( self::HOOK ) ) { wp_schedule_event( time(), self::INTERVAL, self::HOOK ); } // İlk batch'i hemen işle self::process_batch(); return true; } /* ------------------------------------------------------------------ İPTAL ------------------------------------------------------------------ */ public static function cancel() { wp_clear_scheduled_hook( self::HOOK ); update_option( 'erdo_queue_status', 'cancelled' ); delete_option( 'erdo_queue_ids' ); } /* ------------------------------------------------------------------ BATCH İŞLE (Cron hook'u tarafından tetiklenir) ------------------------------------------------------------------ */ public static function process_batch() { if ( get_option( 'erdo_queue_status' ) !== 'running' ) { wp_clear_scheduled_hook( self::HOOK ); return; } $ids = get_option( 'erdo_queue_ids', array() ); $action = get_option( 'erdo_queue_action', 'convert' ); $errors = get_option( 'erdo_queue_errors', array() ); $done = (int) get_option( 'erdo_queue_done', 0 ); if ( empty( $ids ) ) { self::finish(); return; } $batch = array_splice( $ids, 0, self::BATCH_SIZE ); foreach ( $batch as $id ) { $id = (int) $id; $result = false; if ( 'convert' === $action ) { $result = ERDO_Auditor::convert_to_webp( $id, true ); } elseif ( 'delete' === $action ) { $result = ERDO_Auditor::delete_image( $id ); } if ( ! $result ) { $errors[] = $id; } $done++; } update_option( 'erdo_queue_ids', $ids, false ); update_option( 'erdo_queue_done', $done, false ); update_option( 'erdo_queue_errors', $errors, false ); if ( empty( $ids ) ) { self::finish(); } } /* ------------------------------------------------------------------ BİTİŞ ------------------------------------------------------------------ */ private static function finish() { wp_clear_scheduled_hook( self::HOOK ); update_option( 'erdo_queue_status', 'done' ); delete_option( 'erdo_queue_ids' ); // İstatistikleri güncelle ERDO_Auditor::clear_all_cache(); } /* ------------------------------------------------------------------ DURUM ------------------------------------------------------------------ */ public static function get_status() { $status = get_option( 'erdo_queue_status', 'idle' ); $total = (int) get_option( 'erdo_queue_total', 0 ); $done = (int) get_option( 'erdo_queue_done', 0 ); $errors = (array) get_option( 'erdo_queue_errors', array() ); $pct = ( $total > 0 ) ? round( ( $done / $total ) * 100 ) : 0; return array( 'status' => $status, 'total' => $total, 'done' => $done, 'errors' => count( $errors ), 'percent' => $pct, 'running' => ( 'running' === $status ), 'action' => get_option( 'erdo_queue_action', 'convert' ), 'started' => (int) get_option( 'erdo_queue_started', 0 ), ); } public static function is_running() { return get_option( 'erdo_queue_status' ) === 'running'; } }