preview(); return $preview['count']; } public function run_label() { return __( 'Remove', '360-orbit-database-cleaner' ); } public function message_for( array $preview ) { return Wp360_Database_Cleaner_Cleaner::preview_message( $preview ); } public function confirm_for( array $preview ) { return sprintf( /* translators: 1: action name, 2: the preview sentence, e.g. "12 entries (3 KB) would be removed." */ __( '%1$s: %2$s Remove them now? This cannot be undone. Take a backup first if you are unsure.', '360-orbit-database-cleaner' ), $this->label(), $this->message_for( $preview ) ); } public function progress_template() { /* translators: %s: number of entries removed so far */ return __( 'Removing … %s removed so far.', '360-orbit-database-cleaner' ); } public function done_template() { /* translators: %s: number of entries removed */ return __( 'Done. %s removed.', '360-orbit-database-cleaner' ); } public function history_text( $count ) { return sprintf( /* translators: 1: name of the clean-up action, 2: number of entries removed */ __( 'Cleaned up "%1$s": %2$s removed', '360-orbit-database-cleaner' ), $this->label(), number_format_i18n( $count ) ); } } class Wp360_Database_Cleaner_Cleaner { /** Eintraege je Stapel. */ const BATCH = 200; /** Zeitbudget je Anfrage in Sekunden; danach meldet die Anfrage den Rest zurueck. */ const TIME_BUDGET = 10; /** * Alle verfuegbaren Aufraeumarten. * * @return array Slug => Aufraeumart. */ public static function tasks() { $tasks = array( new Wp360_Database_Cleaner_Task_Expired_Transients(), new Wp360_Database_Cleaner_Task_Revisions(), new Wp360_Database_Cleaner_Task_All_Transients(), ); $out = array(); foreach ( $tasks as $task ) { $out[ $task->slug() ] = $task; } return $out; } /** * @param string $slug Kurzname. * @return Wp360_Database_Cleaner_Task|null */ public static function task( $slug ) { $tasks = self::tasks(); return isset( $tasks[ $slug ] ) ? $tasks[ $slug ] : null; } /** * Loescht in Stapeln, bis nichts mehr uebrig ist, kein Fortschritt mehr * entsteht oder das Zeitbudget aufgebraucht ist. Bei Rest meldet der * Aufrufer die Anfrage erneut. * * @param string $slug Kurzname der Aufraeumart. * @param int $seconds Zeitbudget. * @param int $batch Stapelgroesse. * @param string $source Herkunft des Laufs fuer den Verlauf: 'manual' oder 'scheduled'. * @return array{deleted: int, remaining: int}|WP_Error */ public static function run( $slug, $seconds = self::TIME_BUDGET, $batch = self::BATCH, $source = 'manual' ) { $task = self::task( $slug ); if ( ! $task ) { return new WP_Error( 'unknown_task', __( 'Unknown action.', '360-orbit-database-cleaner' ) ); } $start = microtime( true ); $deleted = 0; do { $count = $task->run_batch( $batch ); $deleted += $count; } while ( $count > 0 && ( microtime( true ) - $start ) < $seconds ); if ( $deleted > 0 ) { Wp360_Database_Cleaner_History::add( 'cleanup', array( 'task' => $slug, 'deleted' => $deleted, 'source' => $source, ) ); } return array( 'deleted' => $deleted, 'remaining' => $task->remaining(), ); } /** * Text zur Vorschau, bereits uebersetzt (reiner Text, ohne HTML). * * @param array{count: int, bytes: int, note: string} $preview Ergebnis von preview(). * @return string */ public static function preview_message( array $preview ) { if ( 'object_cache' === $preview['note'] ) { return __( 'A persistent object cache is active, so transients are not stored in the database. There is nothing to remove here.', '360-orbit-database-cleaner' ); } if ( $preview['count'] < 1 ) { return __( 'Nothing to remove.', '360-orbit-database-cleaner' ); } return sprintf( /* translators: 1: number of entries, 2: size, e.g. "3.1 MB" */ _n( '%1$s entry (%2$s) would be removed.', '%1$s entries (%2$s) would be removed.', $preview['count'], '360-orbit-database-cleaner' ), number_format_i18n( $preview['count'] ), size_format( $preview['bytes'] ) ); } }