Changeset 3798362
- Timestamp:
- 11/12/2026 01:05:22 PM (39 hours ago)
- Location:
- ws-action-scheduler-cleaner/trunk
- Files:
-
- 9 added
- 23 edited
-
.distignore (modified) (1 diff)
-
assets/js/ws-as-cleaner.js (modified) (1 diff)
-
includes/class-activation.php (modified) (2 diffs)
-
includes/class-database.php (modified) (1 diff)
-
includes/class-wsacsc-activation.php (added)
-
includes/class-wsacsc-admin.php (added)
-
includes/class-wsacsc-ajax.php (added)
-
includes/class-wsacsc-cleanup.php (added)
-
includes/class-wsacsc-database.php (added)
-
includes/class-wsacsc-job-lock.php (added)
-
includes/class-wsacsc-rebuild.php (added)
-
includes/class-wsacsc-scheduler.php (added)
-
includes/filters.php (modified) (3 diffs)
-
includes/helpers.php (modified) (8 diffs)
-
languages/ws-action-scheduler-cleaner-de_AT.mo (modified) ( previous)
-
languages/ws-action-scheduler-cleaner-de_AT.po (modified) (2 diffs)
-
languages/ws-action-scheduler-cleaner-de_AT_informal.mo (modified) ( previous)
-
languages/ws-action-scheduler-cleaner-de_AT_informal.po (modified) (2 diffs)
-
languages/ws-action-scheduler-cleaner-de_CH.mo (modified) ( previous)
-
languages/ws-action-scheduler-cleaner-de_CH.po (modified) (2 diffs)
-
languages/ws-action-scheduler-cleaner-de_CH_informal.mo (modified) ( previous)
-
languages/ws-action-scheduler-cleaner-de_CH_informal.po (modified) (2 diffs)
-
languages/ws-action-scheduler-cleaner-de_DE.mo (modified) ( previous)
-
languages/ws-action-scheduler-cleaner-de_DE.po (modified) (2 diffs)
-
languages/ws-action-scheduler-cleaner-de_DE_formal.mo (modified) ( previous)
-
languages/ws-action-scheduler-cleaner-de_DE_formal.po (modified) (2 diffs)
-
languages/ws-action-scheduler-cleaner.pot (modified) (1 diff)
-
phpcs.xml.dist (added)
-
readme.txt (modified) (6 diffs)
-
uninstall.php (modified) (1 diff)
-
ws-action-scheduler-cleaner.php (modified) (4 diffs)
-
wsacsc-populate-test-data.php (modified) (48 diffs)
Legend:
- Unmodified
- Added
- Removed
-
ws-action-scheduler-cleaner/trunk/.distignore
r3544086 r3798362 2 2 wsacsc-populate-test-data.php 3 3 .distignore 4 phpcs.xml.dist -
ws-action-scheduler-cleaner/trunk/assets/js/ws-as-cleaner.js
r3559324 r3798362 5 5 const scheduleFieldSelector = '#actions-schedule-interval, #actions-schedule-time, #actions-retention, #logs-schedule-interval, #logs-schedule-time, #logs-retention'; 6 6 const destructiveButtonSelector = '#clear-actions, #clear-logs, #optimize-actions, #optimize-logs'; 7 const POLL_INTERVAL_MS = 650;7 const POLL_INTERVAL_MS = 250; 8 8 const POLL_RETRY_MAX_MS = 8000; 9 9 -
ws-action-scheduler-cleaner/trunk/includes/class-activation.php
r3750500 r3798362 36 36 37 37 if ( in_array( 'scheduled_date_gmt', $columns ) && in_array( 'status', $columns ) ) { 38 $wpdb->query( 39 $wpdb->prepare( 40 'CREATE INDEX IF NOT EXISTS as_status_scheduled ON %i (status, scheduled_date_gmt)', 41 $actions_table 42 ) 43 ); 38 WSACSC_Database::create_index_if_missing( $actions_table, 'as_status_scheduled', array( 'status', 'scheduled_date_gmt' ) ); 44 39 } 45 40 46 41 if ( in_array( 'completed_date_gmt', $columns ) && in_array( 'status', $columns ) ) { 47 $wpdb->query( 48 $wpdb->prepare( 49 'CREATE INDEX IF NOT EXISTS as_status_completed ON %i (status, completed_date_gmt)', 50 $actions_table 51 ) 52 ); 42 WSACSC_Database::create_index_if_missing( $actions_table, 'as_status_completed', array( 'status', 'completed_date_gmt' ) ); 53 43 } 54 44 … … 76 66 $actions_table = $wpdb->prefix . 'actionscheduler_actions'; 77 67 if ( WSACSC_Database::check_tables_exist() ) { 78 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared 79 $wpdb->query( "DROP INDEX IF EXISTS as_status_scheduled ON `{$actions_table}`" ); 80 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared 81 $wpdb->query( "DROP INDEX IF EXISTS as_status_completed ON `{$actions_table}`" ); 68 WSACSC_Database::drop_index_if_exists( $actions_table, 'as_status_scheduled' ); 69 WSACSC_Database::drop_index_if_exists( $actions_table, 'as_status_completed' ); 82 70 } 83 71 -
ws-action-scheduler-cleaner/trunk/includes/class-database.php
r3559324 r3798362 47 47 48 48 return $result; 49 } 50 51 /** 52 * Check whether an index exists on a table. 53 * 54 * Uses SHOW INDEX because MySQL does not support IF [NOT] EXISTS on CREATE INDEX or DROP INDEX. 55 * Only MariaDB supports that syntax. 56 * 57 * @param string $table Full table name, including the prefix. 58 * @param string $index_name Index name. 59 * @return bool True if the index exists. False if it does not exist or the query fails. 60 */ 61 public static function index_exists( string $table, string $index_name ): bool { 62 global $wpdb; 63 64 $query = $wpdb->prepare( 'SHOW INDEX FROM %i WHERE Key_name = %s', $table, $index_name ); 65 $result = $wpdb->get_results( $query ); 66 67 return ! empty( $result ); 68 } 69 70 /** 71 * Create an index if it does not exist yet. 72 * 73 * Works on MySQL and MariaDB. A concurrent request can create the same index between 74 * the check and the CREATE INDEX statement. In that case the query fails and returns false. 75 * 76 * @param string $table Full table name, including the prefix. 77 * @param string $index_name Index name. 78 * @param string[] $columns Column names in index order. 79 * @return bool True if the index exists after the call. 80 */ 81 public static function create_index_if_missing( string $table, string $index_name, array $columns ): bool { 82 global $wpdb; 83 84 if ( empty( $columns ) ) { 85 return false; 86 } 87 88 if ( self::index_exists( $table, $index_name ) ) { 89 return true; 90 } 91 92 $column_placeholders = implode( ', ', array_fill( 0, count( $columns ), '%i' ) ); 93 // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Only %i placeholders are interpolated. 94 $query = $wpdb->prepare( "CREATE INDEX %i ON %i ({$column_placeholders})", $index_name, $table, ...array_values( $columns ) ); 95 96 return false !== $wpdb->query( $query ); 97 } 98 99 /** 100 * Drop an index if it exists. 101 * 102 * Works on MySQL and MariaDB. 103 * 104 * @param string $table Full table name, including the prefix. 105 * @param string $index_name Index name. 106 * @return bool True if the index does not exist after the call. 107 */ 108 public static function drop_index_if_exists( string $table, string $index_name ): bool { 109 global $wpdb; 110 111 if ( ! self::index_exists( $table, $index_name ) ) { 112 return true; 113 } 114 115 $query = $wpdb->prepare( 'DROP INDEX %i ON %i', $index_name, $table ); 116 117 return false !== $wpdb->query( $query ); 49 118 } 50 119 -
ws-action-scheduler-cleaner/trunk/includes/filters.php
r3750500 r3798362 18 18 add_filter( 'action_scheduler_retention_period', 'wsacsc_change_retention_period' ); 19 19 add_filter( 'action_scheduler_default_cleaner_statuses', 'wsacsc_set_cleaner_statuses' ); 20 add_filter( 'action_scheduler_enable_failed_action_cleanup', 'wsacsc_filter_failed_action_cleanup' ); 20 21 } 21 22 22 23 /** 23 * Increase cleanup batch size 24 * Increase cleanup batch size to at least 50. 24 25 * 25 * @param int $batch_size Default batch size26 * @param int $batch_size Batch size from Action Scheduler or other code. 26 27 * @return int 27 28 */ 28 29 function wsacsc_increase_cleanup_batch_size( $batch_size ): int { 29 return 50;30 return max( (int) $batch_size, 50 ); 30 31 } 31 32 32 33 /** 33 * Increase queue runner time limit 34 * Increase queue runner time limit to at least 60 seconds. 34 35 * 35 * @param int $time_limit Default time limit36 * @param int $time_limit Time limit from Action Scheduler or other code. 36 37 * @return int 37 38 */ 38 39 function wsacsc_increase_queue_runner_time_limit( $time_limit ): int { 39 return 60;40 return max( (int) $time_limit, 60 ); 40 41 } 41 42 … … 59 60 60 61 /** 61 * Change retention period62 * Retention period in seconds that keeps all actions from the Action Scheduler cleaner. 62 63 * 63 * @param int $default_retention_period Default retention period 64 * @return int 64 * Action Scheduler builds its cutoff with "<seconds> seconds ago". PHP_INT_MAX overflows 65 * to a future date, so the cleaner deleted all finished actions in 1.3.1. 50 years stays 66 * below the 32-bit integer limit and gives a cutoff before any Action Scheduler data. 67 */ 68 const WSACSC_DISABLED_RETENTION_PERIOD = 50 * YEAR_IN_SECONDS; 69 70 /** 71 * Pass the actions retention period to Action Scheduler. 72 * 73 * When the plugin schedule is active, the Action Scheduler cleaner must delete nothing. 74 * wsacsc_set_cleaner_statuses() returns an empty status list for this. Action Scheduler 75 * before 3.6 has no status filter, and 3.6 to 3.9 replace an empty list with their 76 * default statuses. So this function also returns a retention period that matches no action. 77 * 78 * @param int $default_retention_period Default retention period in seconds. 79 * @return int Retention period in seconds. 65 80 */ 66 81 function wsacsc_change_retention_period( $default_retention_period ): int { 67 82 if ( wsacsc_is_plugin_schedule_active() ) { 68 return PHP_INT_MAX;83 return WSACSC_DISABLED_RETENTION_PERIOD; 69 84 } 70 85 71 86 $retention_days_option = get_option( 'wsacsc_actions_retention', '30' ); 72 if ( $retention_days_option === ''|| ! ctype_digit( (string) $retention_days_option ) ) {73 return $default_retention_period;87 if ( '' === $retention_days_option || ! ctype_digit( (string) $retention_days_option ) ) { 88 return (int) $default_retention_period; 74 89 } 75 $retention_days = absint( $retention_days_option ); 76 if ( 0 === $retention_days ) { 77 return 0; 78 } 79 return $retention_days * DAY_IN_SECONDS; 90 91 return absint( $retention_days_option ) * DAY_IN_SECONDS; 80 92 } 81 93 82 94 /** 83 * Set cleaner statuses 95 * Set cleaner statuses. 84 96 * 85 * @param array $default_statuses Default statuses 97 * An empty array turns off the Action Scheduler cleaner in Action Scheduler 4.0 and later. 98 * Versions 3.6 to 3.9 use their default statuses instead, and earlier versions have no 99 * status filter. For these, wsacsc_change_retention_period() returns a retention period 100 * that matches no action. 101 * 102 * @param array $default_statuses Default statuses. 86 103 * @return array 87 104 */ 88 105 function wsacsc_set_cleaner_statuses( $default_statuses ): array { 106 if ( wsacsc_is_plugin_schedule_active() ) { 107 return array(); 108 } 109 89 110 $selected_statuses_option = get_option( 'wsacsc_selected_statuses', array( 'complete', 'failed', 'canceled' ) ); 90 111 if ( ! is_array( $selected_statuses_option ) ) { … … 95 116 $selected_statuses = array_intersect( $selected_statuses, wsacsc_get_allowed_action_statuses() ); 96 117 97 return ! empty( $selected_statuses ) ? $selected_statuses :$default_statuses;118 return ! empty( $selected_statuses ) ? array_values( $selected_statuses ) : (array) $default_statuses; 98 119 } 120 121 /** 122 * Turn off the separate failed-action cleanup of Action Scheduler 4.0 and later 123 * while the plugin schedule is active. 124 * 125 * @param bool $enabled Whether Action Scheduler purges failed actions. 126 * @return bool 127 */ 128 function wsacsc_filter_failed_action_cleanup( $enabled ): bool { 129 return wsacsc_is_plugin_schedule_active() ? false : (bool) $enabled; 130 } -
ws-action-scheduler-cleaner/trunk/includes/helpers.php
r3559324 r3798362 24 24 25 25 /** 26 * Write a diagnostic message to the PHP error log when logging is on. 27 * 28 * @param string $message Message without the plugin name prefix. 29 */ 30 function wsacsc_log( string $message ): void { 31 if ( ! wsacsc_should_log() ) { 32 return; 33 } 34 35 // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Diagnostic output only when WP_DEBUG or plugin development mode is on. 36 error_log( 'WS Action Scheduler Cleaner: ' . $message ); 37 } 38 39 /** 40 * Set the PHP time limit when the host allows it. 41 * 42 * @param int $seconds Seconds. 0 means no limit. 43 */ 44 function wsacsc_set_time_limit( int $seconds ): void { 45 if ( ! function_exists( 'set_time_limit' ) ) { 46 return; 47 } 48 49 $disabled_functions = array_map( 'trim', explode( ',', (string) ini_get( 'disable_functions' ) ) ); 50 if ( in_array( 'set_time_limit', $disabled_functions, true ) ) { 51 return; 52 } 53 54 set_time_limit( max( 0, $seconds ) ); 55 } 56 57 /** 58 * Cutoff in UTC for a retention period. 59 * 60 * The cutoff is calculated in PHP so that it does not depend on the time zone of the 61 * database session, and so that it stays the same for all chunks of one job. 62 * 63 * @param int $retention_days Retention in days (1 to 365). 64 * @return string Date and time in the format Y-m-d H:i:s (UTC). 65 */ 66 function wsacsc_get_retention_cutoff_gmt( int $retention_days ): string { 67 return gmdate( 'Y-m-d H:i:s', time() - ( $retention_days * DAY_IN_SECONDS ) ); 68 } 69 70 /** 71 * Whether a value is a valid retention cutoff. 72 * 73 * @param mixed $value Value from stored progress data. 74 * @return bool True for a UTC date in the format Y-m-d H:i:s that is not in the future and not older than 366 days. 75 */ 76 function wsacsc_is_valid_retention_cutoff( $value ): bool { 77 if ( ! is_string( $value ) ) { 78 return false; 79 } 80 81 $date = DateTimeImmutable::createFromFormat( 'Y-m-d H:i:s', $value, new DateTimeZone( 'UTC' ) ); 82 if ( false === $date || $date->format( 'Y-m-d H:i:s' ) !== $value ) { 83 return false; 84 } 85 86 $timestamp = $date->getTimestamp(); 87 88 return $timestamp <= time() && $timestamp >= time() - ( 366 * DAY_IN_SECONDS ); 89 } 90 91 /** 26 92 * Action statuses allowed for cleanup operations. 27 93 * … … 64 130 global $wpdb; 65 131 66 $actions_table = $wpdb->prefix . 'actionscheduler_actions';67 $columns_query = $wpdb->prepare( 'DESC %i', $actions_table );68 $columns_result = $wpdb->get_results( $ columns_query);132 $actions_table = $wpdb->prefix . 'actionscheduler_actions'; 133 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Table structure of Action Scheduler. The result is cached in a static variable. 134 $columns_result = $wpdb->get_results( $wpdb->prepare( 'DESC %i', $actions_table ) ); 69 135 $columns = is_array( $columns_result ) ? wp_list_pluck( $columns_result, 'Field' ) : array(); 70 136 $allowed_columns = wsacsc_get_allowed_actions_retention_date_columns(); … … 110 176 111 177 return array( 112 'where_clause' => 'status IN (' . $placeholders . ') AND `' . $date_column . '` < DATE_SUB(NOW(), INTERVAL %d DAY)', 113 'where_params' => array_merge( $selected_statuses, array( $retention_days ) ), 178 'where_clause' => 'status IN (' . $placeholders . ') AND `' . $date_column . '` < %s', 179 'where_params' => array_merge( $selected_statuses, array( wsacsc_get_retention_cutoff_gmt( $retention_days ) ) ), 180 ); 181 } 182 183 /** 184 * Build WHERE clause and parameters for scheduled logs retention cleanup. 185 * 186 * @param int $retention_days Retention in days (0 = all log entries). 187 * @return array{where_clause: string, where_params: array} 188 */ 189 function wsacsc_build_logs_retention_where( int $retention_days ): array { 190 if ( 0 === $retention_days ) { 191 return array( 192 'where_clause' => '1=1', 193 'where_params' => array(), 194 ); 195 } 196 197 return array( 198 'where_clause' => '`log_date_gmt` < %s', 199 'where_params' => array( wsacsc_get_retention_cutoff_gmt( $retention_days ) ), 114 200 ); 115 201 } … … 159 245 return false; 160 246 } 161 } elseif ( '`log_date_gmt` < DATE_SUB(NOW(), INTERVAL %d DAY)' === $where_clause ) {247 } elseif ( '`log_date_gmt` < %s' === $where_clause ) { 162 248 if ( $logs_table !== $table || 1 !== count( $where_params ) ) { 163 249 return false; 164 250 } 165 $retention_days = (int) $where_params[0]; 166 if ( $retention_days < 1 || $retention_days > 365 ) { 251 if ( ! wsacsc_is_valid_retention_cutoff( $where_params[0] ) ) { 167 252 return false; 168 253 } … … 182 267 } 183 268 } 184 } elseif ( preg_match( '/^status IN \((%s(?:,\s*%s)*)\) AND `(completed_date_gmt|last_attempt_gmt|scheduled_date_gmt)` < DATE_SUB\(NOW\(\), INTERVAL %d DAY\)$/', $where_clause, $matches ) ) {269 } elseif ( preg_match( '/^status IN \((%s(?:,\s*%s)*)\) AND `(completed_date_gmt|last_attempt_gmt|scheduled_date_gmt)` < %s$/', $where_clause, $matches ) ) { 185 270 if ( $actions_table !== $table ) { 186 271 return false; … … 196 281 } 197 282 198 $retention_days = (int) $where_params[ count( $where_params ) - 1 ]; 199 if ( $retention_days < 1 || $retention_days > 365 ) { 283 if ( ! wsacsc_is_valid_retention_cutoff( $where_params[ count( $where_params ) - 1 ] ) ) { 200 284 return false; 201 285 } … … 221 305 } 222 306 307 if ( isset( $progress['total_to_delete'] ) ) { 308 $progress['total_to_delete'] = max( 0, (int) $progress['total_to_delete'] ); 309 } 310 223 311 if ( isset( $progress['context'] ) && ! in_array( $progress['context'], array( 'ajax', 'cron' ), true ) ) { 224 312 return false; … … 231 319 * Format in-progress cleanup message with rows deleted. 232 320 * 233 * @param int $total_deleted Rows deleted so far. 321 * @param int $total_deleted Rows deleted so far. 322 * @param int $total_to_delete Rows the job counted at its start, or 0 if unknown. 234 323 * @return string 235 324 */ 236 function wsacsc_format_cleanup_progress_message( int $total_deleted ): string { 325 function wsacsc_format_cleanup_progress_message( int $total_deleted, int $total_to_delete = 0 ): string { 326 if ( $total_to_delete > 0 && $total_deleted < $total_to_delete ) { 327 return sprintf( 328 /* translators: 1: rows deleted so far, 2: rows to delete in total, 3: percentage done. */ 329 __( 'Clearing in progress… %1$s of %2$s rows deleted (%3$d%%).', 'ws-action-scheduler-cleaner' ), 330 number_format_i18n( $total_deleted ), 331 number_format_i18n( $total_to_delete ), 332 (int) floor( $total_deleted / $total_to_delete * 100 ) 333 ); 334 } 335 237 336 if ( $total_deleted <= 0 ) { 238 337 return __( 'Clearing in progress...', 'ws-action-scheduler-cleaner' ); -
ws-action-scheduler-cleaner/trunk/languages/ws-action-scheduler-cleaner-de_AT.po
r3750500 r3798362 1 # 1 2 msgid "" 2 3 msgstr "" 3 4 "Project-Id-Version: WS Action Scheduler Cleaner\n" 4 "Report-Msgid-Bugs-To: \n"5 "POT-Creation-Date: 202 4-10-10 12:00+0000\n"6 "PO-Revision-Date: 202 5-11-24 18:00+0100\n"5 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ws-action-scheduler-cleaner\n" 6 "POT-Creation-Date: 2026-11-10T20:25:22+00:00\n" 7 "PO-Revision-Date: 2026-11-10 12:00+0000\n" 7 8 "Last-Translator: Marco Brack <mbrack@winning-solutions.de>\n" 8 9 "Language-Team: \n" … … 14 15 "X-Generator: Poedit 3.8\n" 15 16 17 #. Plugin Name of the plugin 18 #: ws-action-scheduler-cleaner.php includes/class-wsacsc-admin.php:70 includes/class-wsacsc-admin.php:149 includes/class-wsacsc-admin.php:156 16 19 msgid "WS Action Scheduler Cleaner" 17 20 msgstr "WS Action Scheduler Cleaner" 18 21 22 #. Description of the plugin 23 #: ws-action-scheduler-cleaner.php 24 msgid "Suffering from database bloat? Try cleaning up the Action Scheduler tables through an easy-to-understand GUI." 25 msgstr "Leidet Ihre Datenbank unter aufgeblähten Tabellen? Bereinigen Sie die Action-Scheduler-Tabellen über eine leicht verständliche Oberfläche." 26 27 #. Author of the plugin 28 #: ws-action-scheduler-cleaner.php 29 msgid "Winning Solutions - Nagel & Mäder GbR" 30 msgstr "Winning Solutions - Nagel & Mäder GbR" 31 32 #. Author URI of the plugin 33 #: ws-action-scheduler-cleaner.php 34 msgid "https://www.winning-solutions.de" 35 msgstr "https://www.winning-solutions.de" 36 37 #: includes/class-wsacsc-admin.php:40 38 msgid "Settings" 39 msgstr "Einstellungen" 40 41 #: includes/class-wsacsc-admin.php:71 42 msgid "WS AS Cleaner" 43 msgstr "WS AS Cleaner" 44 45 #: includes/class-wsacsc-admin.php:118 includes/class-wsacsc-ajax.php:108 includes/class-wsacsc-ajax.php:314 46 msgid "Please select at least one status to clear." 47 msgstr "Bitte wählen Sie mindestens einen Status zum Bereinigen aus." 48 49 #: includes/class-wsacsc-admin.php:119 includes/helpers.php:337 50 msgid "Clearing in progress..." 51 msgstr "Bereinigung läuft..." 52 53 #: includes/class-wsacsc-admin.php:120 54 msgid "Please wait..." 55 msgstr "Bitte warten Sie..." 56 57 #: includes/class-wsacsc-admin.php:121 58 msgid "An error occurred. Please try again." 59 msgstr "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut." 60 61 #: includes/class-wsacsc-admin.php:122 includes/class-wsacsc-ajax.php:138 62 msgid "Selected actions cleared successfully!" 63 msgstr "Ausgewählte Aktionen erfolgreich bereinigt!" 64 65 #: includes/class-wsacsc-admin.php:123 includes/class-wsacsc-ajax.php:180 includes/class-wsacsc-ajax.php:197 66 msgid "Logs cleared successfully!" 67 msgstr "Protokolle erfolgreich bereinigt!" 68 69 #: includes/class-wsacsc-admin.php:124 includes/class-wsacsc-ajax.php:295 70 msgid "Schedule saved successfully!" 71 msgstr "Zeitplan erfolgreich gespeichert!" 72 73 #: includes/class-wsacsc-admin.php:125 includes/class-wsacsc-ajax.php:319 74 msgid "Statuses saved successfully!" 75 msgstr "Status erfolgreich gespeichert!" 76 77 #: includes/class-wsacsc-admin.php:126 78 msgid "Optimizing table..." 79 msgstr "Tabelle wird optimiert..." 80 81 #: includes/class-wsacsc-admin.php:127 includes/class-wsacsc-admin.php:189 includes/class-wsacsc-admin.php:191 includes/class-wsacsc-admin.php:197 includes/class-wsacsc-admin.php:199 82 msgid "Loading..." 83 msgstr "Wird geladen..." 84 85 #: includes/class-wsacsc-admin.php:128 includes/class-wsacsc-ajax.php:382 86 msgid "Table optimization failed." 87 msgstr "Tabellenoptimierung fehlgeschlagen." 88 89 #: includes/class-wsacsc-admin.php:129 90 msgid "Please fix the highlighted fields before saving." 91 msgstr "Bitte korrigieren Sie die markierten Felder vor dem Speichern." 92 93 #: includes/class-wsacsc-admin.php:130 includes/class-wsacsc-admin.php:192 94 msgid "Refresh actions table size" 95 msgstr "Größe der Aktionstabelle aktualisieren" 96 97 #: includes/class-wsacsc-admin.php:131 includes/class-wsacsc-admin.php:200 98 msgid "Refresh logs table size" 99 msgstr "Größe der Protokolltabelle aktualisieren" 100 101 #: includes/class-wsacsc-admin.php:132 102 msgid "Retrying…" 103 msgstr "Erneuter Versuch…" 104 105 #: includes/class-wsacsc-admin.php:150 106 msgid "Action Scheduler tables do not exist. Please ensure Action Scheduler is properly installed and activated." 107 msgstr "Die Action-Scheduler-Tabellen existieren nicht. Bitte stellen Sie sicher, dass Action Scheduler ordnungsgemäß installiert und aktiviert ist." 108 109 #: includes/class-wsacsc-admin.php:159 19 110 msgid "This tool allows you to clean up the Action Scheduler tables in your WordPress database. Action Scheduler is a library used by many plugins to schedule background tasks." 20 111 msgstr "Dieses Tool ermöglicht es Ihnen, die Action Scheduler-Tabellen in Ihrer WordPress-Datenbank zu bereinigen. Action Scheduler ist eine Bibliothek, die von vielen Plugins zur Planung von Hintergrundaufgaben verwendet wird." 21 112 22 msgid "Please wait..." 23 msgstr "Bitte warten Sie..." 24 25 msgid "Loading..." 26 msgstr "Wird geladen..." 27 113 #: includes/class-wsacsc-admin.php:160 28 114 msgid "The Action Scheduler uses two main tables:" 29 115 msgstr "Der Action Scheduler verwendet zwei Haupttabellen:" 30 116 117 #: includes/class-wsacsc-admin.php:162 31 118 msgid "Actions Table: Stores scheduled actions and their statuses." 32 119 msgstr "Aktionstabelle: Speichert geplante Aktionen und deren Status." 33 120 121 #: includes/class-wsacsc-admin.php:163 34 122 msgid "Logs Table: Stores logs of action executions." 35 123 msgstr "Protokolltabelle: Speichert Protokolle von Aktionsausführungen." 36 124 125 #: includes/class-wsacsc-admin.php:165 37 126 msgid "Clearing these tables is generally safe and can improve database performance. However, please note:" 38 127 msgstr "Das Bereinigen dieser Tabellen ist im Allgemeinen sicher und kann die Datenbankleistung verbessern. Bitte beachten Sie jedoch:" 39 128 129 #: includes/class-wsacsc-admin.php:167 40 130 msgid "Clearing can take a while depending on the size of the tables." 41 131 msgstr "Die Bereinigung kann je nach Größe der Tabellen eine Weile dauern." 42 132 133 #: includes/class-wsacsc-admin.php:168 43 134 msgid "Cleared data will be permanently deleted." 44 135 msgstr "Bereinigte Daten werden dauerhaft gelöscht." 45 136 137 #: includes/class-wsacsc-admin.php:169 46 138 msgid "It's recommended to <strong>make a backup</strong> before proceeding." 47 139 msgstr "Es wird empfohlen, vor dem Fortfahren ein <strong>Backup zu erstellen</strong>." 48 140 141 #: includes/class-wsacsc-admin.php:170 49 142 msgid "Clearing completed, failed, or canceled actions usually doesn't affect WordPress functionality." 50 143 msgstr "Das Bereinigen von abgeschlossenen, fehlgeschlagenen oder abgebrochenen Aktionen beeinträchtigt normalerweise nicht die WordPress-Funktionalität." 51 144 145 #. translators: %s: URL to Action Scheduler admin page 146 #: includes/class-wsacsc-admin.php:177 147 #, php-format 52 148 msgid "For more information, visit the <a href=\"%s\">Action Scheduler admin page</a>." 53 149 msgstr "Weitere Informationen finden Sie auf der <a href=\"%s\">Action Scheduler-Administrationsseite</a>." 54 150 151 #: includes/class-wsacsc-admin.php:186 55 152 msgid "Current Table Sizes:" 56 153 msgstr "Aktuelle Tabellengrößen:" 57 154 155 #: includes/class-wsacsc-admin.php:188 58 156 msgid "Actions table:" 59 157 msgstr "Aktionstabelle:" 60 158 159 #: includes/class-wsacsc-admin.php:190 includes/class-wsacsc-admin.php:198 61 160 msgid "rows" 62 161 msgstr "Zeilen" 63 162 163 #: includes/class-wsacsc-admin.php:196 64 164 msgid "Logs table:" 65 165 msgstr "Protokolltabelle:" 66 166 167 #: includes/class-wsacsc-admin.php:207 67 168 msgid "Clear Action Statuses" 68 169 msgstr "Aktionsstatus bereinigen" 69 170 70 msgid "Select which action statuses to clear:" 71 msgstr "Wählen Sie aus, welche Aktionsstatus bereinigt werden sollen:" 72 171 #: includes/class-wsacsc-admin.php:209 172 msgid "Action statuses to clear" 173 msgstr "Zu bereinigende Aktionsstatus" 174 175 #: includes/class-wsacsc-admin.php:210 73 176 msgid "Select which statuses to remove when clearing manually, when this plugin runs scheduled action cleanup, and (if this plugin’s action cleanup schedule is disabled) which statuses Action Scheduler may delete in the background:" 74 177 msgstr "Wählen Sie aus, welche Status bei manueller Bereinigung, bei der geplanten Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) bei der Hintergrundbereinigung von Action Scheduler entfernt werden sollen:" 75 178 179 #: includes/class-wsacsc-admin.php:217 76 180 msgid "Complete" 77 181 msgstr "Abgeschlossen" 78 182 183 #: includes/class-wsacsc-admin.php:218 79 184 msgid "Failed" 80 185 msgstr "Fehlgeschlagen" 81 186 187 #: includes/class-wsacsc-admin.php:219 82 188 msgid "Canceled" 83 189 msgstr "Abgebrochen" 84 190 191 #: includes/class-wsacsc-admin.php:221 85 192 msgid "Clear Selected Actions" 86 193 msgstr "Ausgewählte Aktionen bereinigen" 87 194 195 #: includes/class-wsacsc-admin.php:226 88 196 msgid "Clear Logs Table" 89 197 msgstr "Protokolltabelle bereinigen" 90 198 199 #: includes/class-wsacsc-admin.php:227 91 200 msgid "This will clear all entries in the logs table." 92 201 msgstr "Dies wird alle Einträge in der Protokolltabelle löschen." 93 202 203 #: includes/class-wsacsc-admin.php:228 94 204 msgid "Clear Logs" 95 205 msgstr "Protokolle bereinigen" 96 206 207 #: includes/class-wsacsc-admin.php:232 208 msgid "Optimize Tables" 209 msgstr "Tabellen optimieren" 210 211 #: includes/class-wsacsc-admin.php:233 212 msgid "Optimize the database tables to reclaim unused space and potentially improve performance." 213 msgstr "Optimiere die Datenbanktabellen, um ungenutzten Speicherplatz freizugeben und möglicherweise die Leistung zu verbessern." 214 215 #: includes/class-wsacsc-admin.php:235 216 msgid "Optimize Actions Table" 217 msgstr "Aktionstabelle optimieren" 218 219 #: includes/class-wsacsc-admin.php:236 220 msgid "Optimize Logs Table" 221 msgstr "Protokolltabelle optimieren" 222 223 #: includes/class-wsacsc-admin.php:241 97 224 msgid "Scheduling Options" 98 225 msgstr "Planungsoptionen" 99 226 100 msgid "Set up automatic clearing schedules for selected statuses (set to 0 to clean fully; leave empty to disable automatic clearing):" 101 msgstr "Richten Sie automatische Bereinigungspläne für ausgewählte Status ein (auf 0 setzen, um vollständig zu bereinigen; leer lassen, um die automatische Bereinigung zu deaktivieren):" 102 103 msgid "Clear logs older than:" 104 msgstr "Protokolle bereinigen, die älter sind als:" 105 227 #: includes/class-wsacsc-admin.php:242 228 msgid "Finished actions can be removed automatically in two ways: this plugin’s scheduled cleanup (settings below) and Action Scheduler’s own built-in background cleanup for the actions table. The status checkboxes in “Clear Action Statuses” above define which statuses are affected—manual clearing, this plugin’s scheduled action cleanup, and (when this plugin’s action cleanup schedule is disabled) Action Scheduler’s background deletions." 229 msgstr "Abgeschlossene Aktionen können auf zwei Arten automatisch entfernt werden: über die geplante Bereinigung dieses Plugins (Einstellungen unten) und über die eingebaute Hintergrundbereinigung von Action Scheduler für die Aktionstabelle. Die Status-Kontrollkästchen unter „Aktionsstatus bereinigen“ legen fest, welche Status betroffen sind – manuelle Bereinigung, die geplante Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) die Hintergrundlöschungen von Action Scheduler." 230 231 #: includes/class-wsacsc-admin.php:243 232 msgid "Cleanup schedule and retention period are separate. Cleanup schedule controls how often this plugin runs its own WordPress cron jobs (1–365 days, or empty/0 to disable). Retention period controls how old entries must be before they are deleted. For actions, age is measured by completion or last attempt time—not the original scheduled date." 233 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist sind getrennte Einstellungen. Der Bereinigungszeitplan legt fest, wie oft dieses Plugin seine eigenen WordPress-Cronjobs ausführt (1–365 Tage, oder leer/0 zum Deaktivieren). Die Aufbewahrungsfrist legt fest, wie alt Einträge sein müssen, bevor sie gelöscht werden. Bei Aktionen wird das Alter am Abschluss- oder letzten Ausführungszeitpunkt gemessen – nicht am ursprünglichen Planungsdatum." 234 235 #: includes/class-wsacsc-admin.php:244 236 msgid "If an actions cleanup schedule is enabled, only this plugin’s cron job deletes old actions (using the selected statuses above); Action Scheduler’s built-in action cleanup is turned off to avoid duplicate deletions. If that schedule is disabled, this plugin does not run scheduled action cleanup—the actions retention period is passed to Action Scheduler instead, which deletes actions in the selected statuses when they are older than that many days." 237 msgstr "Ist ein Bereinigungszeitplan für Aktionen aktiviert, löscht nur der Cronjob dieses Plugins alte Aktionen (mit den oben gewählten Status); die eingebaute Aktionsbereinigung von Action Scheduler wird deaktiviert, um doppelte Löschungen zu vermeiden. Ist dieser Zeitplan deaktiviert, führt dieses Plugin keine geplante Aktionsbereinigung aus – die Aufbewahrungsfrist für Aktionen wird stattdessen an Action Scheduler übergeben, das Aktionen in den gewählten Status löscht, wenn sie älter als die angegebene Anzahl Tage sind." 238 239 #: includes/class-wsacsc-admin.php:245 240 msgid "Logs cleanup schedule and logs retention apply only to this plugin; Action Scheduler does not clean the logs table on its own." 241 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist für Protokolle gelten nur für dieses Plugin; Action Scheduler bereinigt die Protokolltabelle nicht von sich aus." 242 243 #: includes/class-wsacsc-admin.php:246 244 msgid "This plugin does not hide status filters on the Action Scheduler admin screen. Tabs such as Complete or Failed only appear when actions with those statuses exist in the database. On sites with a very large pending backlog, few actions may finish; if counts stay at zero, those tabs will not show." 245 msgstr "Dieses Plugin blendet keine Statusfilter auf der Action-Scheduler-Verwaltungsseite aus. Registerkarten wie „Abgeschlossen“ oder „Fehlgeschlagen“ erscheinen nur, wenn Aktionen mit diesen Status in der Datenbank existieren. Bei sehr großem Pending-Rückstau werden wenige Aktionen abgeschlossen; bleiben die Zähler bei null, werden diese Registerkarten nicht angezeigt." 246 247 #: includes/class-wsacsc-admin.php:249 248 msgid "Action Statuses" 249 msgstr "Aktionsstatus" 250 251 #: includes/class-wsacsc-admin.php:251 includes/class-wsacsc-admin.php:277 252 msgid "Cleanup Schedule:" 253 msgstr "Bereinigungszeitplan:" 254 255 #: includes/class-wsacsc-admin.php:254 includes/class-wsacsc-admin.php:269 includes/class-wsacsc-admin.php:280 includes/class-wsacsc-admin.php:295 106 256 msgid "days" 107 257 msgstr "Tage" 108 258 109 msgid "Clear action statuses older than:" 110 msgstr "Aktionsstatus bereinigen, die älter sind als:" 111 259 #: includes/class-wsacsc-admin.php:256 260 msgid "This plugin only: how often its WordPress cron job deletes old actions (empty or 0 = disabled, 1–365 days). When enabled, Action Scheduler’s built-in action cleanup is disabled. This is not the retention period." 261 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Aktionen löscht (leer oder 0 = deaktiviert, 1–365 Tage). Wenn aktiviert, ist die eingebaute Aktionsbereinigung von Action Scheduler deaktiviert. Das ist nicht die Aufbewahrungsfrist." 262 263 #: includes/class-wsacsc-admin.php:259 includes/class-wsacsc-admin.php:285 264 msgid "Schedule Time:" 265 msgstr "Zeitplan:" 266 267 #: includes/class-wsacsc-admin.php:263 268 msgid "This plugin only: time of day for its action cleanup job (WordPress timezone)." 269 msgstr "Nur dieses Plugin: Tageszeit für den Aktions-Bereinigungsjob (WordPress-Zeitzone)." 270 271 #: includes/class-wsacsc-admin.php:266 includes/class-wsacsc-admin.php:292 272 msgid "Retention Period:" 273 msgstr "Aufbewahrungsfrist:" 274 275 #: includes/class-wsacsc-admin.php:271 276 msgid "How long to keep actions before deletion (by completion or last attempt time, not scheduled date), for the statuses selected above. With a plugin action cleanup schedule enabled: used only by this plugin’s cron job. With that schedule disabled: passed to Action Scheduler’s background cleanup for the same selected statuses. 0 = delete all matching actions on every cleanup run. Required." 277 msgstr "Wie lange Aktionen vor dem Löschen aufbewahrt werden (Abschluss- oder letzter Ausführungszeitpunkt, nicht Planungsdatum), für die oben gewählten Status. Mit aktiviertem Aktions-Bereinigungszeitplan: nur für den Cronjob dieses Plugins. Ohne diesen Zeitplan: wird an die Hintergrundbereinigung von Action Scheduler für dieselben Status übergeben. 0 = bei jedem Bereinigungslauf alle passenden Aktionen löschen. Pflichtfeld." 278 279 #: includes/class-wsacsc-admin.php:275 280 msgid "Logs" 281 msgstr "Protokolle" 282 283 #: includes/class-wsacsc-admin.php:282 284 msgid "This plugin only: how often its WordPress cron job deletes old log entries (empty or 0 = disabled, 1–365 days). Action Scheduler does not clean logs automatically. This is not the retention period." 285 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Protokolleinträge löscht (leer oder 0 = deaktiviert, 1–365 Tage). Action Scheduler bereinigt Protokolle nicht automatisch. Das ist nicht die Aufbewahrungsfrist." 286 287 #: includes/class-wsacsc-admin.php:289 288 msgid "This plugin only: time of day for its log cleanup job (WordPress timezone)." 289 msgstr "Nur dieses Plugin: Tageszeit für den Protokoll-Bereinigungsjob (WordPress-Zeitzone)." 290 291 #: includes/class-wsacsc-admin.php:297 292 msgid "This plugin only: delete log entries older than this many days (0 = delete all logs on each cleanup run). Required." 293 msgstr "Nur dieses Plugin: Protokolleinträge löschen, die älter sind als diese Anzahl Tage (0 = bei jedem Bereinigungslauf alle Protokolle löschen). Pflichtfeld." 294 295 #: includes/class-wsacsc-admin.php:301 112 296 msgid "Save Schedule" 113 297 msgstr "Zeitplan speichern" 114 298 299 #: includes/class-wsacsc-admin.php:307 115 300 msgid "Powered by Winning Solutions" 116 301 msgstr "Powered by Winning Solutions" 117 302 118 msgid "Selected actions cleared successfully!" 119 msgstr "Ausgewählte Aktionen erfolgreich bereinigt!" 120 121 msgid "Logs cleared successfully!" 122 msgstr "Protokolle erfolgreich bereinigt!" 123 124 msgid "Schedule saved successfully!" 125 msgstr "Zeitplan erfolgreich gespeichert!" 126 303 #: includes/class-wsacsc-ajax.php:37 304 msgid "Another cleanup or optimization is already running. Please wait until it finishes." 305 msgstr "Eine andere Bereinigung oder Optimierung läuft bereits. Bitte warten Sie, bis sie abgeschlossen ist." 306 307 #: includes/class-wsacsc-ajax.php:81 includes/class-wsacsc-ajax.php:96 includes/class-wsacsc-ajax.php:150 includes/class-wsacsc-ajax.php:209 includes/class-wsacsc-ajax.php:305 includes/class-wsacsc-ajax.php:329 includes/class-wsacsc-ajax.php:356 includes/class-wsacsc-ajax.php:404 308 msgid "Insufficient permissions." 309 msgstr "Unzureichende Berechtigungen." 310 311 #: includes/class-wsacsc-ajax.php:112 includes/class-wsacsc-ajax.php:156 312 msgid "Action Scheduler tables do not exist." 313 msgstr "Die Action-Scheduler-Tabellen existieren nicht." 314 315 #: includes/class-wsacsc-ajax.php:131 316 msgid "An error occurred while clearing actions." 317 msgstr "Beim Bereinigen der Aktionen ist ein Fehler aufgetreten." 318 319 #: includes/class-wsacsc-ajax.php:190 320 msgid "An error occurred while clearing logs." 321 msgstr "Beim Bereinigen der Protokolle ist ein Fehler aufgetreten." 322 323 #: includes/class-wsacsc-ajax.php:230 324 msgid "Actions schedule interval must be empty or between 1 and 365 days." 325 msgstr "Das Intervall für den Aktionszeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 326 327 #: includes/class-wsacsc-ajax.php:234 328 msgid "Logs schedule interval must be empty or between 1 and 365 days." 329 msgstr "Das Intervall für den Protokollzeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 330 331 #: includes/class-wsacsc-ajax.php:238 332 msgid "Actions schedule time must be in HH:MM format." 333 msgstr "Die Zeit für den Aktionszeitplan muss im Format HH:MM angegeben werden." 334 335 #: includes/class-wsacsc-ajax.php:242 336 msgid "Logs schedule time must be in HH:MM format." 337 msgstr "Die Zeit für den Protokollzeitplan muss im Format HH:MM angegeben werden." 338 339 #: includes/class-wsacsc-ajax.php:246 340 msgid "Actions retention period is required and must be between 0 and 365 days." 341 msgstr "Die Aufbewahrungsfrist für Aktionen ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 342 343 #: includes/class-wsacsc-ajax.php:250 344 msgid "Logs retention period is required and must be between 0 and 365 days." 345 msgstr "Die Aufbewahrungsfrist für Protokolle ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 346 347 #: includes/class-wsacsc-ajax.php:288 348 msgid "Failed to save schedule. Please try again." 349 msgstr "Der Zeitplan konnte nicht gespeichert werden. Bitte versuchen Sie es erneut." 350 351 #: includes/class-wsacsc-ajax.php:292 127 352 msgid "The settings were saved, but the cleanup schedule could not be updated yet. The plugin will retry automatically." 128 353 msgstr "Die Einstellungen wurden gespeichert, aber der Bereinigungszeitplan konnte noch nicht aktualisiert werden. Das Plugin versucht es automatisch erneut." 129 354 130 msgid "Statuses saved successfully!" 131 msgstr "Status erfolgreich gespeichert!" 132 133 msgid "Settings" 134 msgstr "Einstellungen" 135 136 msgid "Action Scheduler tables do not exist. Please ensure Action Scheduler is properly installed and activated." 137 msgstr "Die Action-Scheduler-Tabellen existieren nicht. Bitte stellen Sie sicher, dass Action Scheduler ordnungsgemäß installiert und aktiviert ist." 138 139 msgid "Please select at least one status to clear." 140 msgstr "Bitte wählen Sie mindestens einen Status zum Bereinigen aus." 141 142 msgid "Clearing in progress..." 143 msgstr "Bereinigung läuft..." 144 145 msgid "An error occurred. Please try again." 146 msgstr "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut." 147 148 msgid "Optimize Tables" 149 msgstr "Tabellen optimieren" 150 151 msgid "Optimize the database tables to reclaim unused space and potentially improve performance." 152 msgstr "Optimiere die Datenbanktabellen, um ungenutzten Speicherplatz freizugeben und möglicherweise die Leistung zu verbessern." 153 154 msgid "Optimize Actions Table" 155 msgstr "Aktionstabelle optimieren" 156 157 msgid "Optimize Logs Table" 158 msgstr "Protokolltabelle optimieren" 159 160 msgid "Optimizing table..." 161 msgstr "Tabelle wird optimiert..." 162 355 #: includes/class-wsacsc-ajax.php:336 includes/class-wsacsc-ajax.php:363 356 msgid "Invalid table type." 357 msgstr "Ungültiger Tabellentyp." 358 359 #. translators: %s: table type (actions or logs). 360 #: includes/class-wsacsc-ajax.php:390 361 #, php-format 163 362 msgid "%s table optimized successfully!" 164 363 msgstr "%s-Tabelle erfolgreich optimiert!" 165 364 166 msgid "Table optimization failed." 167 msgstr "Tabellenoptimierung fehlgeschlagen." 168 169 msgid "Table does not exist." 170 msgstr "Tabelle existiert nicht." 171 172 msgid "Invalid table type." 173 msgstr "Ungültiger Tabellentyp." 174 175 msgid "Insufficient permissions." 176 msgstr "Unzureichende Berechtigungen." 177 178 msgid "Finished actions can be removed automatically in two ways: this plugin’s scheduled cleanup (settings below) and Action Scheduler’s own built-in background cleanup for the actions table. The status checkboxes in “Clear Action Statuses” above define which statuses are affected—manual clearing, this plugin’s scheduled action cleanup, and (when this plugin’s action cleanup schedule is disabled) Action Scheduler’s background deletions." 179 msgstr "Abgeschlossene Aktionen können auf zwei Arten automatisch entfernt werden: über die geplante Bereinigung dieses Plugins (Einstellungen unten) und über die eingebaute Hintergrundbereinigung von Action Scheduler für die Aktionstabelle. Die Status-Kontrollkästchen unter „Aktionsstatus bereinigen“ legen fest, welche Status betroffen sind – manuelle Bereinigung, die geplante Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) die Hintergrundlöschungen von Action Scheduler." 180 181 msgid "Cleanup schedule and retention period are separate. Cleanup schedule controls how often this plugin runs its own WordPress cron jobs (1–365 days, or empty/0 to disable). Retention period controls how old entries must be before they are deleted. For actions, age is measured by completion or last attempt time—not the original scheduled date." 182 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist sind getrennte Einstellungen. Der Bereinigungszeitplan legt fest, wie oft dieses Plugin seine eigenen WordPress-Cronjobs ausführt (1–365 Tage, oder leer/0 zum Deaktivieren). Die Aufbewahrungsfrist legt fest, wie alt Einträge sein müssen, bevor sie gelöscht werden. Bei Aktionen wird das Alter am Abschluss- oder letzten Ausführungszeitpunkt gemessen – nicht am ursprünglichen Planungsdatum." 183 184 msgid "If an actions cleanup schedule is enabled, only this plugin’s cron job deletes old actions (using the selected statuses above); Action Scheduler’s built-in action cleanup is turned off to avoid duplicate deletions. If that schedule is disabled, this plugin does not run scheduled action cleanup—the actions retention period is passed to Action Scheduler instead, which deletes actions in the selected statuses when they are older than that many days." 185 msgstr "Ist ein Bereinigungszeitplan für Aktionen aktiviert, löscht nur der Cronjob dieses Plugins alte Aktionen (mit den oben gewählten Status); die eingebaute Aktionsbereinigung von Action Scheduler wird deaktiviert, um doppelte Löschungen zu vermeiden. Ist dieser Zeitplan deaktiviert, führt dieses Plugin keine geplante Aktionsbereinigung aus – die Aufbewahrungsfrist für Aktionen wird stattdessen an Action Scheduler übergeben, das Aktionen in den gewählten Status löscht, wenn sie älter als die angegebene Anzahl Tage sind." 186 187 msgid "Logs cleanup schedule and logs retention apply only to this plugin; Action Scheduler does not clean the logs table on its own." 188 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist für Protokolle gelten nur für dieses Plugin; Action Scheduler bereinigt die Protokolltabelle nicht von sich aus." 189 190 msgid "This plugin does not hide status filters on the Action Scheduler admin screen. Tabs such as Complete or Failed only appear when actions with those statuses exist in the database. On sites with a very large pending backlog, few actions may finish; if counts stay at zero, those tabs will not show." 191 msgstr "Dieses Plugin blendet keine Statusfilter auf der Action-Scheduler-Verwaltungsseite aus. Registerkarten wie „Abgeschlossen“ oder „Fehlgeschlagen“ erscheinen nur, wenn Aktionen mit diesen Status in der Datenbank existieren. Bei sehr großem Pending-Rückstau werden wenige Aktionen abgeschlossen; bleiben die Zähler bei null, werden diese Registerkarten nicht angezeigt." 192 193 msgid "Action Statuses" 194 msgstr "Aktionsstatus" 195 196 msgid "Cleanup Schedule:" 197 msgstr "Bereinigungszeitplan:" 198 199 msgid "This plugin only: how often its WordPress cron job deletes old actions (empty or 0 = disabled, 1–365 days). When enabled, Action Scheduler’s built-in action cleanup is disabled. This is not the retention period." 200 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Aktionen löscht (leer oder 0 = deaktiviert, 1–365 Tage). Wenn aktiviert, ist die eingebaute Aktionsbereinigung von Action Scheduler deaktiviert. Das ist nicht die Aufbewahrungsfrist." 201 202 msgid "Schedule Time:" 203 msgstr "Zeitplan:" 204 205 msgid "This plugin only: time of day for its action cleanup job (WordPress timezone)." 206 msgstr "Nur dieses Plugin: Tageszeit für den Aktions-Bereinigungsjob (WordPress-Zeitzone)." 207 208 msgid "Retention Period:" 209 msgstr "Aufbewahrungsfrist:" 210 211 msgid "How long to keep actions before deletion (by completion or last attempt time, not scheduled date), for the statuses selected above. With a plugin action cleanup schedule enabled: used only by this plugin’s cron job. With that schedule disabled: passed to Action Scheduler’s background cleanup for the same selected statuses. 0 = delete all matching actions on every cleanup run. Required." 212 msgstr "Wie lange Aktionen vor dem Löschen aufbewahrt werden (Abschluss- oder letzter Ausführungszeitpunkt, nicht Planungsdatum), für die oben gewählten Status. Mit aktiviertem Aktions-Bereinigungszeitplan: nur für den Cronjob dieses Plugins. Ohne diesen Zeitplan: wird an die Hintergrundbereinigung von Action Scheduler für dieselben Status übergeben. 0 = bei jedem Bereinigungslauf alle passenden Aktionen löschen. Pflichtfeld." 213 214 msgid "Logs" 215 msgstr "Protokolle" 216 217 msgid "How often to run cleanup (empty or 0 = disabled, 1-365 days)." 218 msgstr "Wie oft die Bereinigung ausgeführt wird (leer oder 0 = deaktiviert, 1–365 Tage)." 219 220 msgid "This plugin only: how often its WordPress cron job deletes old log entries (empty or 0 = disabled, 1–365 days). Action Scheduler does not clean logs automatically. This is not the retention period." 221 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Protokolleinträge löscht (leer oder 0 = deaktiviert, 1–365 Tage). Action Scheduler bereinigt Protokolle nicht automatisch. Das ist nicht die Aufbewahrungsfrist." 222 223 msgid "This plugin only: time of day for its log cleanup job (WordPress timezone)." 224 msgstr "Nur dieses Plugin: Tageszeit für den Protokoll-Bereinigungsjob (WordPress-Zeitzone)." 225 226 msgid "This plugin only: delete log entries older than this many days (0 = delete all logs on each cleanup run). Required." 227 msgstr "Nur dieses Plugin: Protokolleinträge löschen, die älter sind als diese Anzahl Tage (0 = bei jedem Bereinigungslauf alle Protokolle löschen). Pflichtfeld." 228 229 msgid "Actions schedule interval must be empty or between 1 and 365 days." 230 msgstr "Das Intervall für den Aktionszeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 231 232 msgid "Logs schedule interval must be empty or between 1 and 365 days." 233 msgstr "Das Intervall für den Protokollzeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 234 235 msgid "Actions schedule time must be in HH:MM format." 236 msgstr "Die Zeit für den Aktionszeitplan muss im Format HH:MM angegeben werden." 237 238 msgid "Logs schedule time must be in HH:MM format." 239 msgstr "Die Zeit für den Protokollzeitplan muss im Format HH:MM angegeben werden." 240 241 msgid "Actions retention period is required and must be between 0 and 365 days." 242 msgstr "Die Aufbewahrungsfrist für Aktionen ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 243 244 msgid "Logs retention period is required and must be between 0 and 365 days." 245 msgstr "Die Aufbewahrungsfrist für Protokolle ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 246 365 #: includes/class-wsacsc-ajax.php:411 366 msgid "Invalid cleanup ID." 367 msgstr "Ungültige Bereinigungs-ID." 368 369 #: includes/class-wsacsc-ajax.php:427 370 msgid "Cleanup progress was lost or is continuing in the background. Refresh the page to check table sizes." 371 msgstr "Der Bereinigungsfortschritt ging verloren oder die Bereinigung läuft im Hintergrund weiter. Laden Sie die Seite neu, um die Tabellengrößen zu prüfen." 372 373 #: includes/class-wsacsc-ajax.php:435 374 msgid "Invalid cleanup progress data." 375 msgstr "Ungültige Fortschrittsdaten der Bereinigung." 376 377 #: includes/class-wsacsc-ajax.php:441 378 msgid "An error occurred during cleanup." 379 msgstr "Während der Bereinigung ist ein Fehler aufgetreten." 380 381 #: includes/class-wsacsc-ajax.php:453 382 msgid "Cleanup completed successfully!" 383 msgstr "Bereinigung erfolgreich abgeschlossen!" 384 385 #. translators: %d: number of days. 386 #: includes/class-wsacsc-scheduler.php:245 387 #, php-format 388 msgid "Every %d day" 389 msgid_plural "Every %d days" 390 msgstr[0] "Jeden Tag" 391 msgstr[1] "Alle %d Tage" 392 393 #. translators: 1: rows deleted so far, 2: rows to delete in total, 3: percentage done. 394 #: includes/helpers.php:329 395 #, php-format 396 msgid "Clearing in progress… %1$s of %2$s rows deleted (%3$d%%)." 397 msgstr "Bereinigung läuft… %1$s von %2$s Zeilen gelöscht (%3$d %%)." 398 399 #. translators: %s: number of rows deleted so far. 400 #: includes/helpers.php:342 401 #, php-format 247 402 msgid "Clearing in progress… %s rows deleted so far." 248 403 msgstr "Bereinigung läuft… bisher %s Zeilen gelöscht." 249 250 msgid "Cleanup completed successfully!"251 msgstr "Bereinigung erfolgreich abgeschlossen!"252 253 msgid "Another cleanup or optimization is already running. Please wait until it finishes."254 msgstr "Eine andere Bereinigung oder Optimierung läuft bereits. Bitte warten Sie, bis sie abgeschlossen ist."255 256 msgid "An error occurred while clearing actions."257 msgstr "Beim Bereinigen der Aktionen ist ein Fehler aufgetreten."258 259 msgid "An error occurred while clearing logs."260 msgstr "Beim Bereinigen der Protokolle ist ein Fehler aufgetreten."261 262 msgid "Cleanup progress was lost or is continuing in the background. Refresh the page to check table sizes."263 msgstr "Der Bereinigungsfortschritt ging verloren oder die Bereinigung läuft im Hintergrund weiter. Laden Sie die Seite neu, um die Tabellengrößen zu prüfen."264 265 msgid "An error occurred during cleanup."266 msgstr "Während der Bereinigung ist ein Fehler aufgetreten."267 268 msgid "Retrying…"269 msgstr "Erneuter Versuch…" -
ws-action-scheduler-cleaner/trunk/languages/ws-action-scheduler-cleaner-de_AT_informal.po
r3750500 r3798362 1 # 1 2 msgid "" 2 3 msgstr "" 3 4 "Project-Id-Version: WS Action Scheduler Cleaner\n" 4 "Report-Msgid-Bugs-To: \n"5 "POT-Creation-Date: 202 4-10-10 12:00+0000\n"6 "PO-Revision-Date: 202 5-11-24 18:00+0100\n"5 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ws-action-scheduler-cleaner\n" 6 "POT-Creation-Date: 2026-11-10T20:25:22+00:00\n" 7 "PO-Revision-Date: 2026-11-10 12:00+0000\n" 7 8 "Last-Translator: Marco Brack <mbrack@winning-solutions.de>\n" 8 9 "Language-Team: \n" … … 14 15 "X-Generator: Poedit 3.8\n" 15 16 17 #. Plugin Name of the plugin 18 #: ws-action-scheduler-cleaner.php includes/class-wsacsc-admin.php:70 includes/class-wsacsc-admin.php:149 includes/class-wsacsc-admin.php:156 16 19 msgid "WS Action Scheduler Cleaner" 17 20 msgstr "WS Action Scheduler Cleaner" 18 21 22 #. Description of the plugin 23 #: ws-action-scheduler-cleaner.php 24 msgid "Suffering from database bloat? Try cleaning up the Action Scheduler tables through an easy-to-understand GUI." 25 msgstr "Leidet deine Datenbank unter aufgeblähten Tabellen? Bereinige die Action-Scheduler-Tabellen über eine leicht verständliche Oberfläche." 26 27 #. Author of the plugin 28 #: ws-action-scheduler-cleaner.php 29 msgid "Winning Solutions - Nagel & Mäder GbR" 30 msgstr "Winning Solutions - Nagel & Mäder GbR" 31 32 #. Author URI of the plugin 33 #: ws-action-scheduler-cleaner.php 34 msgid "https://www.winning-solutions.de" 35 msgstr "https://www.winning-solutions.de" 36 37 #: includes/class-wsacsc-admin.php:40 38 msgid "Settings" 39 msgstr "Einstellungen" 40 41 #: includes/class-wsacsc-admin.php:71 42 msgid "WS AS Cleaner" 43 msgstr "WS AS Cleaner" 44 45 #: includes/class-wsacsc-admin.php:118 includes/class-wsacsc-ajax.php:108 includes/class-wsacsc-ajax.php:314 46 msgid "Please select at least one status to clear." 47 msgstr "Bitte wähle mindestens einen Status zum Bereinigen aus." 48 49 #: includes/class-wsacsc-admin.php:119 includes/helpers.php:337 50 msgid "Clearing in progress..." 51 msgstr "Bereinigung läuft..." 52 53 #: includes/class-wsacsc-admin.php:120 54 msgid "Please wait..." 55 msgstr "Bitte warte..." 56 57 #: includes/class-wsacsc-admin.php:121 58 msgid "An error occurred. Please try again." 59 msgstr "Ein Fehler ist aufgetreten. Bitte versuche es erneut." 60 61 #: includes/class-wsacsc-admin.php:122 includes/class-wsacsc-ajax.php:138 62 msgid "Selected actions cleared successfully!" 63 msgstr "Ausgewählte Aktionen erfolgreich bereinigt!" 64 65 #: includes/class-wsacsc-admin.php:123 includes/class-wsacsc-ajax.php:180 includes/class-wsacsc-ajax.php:197 66 msgid "Logs cleared successfully!" 67 msgstr "Protokolle erfolgreich bereinigt!" 68 69 #: includes/class-wsacsc-admin.php:124 includes/class-wsacsc-ajax.php:295 70 msgid "Schedule saved successfully!" 71 msgstr "Zeitplan erfolgreich gespeichert!" 72 73 #: includes/class-wsacsc-admin.php:125 includes/class-wsacsc-ajax.php:319 74 msgid "Statuses saved successfully!" 75 msgstr "Status erfolgreich gespeichert!" 76 77 #: includes/class-wsacsc-admin.php:126 78 msgid "Optimizing table..." 79 msgstr "Tabelle wird optimiert..." 80 81 #: includes/class-wsacsc-admin.php:127 includes/class-wsacsc-admin.php:189 includes/class-wsacsc-admin.php:191 includes/class-wsacsc-admin.php:197 includes/class-wsacsc-admin.php:199 82 msgid "Loading..." 83 msgstr "Wird geladen..." 84 85 #: includes/class-wsacsc-admin.php:128 includes/class-wsacsc-ajax.php:382 86 msgid "Table optimization failed." 87 msgstr "Tabellenoptimierung fehlgeschlagen." 88 89 #: includes/class-wsacsc-admin.php:129 90 msgid "Please fix the highlighted fields before saving." 91 msgstr "Bitte korrigiere die markierten Felder vor dem Speichern." 92 93 #: includes/class-wsacsc-admin.php:130 includes/class-wsacsc-admin.php:192 94 msgid "Refresh actions table size" 95 msgstr "Größe der Aktionstabelle aktualisieren" 96 97 #: includes/class-wsacsc-admin.php:131 includes/class-wsacsc-admin.php:200 98 msgid "Refresh logs table size" 99 msgstr "Größe der Protokolltabelle aktualisieren" 100 101 #: includes/class-wsacsc-admin.php:132 102 msgid "Retrying…" 103 msgstr "Erneuter Versuch…" 104 105 #: includes/class-wsacsc-admin.php:150 106 msgid "Action Scheduler tables do not exist. Please ensure Action Scheduler is properly installed and activated." 107 msgstr "Die Action-Scheduler-Tabellen existieren nicht. Bitte stelle sicher, dass Action Scheduler ordnungsgemäß installiert und aktiviert ist." 108 109 #: includes/class-wsacsc-admin.php:159 19 110 msgid "This tool allows you to clean up the Action Scheduler tables in your WordPress database. Action Scheduler is a library used by many plugins to schedule background tasks." 20 111 msgstr "Dieses Tool ermöglicht es dir, die Action Scheduler-Tabellen in deiner WordPress-Datenbank zu bereinigen. Action Scheduler ist eine Bibliothek, die von vielen Plugins zur Planung von Hintergrundaufgaben verwendet wird." 21 112 22 msgid "Please wait..." 23 msgstr "Bitte warte..." 24 25 msgid "Loading..." 26 msgstr "Wird geladen..." 27 113 #: includes/class-wsacsc-admin.php:160 28 114 msgid "The Action Scheduler uses two main tables:" 29 115 msgstr "Der Action Scheduler verwendet zwei Haupttabellen:" 30 116 117 #: includes/class-wsacsc-admin.php:162 31 118 msgid "Actions Table: Stores scheduled actions and their statuses." 32 119 msgstr "Aktionstabelle: Speichert geplante Aktionen und deren Status." 33 120 121 #: includes/class-wsacsc-admin.php:163 34 122 msgid "Logs Table: Stores logs of action executions." 35 123 msgstr "Protokolltabelle: Speichert Protokolle von Aktionsausführungen." 36 124 125 #: includes/class-wsacsc-admin.php:165 37 126 msgid "Clearing these tables is generally safe and can improve database performance. However, please note:" 38 127 msgstr "Das Bereinigen dieser Tabellen ist im Allgemeinen sicher und kann die Datenbankleistung verbessern. Bitte beachte jedoch:" 39 128 129 #: includes/class-wsacsc-admin.php:167 40 130 msgid "Clearing can take a while depending on the size of the tables." 41 131 msgstr "Die Bereinigung kann je nach Größe der Tabellen eine Weile dauern." 42 132 133 #: includes/class-wsacsc-admin.php:168 43 134 msgid "Cleared data will be permanently deleted." 44 135 msgstr "Bereinigte Daten werden dauerhaft gelöscht." 45 136 137 #: includes/class-wsacsc-admin.php:169 46 138 msgid "It's recommended to <strong>make a backup</strong> before proceeding." 47 139 msgstr "Es wird empfohlen, vor dem Fortfahren ein <strong>Backup zu erstellen</strong>." 48 140 141 #: includes/class-wsacsc-admin.php:170 49 142 msgid "Clearing completed, failed, or canceled actions usually doesn't affect WordPress functionality." 50 143 msgstr "Das Bereinigen von abgeschlossenen, fehlgeschlagenen oder abgebrochenen Aktionen beeinträchtigt normalerweise nicht die WordPress-Funktionalität." 51 144 145 #. translators: %s: URL to Action Scheduler admin page 146 #: includes/class-wsacsc-admin.php:177 147 #, php-format 52 148 msgid "For more information, visit the <a href=\"%s\">Action Scheduler admin page</a>." 53 149 msgstr "Weitere Informationen findest du auf der <a href=\"%s\">Action Scheduler-Administrationsseite</a>." 54 150 151 #: includes/class-wsacsc-admin.php:186 55 152 msgid "Current Table Sizes:" 56 153 msgstr "Aktuelle Tabellengrößen:" 57 154 155 #: includes/class-wsacsc-admin.php:188 58 156 msgid "Actions table:" 59 157 msgstr "Aktionstabelle:" 60 158 159 #: includes/class-wsacsc-admin.php:190 includes/class-wsacsc-admin.php:198 61 160 msgid "rows" 62 161 msgstr "Zeilen" 63 162 163 #: includes/class-wsacsc-admin.php:196 64 164 msgid "Logs table:" 65 165 msgstr "Protokolltabelle:" 66 166 167 #: includes/class-wsacsc-admin.php:207 67 168 msgid "Clear Action Statuses" 68 169 msgstr "Aktionsstatus bereinigen" 69 170 70 msgid "Select which action statuses to clear:" 71 msgstr "Wähle aus, welche Aktionsstatus bereinigt werden sollen:" 72 171 #: includes/class-wsacsc-admin.php:209 172 msgid "Action statuses to clear" 173 msgstr "Zu bereinigende Aktionsstatus" 174 175 #: includes/class-wsacsc-admin.php:210 73 176 msgid "Select which statuses to remove when clearing manually, when this plugin runs scheduled action cleanup, and (if this plugin’s action cleanup schedule is disabled) which statuses Action Scheduler may delete in the background:" 74 177 msgstr "Wähle aus, welche Status bei manueller Bereinigung, bei der geplanten Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) bei der Hintergrundbereinigung von Action Scheduler entfernt werden sollen:" 75 178 179 #: includes/class-wsacsc-admin.php:217 76 180 msgid "Complete" 77 181 msgstr "Abgeschlossen" 78 182 183 #: includes/class-wsacsc-admin.php:218 79 184 msgid "Failed" 80 185 msgstr "Fehlgeschlagen" 81 186 187 #: includes/class-wsacsc-admin.php:219 82 188 msgid "Canceled" 83 189 msgstr "Abgebrochen" 84 190 191 #: includes/class-wsacsc-admin.php:221 85 192 msgid "Clear Selected Actions" 86 193 msgstr "Ausgewählte Aktionen bereinigen" 87 194 195 #: includes/class-wsacsc-admin.php:226 88 196 msgid "Clear Logs Table" 89 197 msgstr "Protokolltabelle bereinigen" 90 198 199 #: includes/class-wsacsc-admin.php:227 91 200 msgid "This will clear all entries in the logs table." 92 201 msgstr "Dies wird alle Einträge in der Protokolltabelle löschen." 93 202 203 #: includes/class-wsacsc-admin.php:228 94 204 msgid "Clear Logs" 95 205 msgstr "Protokolle bereinigen" 96 206 207 #: includes/class-wsacsc-admin.php:232 208 msgid "Optimize Tables" 209 msgstr "Tabellen optimieren" 210 211 #: includes/class-wsacsc-admin.php:233 212 msgid "Optimize the database tables to reclaim unused space and potentially improve performance." 213 msgstr "Optimiere die Datenbanktabellen, um ungenutzten Speicherplatz freizugeben und möglicherweise die Leistung zu verbessern." 214 215 #: includes/class-wsacsc-admin.php:235 216 msgid "Optimize Actions Table" 217 msgstr "Aktionstabelle optimieren" 218 219 #: includes/class-wsacsc-admin.php:236 220 msgid "Optimize Logs Table" 221 msgstr "Protokolltabelle optimieren" 222 223 #: includes/class-wsacsc-admin.php:241 97 224 msgid "Scheduling Options" 98 225 msgstr "Planungsoptionen" 99 226 100 msgid "Set up automatic clearing schedules for selected statuses (set to 0 to clean fully; leave empty to disable automatic clearing):" 101 msgstr "Richte automatische Bereinigungspläne für ausgewählte Status ein (auf 0 setzen, um vollständig zu bereinigen; leer lassen, um die automatische Bereinigung zu deaktivieren):" 102 103 msgid "Clear logs older than:" 104 msgstr "Protokolle bereinigen, die älter sind als:" 105 227 #: includes/class-wsacsc-admin.php:242 228 msgid "Finished actions can be removed automatically in two ways: this plugin’s scheduled cleanup (settings below) and Action Scheduler’s own built-in background cleanup for the actions table. The status checkboxes in “Clear Action Statuses” above define which statuses are affected—manual clearing, this plugin’s scheduled action cleanup, and (when this plugin’s action cleanup schedule is disabled) Action Scheduler’s background deletions." 229 msgstr "Abgeschlossene Aktionen können auf zwei Arten automatisch entfernt werden: über die geplante Bereinigung dieses Plugins (Einstellungen unten) und über die eingebaute Hintergrundbereinigung von Action Scheduler für die Aktionstabelle. Die Status-Kontrollkästchen unter „Aktionsstatus bereinigen“ legen fest, welche Status betroffen sind – manuelle Bereinigung, die geplante Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) die Hintergrundlöschungen von Action Scheduler." 230 231 #: includes/class-wsacsc-admin.php:243 232 msgid "Cleanup schedule and retention period are separate. Cleanup schedule controls how often this plugin runs its own WordPress cron jobs (1–365 days, or empty/0 to disable). Retention period controls how old entries must be before they are deleted. For actions, age is measured by completion or last attempt time—not the original scheduled date." 233 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist sind getrennte Einstellungen. Der Bereinigungszeitplan legt fest, wie oft dieses Plugin seine eigenen WordPress-Cronjobs ausführt (1–365 Tage, oder leer/0 zum Deaktivieren). Die Aufbewahrungsfrist legt fest, wie alt Einträge sein müssen, bevor sie gelöscht werden. Bei Aktionen wird das Alter am Abschluss- oder letzten Ausführungszeitpunkt gemessen – nicht am ursprünglichen Planungsdatum." 234 235 #: includes/class-wsacsc-admin.php:244 236 msgid "If an actions cleanup schedule is enabled, only this plugin’s cron job deletes old actions (using the selected statuses above); Action Scheduler’s built-in action cleanup is turned off to avoid duplicate deletions. If that schedule is disabled, this plugin does not run scheduled action cleanup—the actions retention period is passed to Action Scheduler instead, which deletes actions in the selected statuses when they are older than that many days." 237 msgstr "Ist ein Bereinigungszeitplan für Aktionen aktiviert, löscht nur der Cronjob dieses Plugins alte Aktionen (mit den oben gewählten Status); die eingebaute Aktionsbereinigung von Action Scheduler wird deaktiviert, um doppelte Löschungen zu vermeiden. Ist dieser Zeitplan deaktiviert, führt dieses Plugin keine geplante Aktionsbereinigung aus – die Aufbewahrungsfrist für Aktionen wird stattdessen an Action Scheduler übergeben, das Aktionen in den gewählten Status löscht, wenn sie älter als die angegebene Anzahl Tage sind." 238 239 #: includes/class-wsacsc-admin.php:245 240 msgid "Logs cleanup schedule and logs retention apply only to this plugin; Action Scheduler does not clean the logs table on its own." 241 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist für Protokolle gelten nur für dieses Plugin; Action Scheduler bereinigt die Protokolltabelle nicht von sich aus." 242 243 #: includes/class-wsacsc-admin.php:246 244 msgid "This plugin does not hide status filters on the Action Scheduler admin screen. Tabs such as Complete or Failed only appear when actions with those statuses exist in the database. On sites with a very large pending backlog, few actions may finish; if counts stay at zero, those tabs will not show." 245 msgstr "Dieses Plugin blendet keine Statusfilter auf der Action-Scheduler-Verwaltungsseite aus. Registerkarten wie „Abgeschlossen“ oder „Fehlgeschlagen“ erscheinen nur, wenn Aktionen mit diesen Status in der Datenbank existieren. Bei sehr großem Pending-Rückstau werden wenige Aktionen abgeschlossen; bleiben die Zähler bei null, werden diese Registerkarten nicht angezeigt." 246 247 #: includes/class-wsacsc-admin.php:249 248 msgid "Action Statuses" 249 msgstr "Aktionsstatus" 250 251 #: includes/class-wsacsc-admin.php:251 includes/class-wsacsc-admin.php:277 252 msgid "Cleanup Schedule:" 253 msgstr "Bereinigungszeitplan:" 254 255 #: includes/class-wsacsc-admin.php:254 includes/class-wsacsc-admin.php:269 includes/class-wsacsc-admin.php:280 includes/class-wsacsc-admin.php:295 106 256 msgid "days" 107 257 msgstr "Tage" 108 258 109 msgid "Clear action statuses older than:" 110 msgstr "Aktionsstatus bereinigen, die älter sind als:" 111 259 #: includes/class-wsacsc-admin.php:256 260 msgid "This plugin only: how often its WordPress cron job deletes old actions (empty or 0 = disabled, 1–365 days). When enabled, Action Scheduler’s built-in action cleanup is disabled. This is not the retention period." 261 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Aktionen löscht (leer oder 0 = deaktiviert, 1–365 Tage). Wenn aktiviert, ist die eingebaute Aktionsbereinigung von Action Scheduler deaktiviert. Das ist nicht die Aufbewahrungsfrist." 262 263 #: includes/class-wsacsc-admin.php:259 includes/class-wsacsc-admin.php:285 264 msgid "Schedule Time:" 265 msgstr "Zeitplan:" 266 267 #: includes/class-wsacsc-admin.php:263 268 msgid "This plugin only: time of day for its action cleanup job (WordPress timezone)." 269 msgstr "Nur dieses Plugin: Tageszeit für den Aktions-Bereinigungsjob (WordPress-Zeitzone)." 270 271 #: includes/class-wsacsc-admin.php:266 includes/class-wsacsc-admin.php:292 272 msgid "Retention Period:" 273 msgstr "Aufbewahrungsfrist:" 274 275 #: includes/class-wsacsc-admin.php:271 276 msgid "How long to keep actions before deletion (by completion or last attempt time, not scheduled date), for the statuses selected above. With a plugin action cleanup schedule enabled: used only by this plugin’s cron job. With that schedule disabled: passed to Action Scheduler’s background cleanup for the same selected statuses. 0 = delete all matching actions on every cleanup run. Required." 277 msgstr "Wie lange Aktionen vor dem Löschen aufbewahrt werden (Abschluss- oder letzter Ausführungszeitpunkt, nicht Planungsdatum), für die oben gewählten Status. Mit aktiviertem Aktions-Bereinigungszeitplan: nur für den Cronjob dieses Plugins. Ohne diesen Zeitplan: wird an die Hintergrundbereinigung von Action Scheduler für dieselben Status übergeben. 0 = bei jedem Bereinigungslauf alle passenden Aktionen löschen. Pflichtfeld." 278 279 #: includes/class-wsacsc-admin.php:275 280 msgid "Logs" 281 msgstr "Protokolle" 282 283 #: includes/class-wsacsc-admin.php:282 284 msgid "This plugin only: how often its WordPress cron job deletes old log entries (empty or 0 = disabled, 1–365 days). Action Scheduler does not clean logs automatically. This is not the retention period." 285 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Protokolleinträge löscht (leer oder 0 = deaktiviert, 1–365 Tage). Action Scheduler bereinigt Protokolle nicht automatisch. Das ist nicht die Aufbewahrungsfrist." 286 287 #: includes/class-wsacsc-admin.php:289 288 msgid "This plugin only: time of day for its log cleanup job (WordPress timezone)." 289 msgstr "Nur dieses Plugin: Tageszeit für den Protokoll-Bereinigungsjob (WordPress-Zeitzone)." 290 291 #: includes/class-wsacsc-admin.php:297 292 msgid "This plugin only: delete log entries older than this many days (0 = delete all logs on each cleanup run). Required." 293 msgstr "Nur dieses Plugin: Protokolleinträge löschen, die älter sind als diese Anzahl Tage (0 = bei jedem Bereinigungslauf alle Protokolle löschen). Pflichtfeld." 294 295 #: includes/class-wsacsc-admin.php:301 112 296 msgid "Save Schedule" 113 297 msgstr "Zeitplan speichern" 114 298 299 #: includes/class-wsacsc-admin.php:307 115 300 msgid "Powered by Winning Solutions" 116 301 msgstr "Powered by Winning Solutions" 117 302 118 msgid "Selected actions cleared successfully!" 119 msgstr "Ausgewählte Aktionen erfolgreich bereinigt!" 120 121 msgid "Logs cleared successfully!" 122 msgstr "Protokolle erfolgreich bereinigt!" 123 124 msgid "Schedule saved successfully!" 125 msgstr "Zeitplan erfolgreich gespeichert!" 126 303 #: includes/class-wsacsc-ajax.php:37 304 msgid "Another cleanup or optimization is already running. Please wait until it finishes." 305 msgstr "Eine andere Bereinigung oder Optimierung läuft bereits. Bitte warte, bis sie abgeschlossen ist." 306 307 #: includes/class-wsacsc-ajax.php:81 includes/class-wsacsc-ajax.php:96 includes/class-wsacsc-ajax.php:150 includes/class-wsacsc-ajax.php:209 includes/class-wsacsc-ajax.php:305 includes/class-wsacsc-ajax.php:329 includes/class-wsacsc-ajax.php:356 includes/class-wsacsc-ajax.php:404 308 msgid "Insufficient permissions." 309 msgstr "Unzureichende Berechtigungen." 310 311 #: includes/class-wsacsc-ajax.php:112 includes/class-wsacsc-ajax.php:156 312 msgid "Action Scheduler tables do not exist." 313 msgstr "Die Action-Scheduler-Tabellen existieren nicht." 314 315 #: includes/class-wsacsc-ajax.php:131 316 msgid "An error occurred while clearing actions." 317 msgstr "Beim Bereinigen der Aktionen ist ein Fehler aufgetreten." 318 319 #: includes/class-wsacsc-ajax.php:190 320 msgid "An error occurred while clearing logs." 321 msgstr "Beim Bereinigen der Protokolle ist ein Fehler aufgetreten." 322 323 #: includes/class-wsacsc-ajax.php:230 324 msgid "Actions schedule interval must be empty or between 1 and 365 days." 325 msgstr "Das Intervall für den Aktionszeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 326 327 #: includes/class-wsacsc-ajax.php:234 328 msgid "Logs schedule interval must be empty or between 1 and 365 days." 329 msgstr "Das Intervall für den Protokollzeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 330 331 #: includes/class-wsacsc-ajax.php:238 332 msgid "Actions schedule time must be in HH:MM format." 333 msgstr "Die Zeit für den Aktionszeitplan muss im Format HH:MM angegeben werden." 334 335 #: includes/class-wsacsc-ajax.php:242 336 msgid "Logs schedule time must be in HH:MM format." 337 msgstr "Die Zeit für den Protokollzeitplan muss im Format HH:MM angegeben werden." 338 339 #: includes/class-wsacsc-ajax.php:246 340 msgid "Actions retention period is required and must be between 0 and 365 days." 341 msgstr "Die Aufbewahrungsfrist für Aktionen ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 342 343 #: includes/class-wsacsc-ajax.php:250 344 msgid "Logs retention period is required and must be between 0 and 365 days." 345 msgstr "Die Aufbewahrungsfrist für Protokolle ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 346 347 #: includes/class-wsacsc-ajax.php:288 348 msgid "Failed to save schedule. Please try again." 349 msgstr "Der Zeitplan konnte nicht gespeichert werden. Bitte versuche es erneut." 350 351 #: includes/class-wsacsc-ajax.php:292 127 352 msgid "The settings were saved, but the cleanup schedule could not be updated yet. The plugin will retry automatically." 128 353 msgstr "Die Einstellungen wurden gespeichert, aber der Bereinigungszeitplan konnte noch nicht aktualisiert werden. Das Plugin versucht es automatisch erneut." 129 354 130 msgid "Statuses saved successfully!" 131 msgstr "Status erfolgreich gespeichert!" 132 133 msgid "Settings" 134 msgstr "Einstellungen" 135 136 msgid "Action Scheduler tables do not exist. Please ensure Action Scheduler is properly installed and activated." 137 msgstr "Die Action-Scheduler-Tabellen existieren nicht. Bitte stelle sicher, dass Action Scheduler ordnungsgemäß installiert und aktiviert ist." 138 139 msgid "Please select at least one status to clear." 140 msgstr "Bitte wähle mindestens einen Status zum Bereinigen aus." 141 142 msgid "Clearing in progress..." 143 msgstr "Bereinigung läuft..." 144 145 msgid "An error occurred. Please try again." 146 msgstr "Ein Fehler ist aufgetreten. Bitte versuche es erneut." 147 148 msgid "Optimize Tables" 149 msgstr "Tabellen optimieren" 150 151 msgid "Optimize the database tables to reclaim unused space and potentially improve performance." 152 msgstr "Optimiere die Datenbanktabellen, um ungenutzten Speicherplatz freizugeben und möglicherweise die Leistung zu verbessern." 153 154 msgid "Optimize Actions Table" 155 msgstr "Aktionstabelle optimieren" 156 157 msgid "Optimize Logs Table" 158 msgstr "Protokolltabelle optimieren" 159 160 msgid "Optimizing table..." 161 msgstr "Tabelle wird optimiert..." 162 355 #: includes/class-wsacsc-ajax.php:336 includes/class-wsacsc-ajax.php:363 356 msgid "Invalid table type." 357 msgstr "Ungültiger Tabellentyp." 358 359 #. translators: %s: table type (actions or logs). 360 #: includes/class-wsacsc-ajax.php:390 361 #, php-format 163 362 msgid "%s table optimized successfully!" 164 363 msgstr "%s-Tabelle erfolgreich optimiert!" 165 364 166 msgid "Table optimization failed." 167 msgstr "Tabellenoptimierung fehlgeschlagen." 168 169 msgid "Table does not exist." 170 msgstr "Tabelle existiert nicht." 171 172 msgid "Invalid table type." 173 msgstr "Ungültiger Tabellentyp." 174 175 msgid "Insufficient permissions." 176 msgstr "Unzureichende Berechtigungen." 177 178 msgid "Finished actions can be removed automatically in two ways: this plugin’s scheduled cleanup (settings below) and Action Scheduler’s own built-in background cleanup for the actions table. The status checkboxes in “Clear Action Statuses” above define which statuses are affected—manual clearing, this plugin’s scheduled action cleanup, and (when this plugin’s action cleanup schedule is disabled) Action Scheduler’s background deletions." 179 msgstr "Abgeschlossene Aktionen können auf zwei Arten automatisch entfernt werden: über die geplante Bereinigung dieses Plugins (Einstellungen unten) und über die eingebaute Hintergrundbereinigung von Action Scheduler für die Aktionstabelle. Die Status-Kontrollkästchen unter „Aktionsstatus bereinigen“ legen fest, welche Status betroffen sind – manuelle Bereinigung, die geplante Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) die Hintergrundlöschungen von Action Scheduler." 180 181 msgid "Cleanup schedule and retention period are separate. Cleanup schedule controls how often this plugin runs its own WordPress cron jobs (1–365 days, or empty/0 to disable). Retention period controls how old entries must be before they are deleted. For actions, age is measured by completion or last attempt time—not the original scheduled date." 182 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist sind getrennte Einstellungen. Der Bereinigungszeitplan legt fest, wie oft dieses Plugin seine eigenen WordPress-Cronjobs ausführt (1–365 Tage, oder leer/0 zum Deaktivieren). Die Aufbewahrungsfrist legt fest, wie alt Einträge sein müssen, bevor sie gelöscht werden. Bei Aktionen wird das Alter am Abschluss- oder letzten Ausführungszeitpunkt gemessen – nicht am ursprünglichen Planungsdatum." 183 184 msgid "If an actions cleanup schedule is enabled, only this plugin’s cron job deletes old actions (using the selected statuses above); Action Scheduler’s built-in action cleanup is turned off to avoid duplicate deletions. If that schedule is disabled, this plugin does not run scheduled action cleanup—the actions retention period is passed to Action Scheduler instead, which deletes actions in the selected statuses when they are older than that many days." 185 msgstr "Ist ein Bereinigungszeitplan für Aktionen aktiviert, löscht nur der Cronjob dieses Plugins alte Aktionen (mit den oben gewählten Status); die eingebaute Aktionsbereinigung von Action Scheduler wird deaktiviert, um doppelte Löschungen zu vermeiden. Ist dieser Zeitplan deaktiviert, führt dieses Plugin keine geplante Aktionsbereinigung aus – die Aufbewahrungsfrist für Aktionen wird stattdessen an Action Scheduler übergeben, das Aktionen in den gewählten Status löscht, wenn sie älter als die angegebene Anzahl Tage sind." 186 187 msgid "Logs cleanup schedule and logs retention apply only to this plugin; Action Scheduler does not clean the logs table on its own." 188 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist für Protokolle gelten nur für dieses Plugin; Action Scheduler bereinigt die Protokolltabelle nicht von sich aus." 189 190 msgid "This plugin does not hide status filters on the Action Scheduler admin screen. Tabs such as Complete or Failed only appear when actions with those statuses exist in the database. On sites with a very large pending backlog, few actions may finish; if counts stay at zero, those tabs will not show." 191 msgstr "Dieses Plugin blendet keine Statusfilter auf der Action-Scheduler-Verwaltungsseite aus. Registerkarten wie „Abgeschlossen“ oder „Fehlgeschlagen“ erscheinen nur, wenn Aktionen mit diesen Status in der Datenbank existieren. Bei sehr großem Pending-Rückstau werden wenige Aktionen abgeschlossen; bleiben die Zähler bei null, werden diese Registerkarten nicht angezeigt." 192 193 msgid "Action Statuses" 194 msgstr "Aktionsstatus" 195 196 msgid "Cleanup Schedule:" 197 msgstr "Bereinigungszeitplan:" 198 199 msgid "This plugin only: how often its WordPress cron job deletes old actions (empty or 0 = disabled, 1–365 days). When enabled, Action Scheduler’s built-in action cleanup is disabled. This is not the retention period." 200 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Aktionen löscht (leer oder 0 = deaktiviert, 1–365 Tage). Wenn aktiviert, ist die eingebaute Aktionsbereinigung von Action Scheduler deaktiviert. Das ist nicht die Aufbewahrungsfrist." 201 202 msgid "Schedule Time:" 203 msgstr "Zeitplan:" 204 205 msgid "This plugin only: time of day for its action cleanup job (WordPress timezone)." 206 msgstr "Nur dieses Plugin: Tageszeit für den Aktions-Bereinigungsjob (WordPress-Zeitzone)." 207 208 msgid "Retention Period:" 209 msgstr "Aufbewahrungsfrist:" 210 211 msgid "How long to keep actions before deletion (by completion or last attempt time, not scheduled date), for the statuses selected above. With a plugin action cleanup schedule enabled: used only by this plugin’s cron job. With that schedule disabled: passed to Action Scheduler’s background cleanup for the same selected statuses. 0 = delete all matching actions on every cleanup run. Required." 212 msgstr "Wie lange Aktionen vor dem Löschen aufbewahrt werden (Abschluss- oder letzter Ausführungszeitpunkt, nicht Planungsdatum), für die oben gewählten Status. Mit aktiviertem Aktions-Bereinigungszeitplan: nur für den Cronjob dieses Plugins. Ohne diesen Zeitplan: wird an die Hintergrundbereinigung von Action Scheduler für dieselben Status übergeben. 0 = bei jedem Bereinigungslauf alle passenden Aktionen löschen. Pflichtfeld." 213 214 msgid "Logs" 215 msgstr "Protokolle" 216 217 msgid "How often to run cleanup (empty or 0 = disabled, 1-365 days)." 218 msgstr "Wie oft die Bereinigung ausgeführt wird (leer oder 0 = deaktiviert, 1–365 Tage)." 219 220 msgid "This plugin only: how often its WordPress cron job deletes old log entries (empty or 0 = disabled, 1–365 days). Action Scheduler does not clean logs automatically. This is not the retention period." 221 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Protokolleinträge löscht (leer oder 0 = deaktiviert, 1–365 Tage). Action Scheduler bereinigt Protokolle nicht automatisch. Das ist nicht die Aufbewahrungsfrist." 222 223 msgid "This plugin only: time of day for its log cleanup job (WordPress timezone)." 224 msgstr "Nur dieses Plugin: Tageszeit für den Protokoll-Bereinigungsjob (WordPress-Zeitzone)." 225 226 msgid "This plugin only: delete log entries older than this many days (0 = delete all logs on each cleanup run). Required." 227 msgstr "Nur dieses Plugin: Protokolleinträge löschen, die älter sind als diese Anzahl Tage (0 = bei jedem Bereinigungslauf alle Protokolle löschen). Pflichtfeld." 228 229 msgid "Actions schedule interval must be empty or between 1 and 365 days." 230 msgstr "Das Intervall für den Aktionszeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 231 232 msgid "Logs schedule interval must be empty or between 1 and 365 days." 233 msgstr "Das Intervall für den Protokollzeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 234 235 msgid "Actions schedule time must be in HH:MM format." 236 msgstr "Die Zeit für den Aktionszeitplan muss im Format HH:MM angegeben werden." 237 238 msgid "Logs schedule time must be in HH:MM format." 239 msgstr "Die Zeit für den Protokollzeitplan muss im Format HH:MM angegeben werden." 240 241 msgid "Actions retention period is required and must be between 0 and 365 days." 242 msgstr "Die Aufbewahrungsfrist für Aktionen ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 243 244 msgid "Logs retention period is required and must be between 0 and 365 days." 245 msgstr "Die Aufbewahrungsfrist für Protokolle ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 246 365 #: includes/class-wsacsc-ajax.php:411 366 msgid "Invalid cleanup ID." 367 msgstr "Ungültige Bereinigungs-ID." 368 369 #: includes/class-wsacsc-ajax.php:427 370 msgid "Cleanup progress was lost or is continuing in the background. Refresh the page to check table sizes." 371 msgstr "Der Bereinigungsfortschritt ging verloren oder die Bereinigung läuft im Hintergrund weiter. Lade die Seite neu, um die Tabellengrößen zu prüfen." 372 373 #: includes/class-wsacsc-ajax.php:435 374 msgid "Invalid cleanup progress data." 375 msgstr "Ungültige Fortschrittsdaten der Bereinigung." 376 377 #: includes/class-wsacsc-ajax.php:441 378 msgid "An error occurred during cleanup." 379 msgstr "Während der Bereinigung ist ein Fehler aufgetreten." 380 381 #: includes/class-wsacsc-ajax.php:453 382 msgid "Cleanup completed successfully!" 383 msgstr "Bereinigung erfolgreich abgeschlossen!" 384 385 #. translators: %d: number of days. 386 #: includes/class-wsacsc-scheduler.php:245 387 #, php-format 388 msgid "Every %d day" 389 msgid_plural "Every %d days" 390 msgstr[0] "Jeden Tag" 391 msgstr[1] "Alle %d Tage" 392 393 #. translators: 1: rows deleted so far, 2: rows to delete in total, 3: percentage done. 394 #: includes/helpers.php:329 395 #, php-format 396 msgid "Clearing in progress… %1$s of %2$s rows deleted (%3$d%%)." 397 msgstr "Bereinigung läuft… %1$s von %2$s Zeilen gelöscht (%3$d %%)." 398 399 #. translators: %s: number of rows deleted so far. 400 #: includes/helpers.php:342 401 #, php-format 247 402 msgid "Clearing in progress… %s rows deleted so far." 248 403 msgstr "Bereinigung läuft… bisher %s Zeilen gelöscht." 249 250 msgid "Cleanup completed successfully!"251 msgstr "Bereinigung erfolgreich abgeschlossen!"252 253 msgid "Another cleanup or optimization is already running. Please wait until it finishes."254 msgstr "Eine andere Bereinigung oder Optimierung läuft bereits. Bitte warte, bis sie abgeschlossen ist."255 256 msgid "An error occurred while clearing actions."257 msgstr "Beim Bereinigen der Aktionen ist ein Fehler aufgetreten."258 259 msgid "An error occurred while clearing logs."260 msgstr "Beim Bereinigen der Protokolle ist ein Fehler aufgetreten."261 262 msgid "Cleanup progress was lost or is continuing in the background. Refresh the page to check table sizes."263 msgstr "Der Bereinigungsfortschritt ging verloren oder die Bereinigung läuft im Hintergrund weiter. Lade die Seite neu, um die Tabellengrößen zu prüfen."264 265 msgid "An error occurred during cleanup."266 msgstr "Während der Bereinigung ist ein Fehler aufgetreten."267 268 msgid "Retrying…"269 msgstr "Erneuter Versuch…" -
ws-action-scheduler-cleaner/trunk/languages/ws-action-scheduler-cleaner-de_CH.po
r3750500 r3798362 1 # 1 2 msgid "" 2 3 msgstr "" 3 4 "Project-Id-Version: WS Action Scheduler Cleaner\n" 4 "Report-Msgid-Bugs-To: \n"5 "POT-Creation-Date: 202 4-10-10 12:00+0000\n"6 "PO-Revision-Date: 202 5-11-24 18:00+0100\n"5 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ws-action-scheduler-cleaner\n" 6 "POT-Creation-Date: 2026-11-10T20:25:22+00:00\n" 7 "PO-Revision-Date: 2026-11-10 12:00+0000\n" 7 8 "Last-Translator: Marco Brack <mbrack@winning-solutions.de>\n" 8 9 "Language-Team: \n" … … 14 15 "X-Generator: Poedit 3.8\n" 15 16 17 #. Plugin Name of the plugin 18 #: ws-action-scheduler-cleaner.php includes/class-wsacsc-admin.php:70 includes/class-wsacsc-admin.php:149 includes/class-wsacsc-admin.php:156 16 19 msgid "WS Action Scheduler Cleaner" 17 20 msgstr "WS Action Scheduler Cleaner" 18 21 22 #. Description of the plugin 23 #: ws-action-scheduler-cleaner.php 24 msgid "Suffering from database bloat? Try cleaning up the Action Scheduler tables through an easy-to-understand GUI." 25 msgstr "Leidet Ihre Datenbank unter aufgeblähten Tabellen? Bereinigen Sie die Action-Scheduler-Tabellen über eine leicht verständliche Oberfläche." 26 27 #. Author of the plugin 28 #: ws-action-scheduler-cleaner.php 29 msgid "Winning Solutions - Nagel & Mäder GbR" 30 msgstr "Winning Solutions - Nagel & Mäder GbR" 31 32 #. Author URI of the plugin 33 #: ws-action-scheduler-cleaner.php 34 msgid "https://www.winning-solutions.de" 35 msgstr "https://www.winning-solutions.de" 36 37 #: includes/class-wsacsc-admin.php:40 38 msgid "Settings" 39 msgstr "Einstellungen" 40 41 #: includes/class-wsacsc-admin.php:71 42 msgid "WS AS Cleaner" 43 msgstr "WS AS Cleaner" 44 45 #: includes/class-wsacsc-admin.php:118 includes/class-wsacsc-ajax.php:108 includes/class-wsacsc-ajax.php:314 46 msgid "Please select at least one status to clear." 47 msgstr "Bitte wählen Sie mindestens einen Status zum Bereinigen aus." 48 49 #: includes/class-wsacsc-admin.php:119 includes/helpers.php:337 50 msgid "Clearing in progress..." 51 msgstr "Bereinigung läuft..." 52 53 #: includes/class-wsacsc-admin.php:120 54 msgid "Please wait..." 55 msgstr "Bitte warten Sie..." 56 57 #: includes/class-wsacsc-admin.php:121 58 msgid "An error occurred. Please try again." 59 msgstr "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut." 60 61 #: includes/class-wsacsc-admin.php:122 includes/class-wsacsc-ajax.php:138 62 msgid "Selected actions cleared successfully!" 63 msgstr "Ausgewählte Aktionen erfolgreich bereinigt!" 64 65 #: includes/class-wsacsc-admin.php:123 includes/class-wsacsc-ajax.php:180 includes/class-wsacsc-ajax.php:197 66 msgid "Logs cleared successfully!" 67 msgstr "Protokolle erfolgreich bereinigt!" 68 69 #: includes/class-wsacsc-admin.php:124 includes/class-wsacsc-ajax.php:295 70 msgid "Schedule saved successfully!" 71 msgstr "Zeitplan erfolgreich gespeichert!" 72 73 #: includes/class-wsacsc-admin.php:125 includes/class-wsacsc-ajax.php:319 74 msgid "Statuses saved successfully!" 75 msgstr "Status erfolgreich gespeichert!" 76 77 #: includes/class-wsacsc-admin.php:126 78 msgid "Optimizing table..." 79 msgstr "Tabelle wird optimiert..." 80 81 #: includes/class-wsacsc-admin.php:127 includes/class-wsacsc-admin.php:189 includes/class-wsacsc-admin.php:191 includes/class-wsacsc-admin.php:197 includes/class-wsacsc-admin.php:199 82 msgid "Loading..." 83 msgstr "Wird geladen..." 84 85 #: includes/class-wsacsc-admin.php:128 includes/class-wsacsc-ajax.php:382 86 msgid "Table optimization failed." 87 msgstr "Tabellenoptimierung fehlgeschlagen." 88 89 #: includes/class-wsacsc-admin.php:129 90 msgid "Please fix the highlighted fields before saving." 91 msgstr "Bitte korrigieren Sie die markierten Felder vor dem Speichern." 92 93 #: includes/class-wsacsc-admin.php:130 includes/class-wsacsc-admin.php:192 94 msgid "Refresh actions table size" 95 msgstr "Grösse der Aktionstabelle aktualisieren" 96 97 #: includes/class-wsacsc-admin.php:131 includes/class-wsacsc-admin.php:200 98 msgid "Refresh logs table size" 99 msgstr "Grösse der Protokolltabelle aktualisieren" 100 101 #: includes/class-wsacsc-admin.php:132 102 msgid "Retrying…" 103 msgstr "Erneuter Versuch…" 104 105 #: includes/class-wsacsc-admin.php:150 106 msgid "Action Scheduler tables do not exist. Please ensure Action Scheduler is properly installed and activated." 107 msgstr "Die Action-Scheduler-Tabellen existieren nicht. Bitte stellen Sie sicher, dass Action Scheduler ordnungsgemäss installiert und aktiviert ist." 108 109 #: includes/class-wsacsc-admin.php:159 19 110 msgid "This tool allows you to clean up the Action Scheduler tables in your WordPress database. Action Scheduler is a library used by many plugins to schedule background tasks." 20 111 msgstr "Dieses Tool ermöglicht es Ihnen, die Action Scheduler-Tabellen in Ihrer WordPress-Datenbank zu bereinigen. Action Scheduler ist eine Bibliothek, die von vielen Plugins zur Planung von Hintergrundaufgaben verwendet wird." 21 112 22 msgid "Please wait..." 23 msgstr "Bitte warten Sie..." 24 25 msgid "Loading..." 26 msgstr "Wird geladen..." 27 113 #: includes/class-wsacsc-admin.php:160 28 114 msgid "The Action Scheduler uses two main tables:" 29 115 msgstr "Der Action Scheduler verwendet zwei Haupttabellen:" 30 116 117 #: includes/class-wsacsc-admin.php:162 31 118 msgid "Actions Table: Stores scheduled actions and their statuses." 32 119 msgstr "Aktionstabelle: Speichert geplante Aktionen und deren Status." 33 120 121 #: includes/class-wsacsc-admin.php:163 34 122 msgid "Logs Table: Stores logs of action executions." 35 123 msgstr "Protokolltabelle: Speichert Protokolle von Aktionsausführungen." 36 124 125 #: includes/class-wsacsc-admin.php:165 37 126 msgid "Clearing these tables is generally safe and can improve database performance. However, please note:" 38 127 msgstr "Das Bereinigen dieser Tabellen ist im Allgemeinen sicher und kann die Datenbankleistung verbessern. Bitte beachten Sie jedoch:" 39 128 129 #: includes/class-wsacsc-admin.php:167 40 130 msgid "Clearing can take a while depending on the size of the tables." 41 131 msgstr "Die Bereinigung kann je nach Grösse der Tabellen eine Weile dauern." 42 132 133 #: includes/class-wsacsc-admin.php:168 43 134 msgid "Cleared data will be permanently deleted." 44 135 msgstr "Bereinigte Daten werden dauerhaft gelöscht." 45 136 137 #: includes/class-wsacsc-admin.php:169 46 138 msgid "It's recommended to <strong>make a backup</strong> before proceeding." 47 139 msgstr "Es wird empfohlen, vor dem Fortfahren ein <strong>Backup zu erstellen</strong>." 48 140 141 #: includes/class-wsacsc-admin.php:170 49 142 msgid "Clearing completed, failed, or canceled actions usually doesn't affect WordPress functionality." 50 143 msgstr "Das Bereinigen von abgeschlossenen, fehlgeschlagenen oder abgebrochenen Aktionen beeinträchtigt normalerweise nicht die WordPress-Funktionalität." 51 144 145 #. translators: %s: URL to Action Scheduler admin page 146 #: includes/class-wsacsc-admin.php:177 147 #, php-format 52 148 msgid "For more information, visit the <a href=\"%s\">Action Scheduler admin page</a>." 53 149 msgstr "Weitere Informationen finden Sie auf der <a href=\"%s\">Action Scheduler-Administrationsseite</a>." 54 150 151 #: includes/class-wsacsc-admin.php:186 55 152 msgid "Current Table Sizes:" 56 153 msgstr "Aktuelle Tabellengrössen:" 57 154 155 #: includes/class-wsacsc-admin.php:188 58 156 msgid "Actions table:" 59 157 msgstr "Aktionstabelle:" 60 158 159 #: includes/class-wsacsc-admin.php:190 includes/class-wsacsc-admin.php:198 61 160 msgid "rows" 62 161 msgstr "Zeilen" 63 162 163 #: includes/class-wsacsc-admin.php:196 64 164 msgid "Logs table:" 65 165 msgstr "Protokolltabelle:" 66 166 167 #: includes/class-wsacsc-admin.php:207 67 168 msgid "Clear Action Statuses" 68 169 msgstr "Aktionsstatus bereinigen" 69 170 70 msgid "Select which action statuses to clear:" 71 msgstr "Wählen Sie aus, welche Aktionsstatus bereinigt werden sollen:" 72 171 #: includes/class-wsacsc-admin.php:209 172 msgid "Action statuses to clear" 173 msgstr "Zu bereinigende Aktionsstatus" 174 175 #: includes/class-wsacsc-admin.php:210 73 176 msgid "Select which statuses to remove when clearing manually, when this plugin runs scheduled action cleanup, and (if this plugin’s action cleanup schedule is disabled) which statuses Action Scheduler may delete in the background:" 74 177 msgstr "Wählen Sie aus, welche Status bei manueller Bereinigung, bei der geplanten Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) bei der Hintergrundbereinigung von Action Scheduler entfernt werden sollen:" 75 178 179 #: includes/class-wsacsc-admin.php:217 76 180 msgid "Complete" 77 181 msgstr "Abgeschlossen" 78 182 183 #: includes/class-wsacsc-admin.php:218 79 184 msgid "Failed" 80 185 msgstr "Fehlgeschlagen" 81 186 187 #: includes/class-wsacsc-admin.php:219 82 188 msgid "Canceled" 83 189 msgstr "Abgebrochen" 84 190 191 #: includes/class-wsacsc-admin.php:221 85 192 msgid "Clear Selected Actions" 86 193 msgstr "Ausgewählte Aktionen bereinigen" 87 194 195 #: includes/class-wsacsc-admin.php:226 88 196 msgid "Clear Logs Table" 89 197 msgstr "Protokolltabelle bereinigen" 90 198 199 #: includes/class-wsacsc-admin.php:227 91 200 msgid "This will clear all entries in the logs table." 92 201 msgstr "Dies wird alle Einträge in der Protokolltabelle löschen." 93 202 203 #: includes/class-wsacsc-admin.php:228 94 204 msgid "Clear Logs" 95 205 msgstr "Protokolle bereinigen" 96 206 207 #: includes/class-wsacsc-admin.php:232 208 msgid "Optimize Tables" 209 msgstr "Tabellen optimieren" 210 211 #: includes/class-wsacsc-admin.php:233 212 msgid "Optimize the database tables to reclaim unused space and potentially improve performance." 213 msgstr "Optimiere die Datenbanktabellen, um ungenutzten Speicherplatz freizugeben und möglicherweise die Leistung zu verbessern." 214 215 #: includes/class-wsacsc-admin.php:235 216 msgid "Optimize Actions Table" 217 msgstr "Aktionstabelle optimieren" 218 219 #: includes/class-wsacsc-admin.php:236 220 msgid "Optimize Logs Table" 221 msgstr "Protokolltabelle optimieren" 222 223 #: includes/class-wsacsc-admin.php:241 97 224 msgid "Scheduling Options" 98 225 msgstr "Planungsoptionen" 99 226 100 msgid "Set up automatic clearing schedules for selected statuses (set to 0 to clean fully; leave empty to disable automatic clearing):" 101 msgstr "Richten Sie automatische Bereinigungspläne für ausgewählte Status ein (auf 0 setzen, um vollständig zu bereinigen; leer lassen, um die automatische Bereinigung zu deaktivieren):" 102 103 msgid "Clear logs older than:" 104 msgstr "Protokolle bereinigen, die älter sind als:" 105 227 #: includes/class-wsacsc-admin.php:242 228 msgid "Finished actions can be removed automatically in two ways: this plugin’s scheduled cleanup (settings below) and Action Scheduler’s own built-in background cleanup for the actions table. The status checkboxes in “Clear Action Statuses” above define which statuses are affected—manual clearing, this plugin’s scheduled action cleanup, and (when this plugin’s action cleanup schedule is disabled) Action Scheduler’s background deletions." 229 msgstr "Abgeschlossene Aktionen können auf zwei Arten automatisch entfernt werden: über die geplante Bereinigung dieses Plugins (Einstellungen unten) und über die eingebaute Hintergrundbereinigung von Action Scheduler für die Aktionstabelle. Die Status-Kontrollkästchen unter „Aktionsstatus bereinigen“ legen fest, welche Status betroffen sind – manuelle Bereinigung, die geplante Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) die Hintergrundlöschungen von Action Scheduler." 230 231 #: includes/class-wsacsc-admin.php:243 232 msgid "Cleanup schedule and retention period are separate. Cleanup schedule controls how often this plugin runs its own WordPress cron jobs (1–365 days, or empty/0 to disable). Retention period controls how old entries must be before they are deleted. For actions, age is measured by completion or last attempt time—not the original scheduled date." 233 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist sind getrennte Einstellungen. Der Bereinigungszeitplan legt fest, wie oft dieses Plugin seine eigenen WordPress-Cronjobs ausführt (1–365 Tage, oder leer/0 zum Deaktivieren). Die Aufbewahrungsfrist legt fest, wie alt Einträge sein müssen, bevor sie gelöscht werden. Bei Aktionen wird das Alter am Abschluss- oder letzten Ausführungszeitpunkt gemessen – nicht am ursprünglichen Planungsdatum." 234 235 #: includes/class-wsacsc-admin.php:244 236 msgid "If an actions cleanup schedule is enabled, only this plugin’s cron job deletes old actions (using the selected statuses above); Action Scheduler’s built-in action cleanup is turned off to avoid duplicate deletions. If that schedule is disabled, this plugin does not run scheduled action cleanup—the actions retention period is passed to Action Scheduler instead, which deletes actions in the selected statuses when they are older than that many days." 237 msgstr "Ist ein Bereinigungszeitplan für Aktionen aktiviert, löscht nur der Cronjob dieses Plugins alte Aktionen (mit den oben gewählten Status); die eingebaute Aktionsbereinigung von Action Scheduler wird deaktiviert, um doppelte Löschungen zu vermeiden. Ist dieser Zeitplan deaktiviert, führt dieses Plugin keine geplante Aktionsbereinigung aus – die Aufbewahrungsfrist für Aktionen wird stattdessen an Action Scheduler übergeben, das Aktionen in den gewählten Status löscht, wenn sie älter als die angegebene Anzahl Tage sind." 238 239 #: includes/class-wsacsc-admin.php:245 240 msgid "Logs cleanup schedule and logs retention apply only to this plugin; Action Scheduler does not clean the logs table on its own." 241 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist für Protokolle gelten nur für dieses Plugin; Action Scheduler bereinigt die Protokolltabelle nicht von sich aus." 242 243 #: includes/class-wsacsc-admin.php:246 244 msgid "This plugin does not hide status filters on the Action Scheduler admin screen. Tabs such as Complete or Failed only appear when actions with those statuses exist in the database. On sites with a very large pending backlog, few actions may finish; if counts stay at zero, those tabs will not show." 245 msgstr "Dieses Plugin blendet keine Statusfilter auf der Action-Scheduler-Verwaltungsseite aus. Registerkarten wie „Abgeschlossen“ oder „Fehlgeschlagen“ erscheinen nur, wenn Aktionen mit diesen Status in der Datenbank existieren. Bei sehr grossem Pending-Rückstau werden wenige Aktionen abgeschlossen; bleiben die Zähler bei null, werden diese Registerkarten nicht angezeigt." 246 247 #: includes/class-wsacsc-admin.php:249 248 msgid "Action Statuses" 249 msgstr "Aktionsstatus" 250 251 #: includes/class-wsacsc-admin.php:251 includes/class-wsacsc-admin.php:277 252 msgid "Cleanup Schedule:" 253 msgstr "Bereinigungszeitplan:" 254 255 #: includes/class-wsacsc-admin.php:254 includes/class-wsacsc-admin.php:269 includes/class-wsacsc-admin.php:280 includes/class-wsacsc-admin.php:295 106 256 msgid "days" 107 257 msgstr "Tage" 108 258 109 msgid "Clear action statuses older than:" 110 msgstr "Aktionsstatus bereinigen, die älter sind als:" 111 259 #: includes/class-wsacsc-admin.php:256 260 msgid "This plugin only: how often its WordPress cron job deletes old actions (empty or 0 = disabled, 1–365 days). When enabled, Action Scheduler’s built-in action cleanup is disabled. This is not the retention period." 261 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Aktionen löscht (leer oder 0 = deaktiviert, 1–365 Tage). Wenn aktiviert, ist die eingebaute Aktionsbereinigung von Action Scheduler deaktiviert. Das ist nicht die Aufbewahrungsfrist." 262 263 #: includes/class-wsacsc-admin.php:259 includes/class-wsacsc-admin.php:285 264 msgid "Schedule Time:" 265 msgstr "Zeitplan:" 266 267 #: includes/class-wsacsc-admin.php:263 268 msgid "This plugin only: time of day for its action cleanup job (WordPress timezone)." 269 msgstr "Nur dieses Plugin: Tageszeit für den Aktions-Bereinigungsjob (WordPress-Zeitzone)." 270 271 #: includes/class-wsacsc-admin.php:266 includes/class-wsacsc-admin.php:292 272 msgid "Retention Period:" 273 msgstr "Aufbewahrungsfrist:" 274 275 #: includes/class-wsacsc-admin.php:271 276 msgid "How long to keep actions before deletion (by completion or last attempt time, not scheduled date), for the statuses selected above. With a plugin action cleanup schedule enabled: used only by this plugin’s cron job. With that schedule disabled: passed to Action Scheduler’s background cleanup for the same selected statuses. 0 = delete all matching actions on every cleanup run. Required." 277 msgstr "Wie lange Aktionen vor dem Löschen aufbewahrt werden (Abschluss- oder letzter Ausführungszeitpunkt, nicht Planungsdatum), für die oben gewählten Status. Mit aktiviertem Aktions-Bereinigungszeitplan: nur für den Cronjob dieses Plugins. Ohne diesen Zeitplan: wird an die Hintergrundbereinigung von Action Scheduler für dieselben Status übergeben. 0 = bei jedem Bereinigungslauf alle passenden Aktionen löschen. Pflichtfeld." 278 279 #: includes/class-wsacsc-admin.php:275 280 msgid "Logs" 281 msgstr "Protokolle" 282 283 #: includes/class-wsacsc-admin.php:282 284 msgid "This plugin only: how often its WordPress cron job deletes old log entries (empty or 0 = disabled, 1–365 days). Action Scheduler does not clean logs automatically. This is not the retention period." 285 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Protokolleinträge löscht (leer oder 0 = deaktiviert, 1–365 Tage). Action Scheduler bereinigt Protokolle nicht automatisch. Das ist nicht die Aufbewahrungsfrist." 286 287 #: includes/class-wsacsc-admin.php:289 288 msgid "This plugin only: time of day for its log cleanup job (WordPress timezone)." 289 msgstr "Nur dieses Plugin: Tageszeit für den Protokoll-Bereinigungsjob (WordPress-Zeitzone)." 290 291 #: includes/class-wsacsc-admin.php:297 292 msgid "This plugin only: delete log entries older than this many days (0 = delete all logs on each cleanup run). Required." 293 msgstr "Nur dieses Plugin: Protokolleinträge löschen, die älter sind als diese Anzahl Tage (0 = bei jedem Bereinigungslauf alle Protokolle löschen). Pflichtfeld." 294 295 #: includes/class-wsacsc-admin.php:301 112 296 msgid "Save Schedule" 113 297 msgstr "Zeitplan speichern" 114 298 299 #: includes/class-wsacsc-admin.php:307 115 300 msgid "Powered by Winning Solutions" 116 301 msgstr "Powered by Winning Solutions" 117 302 118 msgid "Selected actions cleared successfully!" 119 msgstr "Ausgewählte Aktionen erfolgreich bereinigt!" 120 121 msgid "Logs cleared successfully!" 122 msgstr "Protokolle erfolgreich bereinigt!" 123 124 msgid "Schedule saved successfully!" 125 msgstr "Zeitplan erfolgreich gespeichert!" 126 303 #: includes/class-wsacsc-ajax.php:37 304 msgid "Another cleanup or optimization is already running. Please wait until it finishes." 305 msgstr "Eine andere Bereinigung oder Optimierung läuft bereits. Bitte warten Sie, bis sie abgeschlossen ist." 306 307 #: includes/class-wsacsc-ajax.php:81 includes/class-wsacsc-ajax.php:96 includes/class-wsacsc-ajax.php:150 includes/class-wsacsc-ajax.php:209 includes/class-wsacsc-ajax.php:305 includes/class-wsacsc-ajax.php:329 includes/class-wsacsc-ajax.php:356 includes/class-wsacsc-ajax.php:404 308 msgid "Insufficient permissions." 309 msgstr "Unzureichende Berechtigungen." 310 311 #: includes/class-wsacsc-ajax.php:112 includes/class-wsacsc-ajax.php:156 312 msgid "Action Scheduler tables do not exist." 313 msgstr "Die Action-Scheduler-Tabellen existieren nicht." 314 315 #: includes/class-wsacsc-ajax.php:131 316 msgid "An error occurred while clearing actions." 317 msgstr "Beim Bereinigen der Aktionen ist ein Fehler aufgetreten." 318 319 #: includes/class-wsacsc-ajax.php:190 320 msgid "An error occurred while clearing logs." 321 msgstr "Beim Bereinigen der Protokolle ist ein Fehler aufgetreten." 322 323 #: includes/class-wsacsc-ajax.php:230 324 msgid "Actions schedule interval must be empty or between 1 and 365 days." 325 msgstr "Das Intervall für den Aktionszeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 326 327 #: includes/class-wsacsc-ajax.php:234 328 msgid "Logs schedule interval must be empty or between 1 and 365 days." 329 msgstr "Das Intervall für den Protokollzeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 330 331 #: includes/class-wsacsc-ajax.php:238 332 msgid "Actions schedule time must be in HH:MM format." 333 msgstr "Die Zeit für den Aktionszeitplan muss im Format HH:MM angegeben werden." 334 335 #: includes/class-wsacsc-ajax.php:242 336 msgid "Logs schedule time must be in HH:MM format." 337 msgstr "Die Zeit für den Protokollzeitplan muss im Format HH:MM angegeben werden." 338 339 #: includes/class-wsacsc-ajax.php:246 340 msgid "Actions retention period is required and must be between 0 and 365 days." 341 msgstr "Die Aufbewahrungsfrist für Aktionen ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 342 343 #: includes/class-wsacsc-ajax.php:250 344 msgid "Logs retention period is required and must be between 0 and 365 days." 345 msgstr "Die Aufbewahrungsfrist für Protokolle ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 346 347 #: includes/class-wsacsc-ajax.php:288 348 msgid "Failed to save schedule. Please try again." 349 msgstr "Der Zeitplan konnte nicht gespeichert werden. Bitte versuchen Sie es erneut." 350 351 #: includes/class-wsacsc-ajax.php:292 127 352 msgid "The settings were saved, but the cleanup schedule could not be updated yet. The plugin will retry automatically." 128 353 msgstr "Die Einstellungen wurden gespeichert, aber der Bereinigungszeitplan konnte noch nicht aktualisiert werden. Das Plugin versucht es automatisch erneut." 129 354 130 msgid "Statuses saved successfully!" 131 msgstr "Status erfolgreich gespeichert!" 132 133 msgid "Settings" 134 msgstr "Einstellungen" 135 136 msgid "Action Scheduler tables do not exist. Please ensure Action Scheduler is properly installed and activated." 137 msgstr "Die Action-Scheduler-Tabellen existieren nicht. Bitte stellen Sie sicher, dass Action Scheduler ordnungsgemäss installiert und aktiviert ist." 138 139 msgid "Please select at least one status to clear." 140 msgstr "Bitte wählen Sie mindestens einen Status zum Bereinigen aus." 141 142 msgid "Clearing in progress..." 143 msgstr "Bereinigung läuft..." 144 145 msgid "An error occurred. Please try again." 146 msgstr "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut." 147 148 msgid "Optimize Tables" 149 msgstr "Tabellen optimieren" 150 151 msgid "Optimize the database tables to reclaim unused space and potentially improve performance." 152 msgstr "Optimiere die Datenbanktabellen, um ungenutzten Speicherplatz freizugeben und möglicherweise die Leistung zu verbessern." 153 154 msgid "Optimize Actions Table" 155 msgstr "Aktionstabelle optimieren" 156 157 msgid "Optimize Logs Table" 158 msgstr "Protokolltabelle optimieren" 159 160 msgid "Optimizing table..." 161 msgstr "Tabelle wird optimiert..." 162 355 #: includes/class-wsacsc-ajax.php:336 includes/class-wsacsc-ajax.php:363 356 msgid "Invalid table type." 357 msgstr "Ungültiger Tabellentyp." 358 359 #. translators: %s: table type (actions or logs). 360 #: includes/class-wsacsc-ajax.php:390 361 #, php-format 163 362 msgid "%s table optimized successfully!" 164 363 msgstr "%s-Tabelle erfolgreich optimiert!" 165 364 166 msgid "Table optimization failed." 167 msgstr "Tabellenoptimierung fehlgeschlagen." 168 169 msgid "Table does not exist." 170 msgstr "Tabelle existiert nicht." 171 172 msgid "Invalid table type." 173 msgstr "Ungültiger Tabellentyp." 174 175 msgid "Insufficient permissions." 176 msgstr "Unzureichende Berechtigungen." 177 178 msgid "Finished actions can be removed automatically in two ways: this plugin’s scheduled cleanup (settings below) and Action Scheduler’s own built-in background cleanup for the actions table. The status checkboxes in “Clear Action Statuses” above define which statuses are affected—manual clearing, this plugin’s scheduled action cleanup, and (when this plugin’s action cleanup schedule is disabled) Action Scheduler’s background deletions." 179 msgstr "Abgeschlossene Aktionen können auf zwei Arten automatisch entfernt werden: über die geplante Bereinigung dieses Plugins (Einstellungen unten) und über die eingebaute Hintergrundbereinigung von Action Scheduler für die Aktionstabelle. Die Status-Kontrollkästchen unter „Aktionsstatus bereinigen“ legen fest, welche Status betroffen sind – manuelle Bereinigung, die geplante Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) die Hintergrundlöschungen von Action Scheduler." 180 181 msgid "Cleanup schedule and retention period are separate. Cleanup schedule controls how often this plugin runs its own WordPress cron jobs (1–365 days, or empty/0 to disable). Retention period controls how old entries must be before they are deleted. For actions, age is measured by completion or last attempt time—not the original scheduled date." 182 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist sind getrennte Einstellungen. Der Bereinigungszeitplan legt fest, wie oft dieses Plugin seine eigenen WordPress-Cronjobs ausführt (1–365 Tage, oder leer/0 zum Deaktivieren). Die Aufbewahrungsfrist legt fest, wie alt Einträge sein müssen, bevor sie gelöscht werden. Bei Aktionen wird das Alter am Abschluss- oder letzten Ausführungszeitpunkt gemessen – nicht am ursprünglichen Planungsdatum." 183 184 msgid "If an actions cleanup schedule is enabled, only this plugin’s cron job deletes old actions (using the selected statuses above); Action Scheduler’s built-in action cleanup is turned off to avoid duplicate deletions. If that schedule is disabled, this plugin does not run scheduled action cleanup—the actions retention period is passed to Action Scheduler instead, which deletes actions in the selected statuses when they are older than that many days." 185 msgstr "Ist ein Bereinigungszeitplan für Aktionen aktiviert, löscht nur der Cronjob dieses Plugins alte Aktionen (mit den oben gewählten Status); die eingebaute Aktionsbereinigung von Action Scheduler wird deaktiviert, um doppelte Löschungen zu vermeiden. Ist dieser Zeitplan deaktiviert, führt dieses Plugin keine geplante Aktionsbereinigung aus – die Aufbewahrungsfrist für Aktionen wird stattdessen an Action Scheduler übergeben, das Aktionen in den gewählten Status löscht, wenn sie älter als die angegebene Anzahl Tage sind." 186 187 msgid "Logs cleanup schedule and logs retention apply only to this plugin; Action Scheduler does not clean the logs table on its own." 188 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist für Protokolle gelten nur für dieses Plugin; Action Scheduler bereinigt die Protokolltabelle nicht von sich aus." 189 190 msgid "This plugin does not hide status filters on the Action Scheduler admin screen. Tabs such as Complete or Failed only appear when actions with those statuses exist in the database. On sites with a very large pending backlog, few actions may finish; if counts stay at zero, those tabs will not show." 191 msgstr "Dieses Plugin blendet keine Statusfilter auf der Action-Scheduler-Verwaltungsseite aus. Registerkarten wie „Abgeschlossen“ oder „Fehlgeschlagen“ erscheinen nur, wenn Aktionen mit diesen Status in der Datenbank existieren. Bei sehr großem Pending-Rückstau werden wenige Aktionen abgeschlossen; bleiben die Zähler bei null, werden diese Registerkarten nicht angezeigt." 192 193 msgid "Action Statuses" 194 msgstr "Aktionsstatus" 195 196 msgid "Cleanup Schedule:" 197 msgstr "Bereinigungszeitplan:" 198 199 msgid "This plugin only: how often its WordPress cron job deletes old actions (empty or 0 = disabled, 1–365 days). When enabled, Action Scheduler’s built-in action cleanup is disabled. This is not the retention period." 200 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Aktionen löscht (leer oder 0 = deaktiviert, 1–365 Tage). Wenn aktiviert, ist die eingebaute Aktionsbereinigung von Action Scheduler deaktiviert. Das ist nicht die Aufbewahrungsfrist." 201 202 msgid "Schedule Time:" 203 msgstr "Zeitplan:" 204 205 msgid "This plugin only: time of day for its action cleanup job (WordPress timezone)." 206 msgstr "Nur dieses Plugin: Tageszeit für den Aktions-Bereinigungsjob (WordPress-Zeitzone)." 207 208 msgid "Retention Period:" 209 msgstr "Aufbewahrungsfrist:" 210 211 msgid "How long to keep actions before deletion (by completion or last attempt time, not scheduled date), for the statuses selected above. With a plugin action cleanup schedule enabled: used only by this plugin’s cron job. With that schedule disabled: passed to Action Scheduler’s background cleanup for the same selected statuses. 0 = delete all matching actions on every cleanup run. Required." 212 msgstr "Wie lange Aktionen vor dem Löschen aufbewahrt werden (Abschluss- oder letzter Ausführungszeitpunkt, nicht Planungsdatum), für die oben gewählten Status. Mit aktiviertem Aktions-Bereinigungszeitplan: nur für den Cronjob dieses Plugins. Ohne diesen Zeitplan: wird an die Hintergrundbereinigung von Action Scheduler für dieselben Status übergeben. 0 = bei jedem Bereinigungslauf alle passenden Aktionen löschen. Pflichtfeld." 213 214 msgid "Logs" 215 msgstr "Protokolle" 216 217 msgid "How often to run cleanup (empty or 0 = disabled, 1-365 days)." 218 msgstr "Wie oft die Bereinigung ausgeführt wird (leer oder 0 = deaktiviert, 1–365 Tage)." 219 220 msgid "This plugin only: how often its WordPress cron job deletes old log entries (empty or 0 = disabled, 1–365 days). Action Scheduler does not clean logs automatically. This is not the retention period." 221 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Protokolleinträge löscht (leer oder 0 = deaktiviert, 1–365 Tage). Action Scheduler bereinigt Protokolle nicht automatisch. Das ist nicht die Aufbewahrungsfrist." 222 223 msgid "This plugin only: time of day for its log cleanup job (WordPress timezone)." 224 msgstr "Nur dieses Plugin: Tageszeit für den Protokoll-Bereinigungsjob (WordPress-Zeitzone)." 225 226 msgid "This plugin only: delete log entries older than this many days (0 = delete all logs on each cleanup run). Required." 227 msgstr "Nur dieses Plugin: Protokolleinträge löschen, die älter sind als diese Anzahl Tage (0 = bei jedem Bereinigungslauf alle Protokolle löschen). Pflichtfeld." 228 229 msgid "Actions schedule interval must be empty or between 1 and 365 days." 230 msgstr "Das Intervall für den Aktionszeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 231 232 msgid "Logs schedule interval must be empty or between 1 and 365 days." 233 msgstr "Das Intervall für den Protokollzeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 234 235 msgid "Actions schedule time must be in HH:MM format." 236 msgstr "Die Zeit für den Aktionszeitplan muss im Format HH:MM angegeben werden." 237 238 msgid "Logs schedule time must be in HH:MM format." 239 msgstr "Die Zeit für den Protokollzeitplan muss im Format HH:MM angegeben werden." 240 241 msgid "Actions retention period is required and must be between 0 and 365 days." 242 msgstr "Die Aufbewahrungsfrist für Aktionen ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 243 244 msgid "Logs retention period is required and must be between 0 and 365 days." 245 msgstr "Die Aufbewahrungsfrist für Protokolle ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 246 365 #: includes/class-wsacsc-ajax.php:411 366 msgid "Invalid cleanup ID." 367 msgstr "Ungültige Bereinigungs-ID." 368 369 #: includes/class-wsacsc-ajax.php:427 370 msgid "Cleanup progress was lost or is continuing in the background. Refresh the page to check table sizes." 371 msgstr "Der Bereinigungsfortschritt ging verloren oder die Bereinigung läuft im Hintergrund weiter. Laden Sie die Seite neu, um die Tabellengrössen zu prüfen." 372 373 #: includes/class-wsacsc-ajax.php:435 374 msgid "Invalid cleanup progress data." 375 msgstr "Ungültige Fortschrittsdaten der Bereinigung." 376 377 #: includes/class-wsacsc-ajax.php:441 378 msgid "An error occurred during cleanup." 379 msgstr "Während der Bereinigung ist ein Fehler aufgetreten." 380 381 #: includes/class-wsacsc-ajax.php:453 382 msgid "Cleanup completed successfully!" 383 msgstr "Bereinigung erfolgreich abgeschlossen!" 384 385 #. translators: %d: number of days. 386 #: includes/class-wsacsc-scheduler.php:245 387 #, php-format 388 msgid "Every %d day" 389 msgid_plural "Every %d days" 390 msgstr[0] "Jeden Tag" 391 msgstr[1] "Alle %d Tage" 392 393 #. translators: 1: rows deleted so far, 2: rows to delete in total, 3: percentage done. 394 #: includes/helpers.php:329 395 #, php-format 396 msgid "Clearing in progress… %1$s of %2$s rows deleted (%3$d%%)." 397 msgstr "Bereinigung läuft… %1$s von %2$s Zeilen gelöscht (%3$d %%)." 398 399 #. translators: %s: number of rows deleted so far. 400 #: includes/helpers.php:342 401 #, php-format 247 402 msgid "Clearing in progress… %s rows deleted so far." 248 403 msgstr "Bereinigung läuft… bisher %s Zeilen gelöscht." 249 250 msgid "Cleanup completed successfully!"251 msgstr "Bereinigung erfolgreich abgeschlossen!"252 253 msgid "Another cleanup or optimization is already running. Please wait until it finishes."254 msgstr "Eine andere Bereinigung oder Optimierung läuft bereits. Bitte warten Sie, bis sie abgeschlossen ist."255 256 msgid "An error occurred while clearing actions."257 msgstr "Beim Bereinigen der Aktionen ist ein Fehler aufgetreten."258 259 msgid "An error occurred while clearing logs."260 msgstr "Beim Bereinigen der Protokolle ist ein Fehler aufgetreten."261 262 msgid "Cleanup progress was lost or is continuing in the background. Refresh the page to check table sizes."263 msgstr "Der Bereinigungsfortschritt ging verloren oder die Bereinigung läuft im Hintergrund weiter. Laden Sie die Seite neu, um die Tabellengrößen zu prüfen."264 265 msgid "An error occurred during cleanup."266 msgstr "Während der Bereinigung ist ein Fehler aufgetreten."267 268 msgid "Retrying…"269 msgstr "Erneuter Versuch…" -
ws-action-scheduler-cleaner/trunk/languages/ws-action-scheduler-cleaner-de_CH_informal.po
r3750500 r3798362 1 # 1 2 msgid "" 2 3 msgstr "" 3 4 "Project-Id-Version: WS Action Scheduler Cleaner\n" 4 "Report-Msgid-Bugs-To: \n"5 "POT-Creation-Date: 202 4-10-10 12:00+0000\n"6 "PO-Revision-Date: 202 5-11-24 18:00+0100\n"5 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ws-action-scheduler-cleaner\n" 6 "POT-Creation-Date: 2026-11-10T20:25:22+00:00\n" 7 "PO-Revision-Date: 2026-11-10 12:00+0000\n" 7 8 "Last-Translator: Marco Brack <mbrack@winning-solutions.de>\n" 8 9 "Language-Team: \n" … … 14 15 "X-Generator: Poedit 3.8\n" 15 16 17 #. Plugin Name of the plugin 18 #: ws-action-scheduler-cleaner.php includes/class-wsacsc-admin.php:70 includes/class-wsacsc-admin.php:149 includes/class-wsacsc-admin.php:156 16 19 msgid "WS Action Scheduler Cleaner" 17 20 msgstr "WS Action Scheduler Cleaner" 18 21 22 #. Description of the plugin 23 #: ws-action-scheduler-cleaner.php 24 msgid "Suffering from database bloat? Try cleaning up the Action Scheduler tables through an easy-to-understand GUI." 25 msgstr "Leidet deine Datenbank unter aufgeblähten Tabellen? Bereinige die Action-Scheduler-Tabellen über eine leicht verständliche Oberfläche." 26 27 #. Author of the plugin 28 #: ws-action-scheduler-cleaner.php 29 msgid "Winning Solutions - Nagel & Mäder GbR" 30 msgstr "Winning Solutions - Nagel & Mäder GbR" 31 32 #. Author URI of the plugin 33 #: ws-action-scheduler-cleaner.php 34 msgid "https://www.winning-solutions.de" 35 msgstr "https://www.winning-solutions.de" 36 37 #: includes/class-wsacsc-admin.php:40 38 msgid "Settings" 39 msgstr "Einstellungen" 40 41 #: includes/class-wsacsc-admin.php:71 42 msgid "WS AS Cleaner" 43 msgstr "WS AS Cleaner" 44 45 #: includes/class-wsacsc-admin.php:118 includes/class-wsacsc-ajax.php:108 includes/class-wsacsc-ajax.php:314 46 msgid "Please select at least one status to clear." 47 msgstr "Bitte wähle mindestens einen Status zum Bereinigen aus." 48 49 #: includes/class-wsacsc-admin.php:119 includes/helpers.php:337 50 msgid "Clearing in progress..." 51 msgstr "Bereinigung läuft..." 52 53 #: includes/class-wsacsc-admin.php:120 54 msgid "Please wait..." 55 msgstr "Bitte warte..." 56 57 #: includes/class-wsacsc-admin.php:121 58 msgid "An error occurred. Please try again." 59 msgstr "Ein Fehler ist aufgetreten. Bitte versuche es erneut." 60 61 #: includes/class-wsacsc-admin.php:122 includes/class-wsacsc-ajax.php:138 62 msgid "Selected actions cleared successfully!" 63 msgstr "Ausgewählte Aktionen erfolgreich bereinigt!" 64 65 #: includes/class-wsacsc-admin.php:123 includes/class-wsacsc-ajax.php:180 includes/class-wsacsc-ajax.php:197 66 msgid "Logs cleared successfully!" 67 msgstr "Protokolle erfolgreich bereinigt!" 68 69 #: includes/class-wsacsc-admin.php:124 includes/class-wsacsc-ajax.php:295 70 msgid "Schedule saved successfully!" 71 msgstr "Zeitplan erfolgreich gespeichert!" 72 73 #: includes/class-wsacsc-admin.php:125 includes/class-wsacsc-ajax.php:319 74 msgid "Statuses saved successfully!" 75 msgstr "Status erfolgreich gespeichert!" 76 77 #: includes/class-wsacsc-admin.php:126 78 msgid "Optimizing table..." 79 msgstr "Tabelle wird optimiert..." 80 81 #: includes/class-wsacsc-admin.php:127 includes/class-wsacsc-admin.php:189 includes/class-wsacsc-admin.php:191 includes/class-wsacsc-admin.php:197 includes/class-wsacsc-admin.php:199 82 msgid "Loading..." 83 msgstr "Wird geladen..." 84 85 #: includes/class-wsacsc-admin.php:128 includes/class-wsacsc-ajax.php:382 86 msgid "Table optimization failed." 87 msgstr "Tabellenoptimierung fehlgeschlagen." 88 89 #: includes/class-wsacsc-admin.php:129 90 msgid "Please fix the highlighted fields before saving." 91 msgstr "Bitte korrigiere die markierten Felder vor dem Speichern." 92 93 #: includes/class-wsacsc-admin.php:130 includes/class-wsacsc-admin.php:192 94 msgid "Refresh actions table size" 95 msgstr "Grösse der Aktionstabelle aktualisieren" 96 97 #: includes/class-wsacsc-admin.php:131 includes/class-wsacsc-admin.php:200 98 msgid "Refresh logs table size" 99 msgstr "Grösse der Protokolltabelle aktualisieren" 100 101 #: includes/class-wsacsc-admin.php:132 102 msgid "Retrying…" 103 msgstr "Erneuter Versuch…" 104 105 #: includes/class-wsacsc-admin.php:150 106 msgid "Action Scheduler tables do not exist. Please ensure Action Scheduler is properly installed and activated." 107 msgstr "Die Action-Scheduler-Tabellen existieren nicht. Bitte stelle sicher, dass Action Scheduler ordnungsgemäss installiert und aktiviert ist." 108 109 #: includes/class-wsacsc-admin.php:159 19 110 msgid "This tool allows you to clean up the Action Scheduler tables in your WordPress database. Action Scheduler is a library used by many plugins to schedule background tasks." 20 111 msgstr "Dieses Tool ermöglicht es dir, die Action Scheduler-Tabellen in deiner WordPress-Datenbank zu bereinigen. Action Scheduler ist eine Bibliothek, die von vielen Plugins zur Planung von Hintergrundaufgaben verwendet wird." 21 112 22 msgid "Please wait..." 23 msgstr "Bitte warte..." 24 25 msgid "Loading..." 26 msgstr "Wird geladen..." 27 113 #: includes/class-wsacsc-admin.php:160 28 114 msgid "The Action Scheduler uses two main tables:" 29 115 msgstr "Der Action Scheduler verwendet zwei Haupttabellen:" 30 116 117 #: includes/class-wsacsc-admin.php:162 31 118 msgid "Actions Table: Stores scheduled actions and their statuses." 32 119 msgstr "Aktionstabelle: Speichert geplante Aktionen und deren Status." 33 120 121 #: includes/class-wsacsc-admin.php:163 34 122 msgid "Logs Table: Stores logs of action executions." 35 123 msgstr "Protokolltabelle: Speichert Protokolle von Aktionsausführungen." 36 124 125 #: includes/class-wsacsc-admin.php:165 37 126 msgid "Clearing these tables is generally safe and can improve database performance. However, please note:" 38 127 msgstr "Das Bereinigen dieser Tabellen ist im Allgemeinen sicher und kann die Datenbankleistung verbessern. Bitte beachte jedoch:" 39 128 129 #: includes/class-wsacsc-admin.php:167 40 130 msgid "Clearing can take a while depending on the size of the tables." 41 131 msgstr "Die Bereinigung kann je nach Grösse der Tabellen eine Weile dauern." 42 132 133 #: includes/class-wsacsc-admin.php:168 43 134 msgid "Cleared data will be permanently deleted." 44 135 msgstr "Bereinigte Daten werden dauerhaft gelöscht." 45 136 137 #: includes/class-wsacsc-admin.php:169 46 138 msgid "It's recommended to <strong>make a backup</strong> before proceeding." 47 139 msgstr "Es wird empfohlen, vor dem Fortfahren ein <strong>Backup zu erstellen</strong>." 48 140 141 #: includes/class-wsacsc-admin.php:170 49 142 msgid "Clearing completed, failed, or canceled actions usually doesn't affect WordPress functionality." 50 143 msgstr "Das Bereinigen von abgeschlossenen, fehlgeschlagenen oder abgebrochenen Aktionen beeinträchtigt normalerweise nicht die WordPress-Funktionalität." 51 144 145 #. translators: %s: URL to Action Scheduler admin page 146 #: includes/class-wsacsc-admin.php:177 147 #, php-format 52 148 msgid "For more information, visit the <a href=\"%s\">Action Scheduler admin page</a>." 53 149 msgstr "Weitere Informationen findest du auf der <a href=\"%s\">Action Scheduler-Administrationsseite</a>." 54 150 151 #: includes/class-wsacsc-admin.php:186 55 152 msgid "Current Table Sizes:" 56 153 msgstr "Aktuelle Tabellengrössen:" 57 154 155 #: includes/class-wsacsc-admin.php:188 58 156 msgid "Actions table:" 59 157 msgstr "Aktionstabelle:" 60 158 159 #: includes/class-wsacsc-admin.php:190 includes/class-wsacsc-admin.php:198 61 160 msgid "rows" 62 161 msgstr "Zeilen" 63 162 163 #: includes/class-wsacsc-admin.php:196 64 164 msgid "Logs table:" 65 165 msgstr "Protokolltabelle:" 66 166 167 #: includes/class-wsacsc-admin.php:207 67 168 msgid "Clear Action Statuses" 68 169 msgstr "Aktionsstatus bereinigen" 69 170 70 msgid "Select which action statuses to clear:" 71 msgstr "Wähle aus, welche Aktionsstatus bereinigt werden sollen:" 72 171 #: includes/class-wsacsc-admin.php:209 172 msgid "Action statuses to clear" 173 msgstr "Zu bereinigende Aktionsstatus" 174 175 #: includes/class-wsacsc-admin.php:210 73 176 msgid "Select which statuses to remove when clearing manually, when this plugin runs scheduled action cleanup, and (if this plugin’s action cleanup schedule is disabled) which statuses Action Scheduler may delete in the background:" 74 177 msgstr "Wähle aus, welche Status bei manueller Bereinigung, bei der geplanten Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) bei der Hintergrundbereinigung von Action Scheduler entfernt werden sollen:" 75 178 179 #: includes/class-wsacsc-admin.php:217 76 180 msgid "Complete" 77 181 msgstr "Abgeschlossen" 78 182 183 #: includes/class-wsacsc-admin.php:218 79 184 msgid "Failed" 80 185 msgstr "Fehlgeschlagen" 81 186 187 #: includes/class-wsacsc-admin.php:219 82 188 msgid "Canceled" 83 189 msgstr "Abgebrochen" 84 190 191 #: includes/class-wsacsc-admin.php:221 85 192 msgid "Clear Selected Actions" 86 193 msgstr "Ausgewählte Aktionen bereinigen" 87 194 195 #: includes/class-wsacsc-admin.php:226 88 196 msgid "Clear Logs Table" 89 197 msgstr "Protokolltabelle bereinigen" 90 198 199 #: includes/class-wsacsc-admin.php:227 91 200 msgid "This will clear all entries in the logs table." 92 201 msgstr "Dies wird alle Einträge in der Protokolltabelle löschen." 93 202 203 #: includes/class-wsacsc-admin.php:228 94 204 msgid "Clear Logs" 95 205 msgstr "Protokolle bereinigen" 96 206 207 #: includes/class-wsacsc-admin.php:232 208 msgid "Optimize Tables" 209 msgstr "Tabellen optimieren" 210 211 #: includes/class-wsacsc-admin.php:233 212 msgid "Optimize the database tables to reclaim unused space and potentially improve performance." 213 msgstr "Optimiere die Datenbanktabellen, um ungenutzten Speicherplatz freizugeben und möglicherweise die Leistung zu verbessern." 214 215 #: includes/class-wsacsc-admin.php:235 216 msgid "Optimize Actions Table" 217 msgstr "Aktionstabelle optimieren" 218 219 #: includes/class-wsacsc-admin.php:236 220 msgid "Optimize Logs Table" 221 msgstr "Protokolltabelle optimieren" 222 223 #: includes/class-wsacsc-admin.php:241 97 224 msgid "Scheduling Options" 98 225 msgstr "Planungsoptionen" 99 226 100 msgid "Set up automatic clearing schedules for selected statuses (set to 0 to clean fully; leave empty to disable automatic clearing):" 101 msgstr "Richte automatische Bereinigungspläne für ausgewählte Status ein (auf 0 setzen, um vollständig zu bereinigen; leer lassen, um die automatische Bereinigung zu deaktivieren):" 102 103 msgid "Clear logs older than:" 104 msgstr "Protokolle bereinigen, die älter sind als:" 105 227 #: includes/class-wsacsc-admin.php:242 228 msgid "Finished actions can be removed automatically in two ways: this plugin’s scheduled cleanup (settings below) and Action Scheduler’s own built-in background cleanup for the actions table. The status checkboxes in “Clear Action Statuses” above define which statuses are affected—manual clearing, this plugin’s scheduled action cleanup, and (when this plugin’s action cleanup schedule is disabled) Action Scheduler’s background deletions." 229 msgstr "Abgeschlossene Aktionen können auf zwei Arten automatisch entfernt werden: über die geplante Bereinigung dieses Plugins (Einstellungen unten) und über die eingebaute Hintergrundbereinigung von Action Scheduler für die Aktionstabelle. Die Status-Kontrollkästchen unter „Aktionsstatus bereinigen“ legen fest, welche Status betroffen sind – manuelle Bereinigung, die geplante Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) die Hintergrundlöschungen von Action Scheduler." 230 231 #: includes/class-wsacsc-admin.php:243 232 msgid "Cleanup schedule and retention period are separate. Cleanup schedule controls how often this plugin runs its own WordPress cron jobs (1–365 days, or empty/0 to disable). Retention period controls how old entries must be before they are deleted. For actions, age is measured by completion or last attempt time—not the original scheduled date." 233 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist sind getrennte Einstellungen. Der Bereinigungszeitplan legt fest, wie oft dieses Plugin seine eigenen WordPress-Cronjobs ausführt (1–365 Tage, oder leer/0 zum Deaktivieren). Die Aufbewahrungsfrist legt fest, wie alt Einträge sein müssen, bevor sie gelöscht werden. Bei Aktionen wird das Alter am Abschluss- oder letzten Ausführungszeitpunkt gemessen – nicht am ursprünglichen Planungsdatum." 234 235 #: includes/class-wsacsc-admin.php:244 236 msgid "If an actions cleanup schedule is enabled, only this plugin’s cron job deletes old actions (using the selected statuses above); Action Scheduler’s built-in action cleanup is turned off to avoid duplicate deletions. If that schedule is disabled, this plugin does not run scheduled action cleanup—the actions retention period is passed to Action Scheduler instead, which deletes actions in the selected statuses when they are older than that many days." 237 msgstr "Ist ein Bereinigungszeitplan für Aktionen aktiviert, löscht nur der Cronjob dieses Plugins alte Aktionen (mit den oben gewählten Status); die eingebaute Aktionsbereinigung von Action Scheduler wird deaktiviert, um doppelte Löschungen zu vermeiden. Ist dieser Zeitplan deaktiviert, führt dieses Plugin keine geplante Aktionsbereinigung aus – die Aufbewahrungsfrist für Aktionen wird stattdessen an Action Scheduler übergeben, das Aktionen in den gewählten Status löscht, wenn sie älter als die angegebene Anzahl Tage sind." 238 239 #: includes/class-wsacsc-admin.php:245 240 msgid "Logs cleanup schedule and logs retention apply only to this plugin; Action Scheduler does not clean the logs table on its own." 241 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist für Protokolle gelten nur für dieses Plugin; Action Scheduler bereinigt die Protokolltabelle nicht von sich aus." 242 243 #: includes/class-wsacsc-admin.php:246 244 msgid "This plugin does not hide status filters on the Action Scheduler admin screen. Tabs such as Complete or Failed only appear when actions with those statuses exist in the database. On sites with a very large pending backlog, few actions may finish; if counts stay at zero, those tabs will not show." 245 msgstr "Dieses Plugin blendet keine Statusfilter auf der Action-Scheduler-Verwaltungsseite aus. Registerkarten wie „Abgeschlossen“ oder „Fehlgeschlagen“ erscheinen nur, wenn Aktionen mit diesen Status in der Datenbank existieren. Bei sehr grossem Pending-Rückstau werden wenige Aktionen abgeschlossen; bleiben die Zähler bei null, werden diese Registerkarten nicht angezeigt." 246 247 #: includes/class-wsacsc-admin.php:249 248 msgid "Action Statuses" 249 msgstr "Aktionsstatus" 250 251 #: includes/class-wsacsc-admin.php:251 includes/class-wsacsc-admin.php:277 252 msgid "Cleanup Schedule:" 253 msgstr "Bereinigungszeitplan:" 254 255 #: includes/class-wsacsc-admin.php:254 includes/class-wsacsc-admin.php:269 includes/class-wsacsc-admin.php:280 includes/class-wsacsc-admin.php:295 106 256 msgid "days" 107 257 msgstr "Tage" 108 258 109 msgid "Clear action statuses older than:" 110 msgstr "Aktionsstatus bereinigen, die älter sind als:" 111 259 #: includes/class-wsacsc-admin.php:256 260 msgid "This plugin only: how often its WordPress cron job deletes old actions (empty or 0 = disabled, 1–365 days). When enabled, Action Scheduler’s built-in action cleanup is disabled. This is not the retention period." 261 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Aktionen löscht (leer oder 0 = deaktiviert, 1–365 Tage). Wenn aktiviert, ist die eingebaute Aktionsbereinigung von Action Scheduler deaktiviert. Das ist nicht die Aufbewahrungsfrist." 262 263 #: includes/class-wsacsc-admin.php:259 includes/class-wsacsc-admin.php:285 264 msgid "Schedule Time:" 265 msgstr "Zeitplan:" 266 267 #: includes/class-wsacsc-admin.php:263 268 msgid "This plugin only: time of day for its action cleanup job (WordPress timezone)." 269 msgstr "Nur dieses Plugin: Tageszeit für den Aktions-Bereinigungsjob (WordPress-Zeitzone)." 270 271 #: includes/class-wsacsc-admin.php:266 includes/class-wsacsc-admin.php:292 272 msgid "Retention Period:" 273 msgstr "Aufbewahrungsfrist:" 274 275 #: includes/class-wsacsc-admin.php:271 276 msgid "How long to keep actions before deletion (by completion or last attempt time, not scheduled date), for the statuses selected above. With a plugin action cleanup schedule enabled: used only by this plugin’s cron job. With that schedule disabled: passed to Action Scheduler’s background cleanup for the same selected statuses. 0 = delete all matching actions on every cleanup run. Required." 277 msgstr "Wie lange Aktionen vor dem Löschen aufbewahrt werden (Abschluss- oder letzter Ausführungszeitpunkt, nicht Planungsdatum), für die oben gewählten Status. Mit aktiviertem Aktions-Bereinigungszeitplan: nur für den Cronjob dieses Plugins. Ohne diesen Zeitplan: wird an die Hintergrundbereinigung von Action Scheduler für dieselben Status übergeben. 0 = bei jedem Bereinigungslauf alle passenden Aktionen löschen. Pflichtfeld." 278 279 #: includes/class-wsacsc-admin.php:275 280 msgid "Logs" 281 msgstr "Protokolle" 282 283 #: includes/class-wsacsc-admin.php:282 284 msgid "This plugin only: how often its WordPress cron job deletes old log entries (empty or 0 = disabled, 1–365 days). Action Scheduler does not clean logs automatically. This is not the retention period." 285 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Protokolleinträge löscht (leer oder 0 = deaktiviert, 1–365 Tage). Action Scheduler bereinigt Protokolle nicht automatisch. Das ist nicht die Aufbewahrungsfrist." 286 287 #: includes/class-wsacsc-admin.php:289 288 msgid "This plugin only: time of day for its log cleanup job (WordPress timezone)." 289 msgstr "Nur dieses Plugin: Tageszeit für den Protokoll-Bereinigungsjob (WordPress-Zeitzone)." 290 291 #: includes/class-wsacsc-admin.php:297 292 msgid "This plugin only: delete log entries older than this many days (0 = delete all logs on each cleanup run). Required." 293 msgstr "Nur dieses Plugin: Protokolleinträge löschen, die älter sind als diese Anzahl Tage (0 = bei jedem Bereinigungslauf alle Protokolle löschen). Pflichtfeld." 294 295 #: includes/class-wsacsc-admin.php:301 112 296 msgid "Save Schedule" 113 297 msgstr "Zeitplan speichern" 114 298 299 #: includes/class-wsacsc-admin.php:307 115 300 msgid "Powered by Winning Solutions" 116 301 msgstr "Powered by Winning Solutions" 117 302 118 msgid "Selected actions cleared successfully!" 119 msgstr "Ausgewählte Aktionen erfolgreich bereinigt!" 120 121 msgid "Logs cleared successfully!" 122 msgstr "Protokolle erfolgreich bereinigt!" 123 124 msgid "Schedule saved successfully!" 125 msgstr "Zeitplan erfolgreich gespeichert!" 126 303 #: includes/class-wsacsc-ajax.php:37 304 msgid "Another cleanup or optimization is already running. Please wait until it finishes." 305 msgstr "Eine andere Bereinigung oder Optimierung läuft bereits. Bitte warte, bis sie abgeschlossen ist." 306 307 #: includes/class-wsacsc-ajax.php:81 includes/class-wsacsc-ajax.php:96 includes/class-wsacsc-ajax.php:150 includes/class-wsacsc-ajax.php:209 includes/class-wsacsc-ajax.php:305 includes/class-wsacsc-ajax.php:329 includes/class-wsacsc-ajax.php:356 includes/class-wsacsc-ajax.php:404 308 msgid "Insufficient permissions." 309 msgstr "Unzureichende Berechtigungen." 310 311 #: includes/class-wsacsc-ajax.php:112 includes/class-wsacsc-ajax.php:156 312 msgid "Action Scheduler tables do not exist." 313 msgstr "Die Action-Scheduler-Tabellen existieren nicht." 314 315 #: includes/class-wsacsc-ajax.php:131 316 msgid "An error occurred while clearing actions." 317 msgstr "Beim Bereinigen der Aktionen ist ein Fehler aufgetreten." 318 319 #: includes/class-wsacsc-ajax.php:190 320 msgid "An error occurred while clearing logs." 321 msgstr "Beim Bereinigen der Protokolle ist ein Fehler aufgetreten." 322 323 #: includes/class-wsacsc-ajax.php:230 324 msgid "Actions schedule interval must be empty or between 1 and 365 days." 325 msgstr "Das Intervall für den Aktionszeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 326 327 #: includes/class-wsacsc-ajax.php:234 328 msgid "Logs schedule interval must be empty or between 1 and 365 days." 329 msgstr "Das Intervall für den Protokollzeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 330 331 #: includes/class-wsacsc-ajax.php:238 332 msgid "Actions schedule time must be in HH:MM format." 333 msgstr "Die Zeit für den Aktionszeitplan muss im Format HH:MM angegeben werden." 334 335 #: includes/class-wsacsc-ajax.php:242 336 msgid "Logs schedule time must be in HH:MM format." 337 msgstr "Die Zeit für den Protokollzeitplan muss im Format HH:MM angegeben werden." 338 339 #: includes/class-wsacsc-ajax.php:246 340 msgid "Actions retention period is required and must be between 0 and 365 days." 341 msgstr "Die Aufbewahrungsfrist für Aktionen ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 342 343 #: includes/class-wsacsc-ajax.php:250 344 msgid "Logs retention period is required and must be between 0 and 365 days." 345 msgstr "Die Aufbewahrungsfrist für Protokolle ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 346 347 #: includes/class-wsacsc-ajax.php:288 348 msgid "Failed to save schedule. Please try again." 349 msgstr "Der Zeitplan konnte nicht gespeichert werden. Bitte versuche es erneut." 350 351 #: includes/class-wsacsc-ajax.php:292 127 352 msgid "The settings were saved, but the cleanup schedule could not be updated yet. The plugin will retry automatically." 128 353 msgstr "Die Einstellungen wurden gespeichert, aber der Bereinigungszeitplan konnte noch nicht aktualisiert werden. Das Plugin versucht es automatisch erneut." 129 354 130 msgid "Statuses saved successfully!" 131 msgstr "Status erfolgreich gespeichert!" 132 133 msgid "Settings" 134 msgstr "Einstellungen" 135 136 msgid "Action Scheduler tables do not exist. Please ensure Action Scheduler is properly installed and activated." 137 msgstr "Die Action-Scheduler-Tabellen existieren nicht. Bitte stelle sicher, dass Action Scheduler ordnungsgemäß installiert und aktiviert ist." 138 139 msgid "Please select at least one status to clear." 140 msgstr "Bitte wähle mindestens einen Status zum Bereinigen aus." 141 142 msgid "Clearing in progress..." 143 msgstr "Bereinigung läuft..." 144 145 msgid "An error occurred. Please try again." 146 msgstr "Ein Fehler ist aufgetreten. Bitte versuche es erneut." 147 148 msgid "Optimize Tables" 149 msgstr "Tabellen optimieren" 150 151 msgid "Optimize the database tables to reclaim unused space and potentially improve performance." 152 msgstr "Optimiere die Datenbanktabellen, um ungenutzten Speicherplatz freizugeben und möglicherweise die Leistung zu verbessern." 153 154 msgid "Optimize Actions Table" 155 msgstr "Aktionstabelle optimieren" 156 157 msgid "Optimize Logs Table" 158 msgstr "Protokolltabelle optimieren" 159 160 msgid "Optimizing table..." 161 msgstr "Tabelle wird optimiert..." 162 355 #: includes/class-wsacsc-ajax.php:336 includes/class-wsacsc-ajax.php:363 356 msgid "Invalid table type." 357 msgstr "Ungültiger Tabellentyp." 358 359 #. translators: %s: table type (actions or logs). 360 #: includes/class-wsacsc-ajax.php:390 361 #, php-format 163 362 msgid "%s table optimized successfully!" 164 363 msgstr "%s-Tabelle erfolgreich optimiert!" 165 364 166 msgid "Table optimization failed." 167 msgstr "Tabellenoptimierung fehlgeschlagen." 168 169 msgid "Table does not exist." 170 msgstr "Tabelle existiert nicht." 171 172 msgid "Invalid table type." 173 msgstr "Ungültiger Tabellentyp." 174 175 msgid "Insufficient permissions." 176 msgstr "Unzureichende Berechtigungen." 177 178 msgid "Finished actions can be removed automatically in two ways: this plugin’s scheduled cleanup (settings below) and Action Scheduler’s own built-in background cleanup for the actions table. The status checkboxes in “Clear Action Statuses” above define which statuses are affected—manual clearing, this plugin’s scheduled action cleanup, and (when this plugin’s action cleanup schedule is disabled) Action Scheduler’s background deletions." 179 msgstr "Abgeschlossene Aktionen können auf zwei Arten automatisch entfernt werden: über die geplante Bereinigung dieses Plugins (Einstellungen unten) und über die eingebaute Hintergrundbereinigung von Action Scheduler für die Aktionstabelle. Die Status-Kontrollkästchen unter „Aktionsstatus bereinigen“ legen fest, welche Status betroffen sind – manuelle Bereinigung, die geplante Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) die Hintergrundlöschungen von Action Scheduler." 180 181 msgid "Cleanup schedule and retention period are separate. Cleanup schedule controls how often this plugin runs its own WordPress cron jobs (1–365 days, or empty/0 to disable). Retention period controls how old entries must be before they are deleted. For actions, age is measured by completion or last attempt time—not the original scheduled date." 182 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist sind getrennte Einstellungen. Der Bereinigungszeitplan legt fest, wie oft dieses Plugin seine eigenen WordPress-Cronjobs ausführt (1–365 Tage, oder leer/0 zum Deaktivieren). Die Aufbewahrungsfrist legt fest, wie alt Einträge sein müssen, bevor sie gelöscht werden. Bei Aktionen wird das Alter am Abschluss- oder letzten Ausführungszeitpunkt gemessen – nicht am ursprünglichen Planungsdatum." 183 184 msgid "If an actions cleanup schedule is enabled, only this plugin’s cron job deletes old actions (using the selected statuses above); Action Scheduler’s built-in action cleanup is turned off to avoid duplicate deletions. If that schedule is disabled, this plugin does not run scheduled action cleanup—the actions retention period is passed to Action Scheduler instead, which deletes actions in the selected statuses when they are older than that many days." 185 msgstr "Ist ein Bereinigungszeitplan für Aktionen aktiviert, löscht nur der Cronjob dieses Plugins alte Aktionen (mit den oben gewählten Status); die eingebaute Aktionsbereinigung von Action Scheduler wird deaktiviert, um doppelte Löschungen zu vermeiden. Ist dieser Zeitplan deaktiviert, führt dieses Plugin keine geplante Aktionsbereinigung aus – die Aufbewahrungsfrist für Aktionen wird stattdessen an Action Scheduler übergeben, das Aktionen in den gewählten Status löscht, wenn sie älter als die angegebene Anzahl Tage sind." 186 187 msgid "Logs cleanup schedule and logs retention apply only to this plugin; Action Scheduler does not clean the logs table on its own." 188 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist für Protokolle gelten nur für dieses Plugin; Action Scheduler bereinigt die Protokolltabelle nicht von sich aus." 189 190 msgid "This plugin does not hide status filters on the Action Scheduler admin screen. Tabs such as Complete or Failed only appear when actions with those statuses exist in the database. On sites with a very large pending backlog, few actions may finish; if counts stay at zero, those tabs will not show." 191 msgstr "Dieses Plugin blendet keine Statusfilter auf der Action-Scheduler-Verwaltungsseite aus. Registerkarten wie „Abgeschlossen“ oder „Fehlgeschlagen“ erscheinen nur, wenn Aktionen mit diesen Status in der Datenbank existieren. Bei sehr großem Pending-Rückstau werden wenige Aktionen abgeschlossen; bleiben die Zähler bei null, werden diese Registerkarten nicht angezeigt." 192 193 msgid "Action Statuses" 194 msgstr "Aktionsstatus" 195 196 msgid "Cleanup Schedule:" 197 msgstr "Bereinigungszeitplan:" 198 199 msgid "This plugin only: how often its WordPress cron job deletes old actions (empty or 0 = disabled, 1–365 days). When enabled, Action Scheduler’s built-in action cleanup is disabled. This is not the retention period." 200 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Aktionen löscht (leer oder 0 = deaktiviert, 1–365 Tage). Wenn aktiviert, ist die eingebaute Aktionsbereinigung von Action Scheduler deaktiviert. Das ist nicht die Aufbewahrungsfrist." 201 202 msgid "Schedule Time:" 203 msgstr "Zeitplan:" 204 205 msgid "This plugin only: time of day for its action cleanup job (WordPress timezone)." 206 msgstr "Nur dieses Plugin: Tageszeit für den Aktions-Bereinigungsjob (WordPress-Zeitzone)." 207 208 msgid "Retention Period:" 209 msgstr "Aufbewahrungsfrist:" 210 211 msgid "How long to keep actions before deletion (by completion or last attempt time, not scheduled date), for the statuses selected above. With a plugin action cleanup schedule enabled: used only by this plugin’s cron job. With that schedule disabled: passed to Action Scheduler’s background cleanup for the same selected statuses. 0 = delete all matching actions on every cleanup run. Required." 212 msgstr "Wie lange Aktionen vor dem Löschen aufbewahrt werden (Abschluss- oder letzter Ausführungszeitpunkt, nicht Planungsdatum), für die oben gewählten Status. Mit aktiviertem Aktions-Bereinigungszeitplan: nur für den Cronjob dieses Plugins. Ohne diesen Zeitplan: wird an die Hintergrundbereinigung von Action Scheduler für dieselben Status übergeben. 0 = bei jedem Bereinigungslauf alle passenden Aktionen löschen. Pflichtfeld." 213 214 msgid "Logs" 215 msgstr "Protokolle" 216 217 msgid "How often to run cleanup (empty or 0 = disabled, 1-365 days)." 218 msgstr "Wie oft die Bereinigung ausgeführt wird (leer oder 0 = deaktiviert, 1–365 Tage)." 219 220 msgid "This plugin only: how often its WordPress cron job deletes old log entries (empty or 0 = disabled, 1–365 days). Action Scheduler does not clean logs automatically. This is not the retention period." 221 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Protokolleinträge löscht (leer oder 0 = deaktiviert, 1–365 Tage). Action Scheduler bereinigt Protokolle nicht automatisch. Das ist nicht die Aufbewahrungsfrist." 222 223 msgid "This plugin only: time of day for its log cleanup job (WordPress timezone)." 224 msgstr "Nur dieses Plugin: Tageszeit für den Protokoll-Bereinigungsjob (WordPress-Zeitzone)." 225 226 msgid "This plugin only: delete log entries older than this many days (0 = delete all logs on each cleanup run). Required." 227 msgstr "Nur dieses Plugin: Protokolleinträge löschen, die älter sind als diese Anzahl Tage (0 = bei jedem Bereinigungslauf alle Protokolle löschen). Pflichtfeld." 228 229 msgid "Actions schedule interval must be empty or between 1 and 365 days." 230 msgstr "Das Intervall für den Aktionszeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 231 232 msgid "Logs schedule interval must be empty or between 1 and 365 days." 233 msgstr "Das Intervall für den Protokollzeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 234 235 msgid "Actions schedule time must be in HH:MM format." 236 msgstr "Die Zeit für den Aktionszeitplan muss im Format HH:MM angegeben werden." 237 238 msgid "Logs schedule time must be in HH:MM format." 239 msgstr "Die Zeit für den Protokollzeitplan muss im Format HH:MM angegeben werden." 240 241 msgid "Actions retention period is required and must be between 0 and 365 days." 242 msgstr "Die Aufbewahrungsfrist für Aktionen ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 243 244 msgid "Logs retention period is required and must be between 0 and 365 days." 245 msgstr "Die Aufbewahrungsfrist für Protokolle ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 246 365 #: includes/class-wsacsc-ajax.php:411 366 msgid "Invalid cleanup ID." 367 msgstr "Ungültige Bereinigungs-ID." 368 369 #: includes/class-wsacsc-ajax.php:427 370 msgid "Cleanup progress was lost or is continuing in the background. Refresh the page to check table sizes." 371 msgstr "Der Bereinigungsfortschritt ging verloren oder die Bereinigung läuft im Hintergrund weiter. Lade die Seite neu, um die Tabellengrössen zu prüfen." 372 373 #: includes/class-wsacsc-ajax.php:435 374 msgid "Invalid cleanup progress data." 375 msgstr "Ungültige Fortschrittsdaten der Bereinigung." 376 377 #: includes/class-wsacsc-ajax.php:441 378 msgid "An error occurred during cleanup." 379 msgstr "Während der Bereinigung ist ein Fehler aufgetreten." 380 381 #: includes/class-wsacsc-ajax.php:453 382 msgid "Cleanup completed successfully!" 383 msgstr "Bereinigung erfolgreich abgeschlossen!" 384 385 #. translators: %d: number of days. 386 #: includes/class-wsacsc-scheduler.php:245 387 #, php-format 388 msgid "Every %d day" 389 msgid_plural "Every %d days" 390 msgstr[0] "Jeden Tag" 391 msgstr[1] "Alle %d Tage" 392 393 #. translators: 1: rows deleted so far, 2: rows to delete in total, 3: percentage done. 394 #: includes/helpers.php:329 395 #, php-format 396 msgid "Clearing in progress… %1$s of %2$s rows deleted (%3$d%%)." 397 msgstr "Bereinigung läuft… %1$s von %2$s Zeilen gelöscht (%3$d %%)." 398 399 #. translators: %s: number of rows deleted so far. 400 #: includes/helpers.php:342 401 #, php-format 247 402 msgid "Clearing in progress… %s rows deleted so far." 248 403 msgstr "Bereinigung läuft… bisher %s Zeilen gelöscht." 249 250 msgid "Cleanup completed successfully!"251 msgstr "Bereinigung erfolgreich abgeschlossen!"252 253 msgid "Another cleanup or optimization is already running. Please wait until it finishes."254 msgstr "Eine andere Bereinigung oder Optimierung läuft bereits. Bitte warte, bis sie abgeschlossen ist."255 256 msgid "An error occurred while clearing actions."257 msgstr "Beim Bereinigen der Aktionen ist ein Fehler aufgetreten."258 259 msgid "An error occurred while clearing logs."260 msgstr "Beim Bereinigen der Protokolle ist ein Fehler aufgetreten."261 262 msgid "Cleanup progress was lost or is continuing in the background. Refresh the page to check table sizes."263 msgstr "Der Bereinigungsfortschritt ging verloren oder die Bereinigung läuft im Hintergrund weiter. Lade die Seite neu, um die Tabellengrößen zu prüfen."264 265 msgid "An error occurred during cleanup."266 msgstr "Während der Bereinigung ist ein Fehler aufgetreten."267 268 msgid "Retrying…"269 msgstr "Erneuter Versuch…" -
ws-action-scheduler-cleaner/trunk/languages/ws-action-scheduler-cleaner-de_DE.po
r3750500 r3798362 1 # 1 2 msgid "" 2 3 msgstr "" 3 4 "Project-Id-Version: WS Action Scheduler Cleaner\n" 4 "Report-Msgid-Bugs-To: \n"5 "POT-Creation-Date: 202 4-10-10 12:00+0000\n"6 "PO-Revision-Date: 202 5-11-24 18:00+0100\n"5 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ws-action-scheduler-cleaner\n" 6 "POT-Creation-Date: 2026-11-10T20:25:22+00:00\n" 7 "PO-Revision-Date: 2026-11-10 12:00+0000\n" 7 8 "Last-Translator: Marco Brack <mbrack@winning-solutions.de>\n" 8 9 "Language-Team: \n" … … 14 15 "X-Generator: Poedit 3.8\n" 15 16 17 #. Plugin Name of the plugin 18 #: ws-action-scheduler-cleaner.php includes/class-wsacsc-admin.php:70 includes/class-wsacsc-admin.php:149 includes/class-wsacsc-admin.php:156 16 19 msgid "WS Action Scheduler Cleaner" 17 20 msgstr "WS Action Scheduler Cleaner" 18 21 22 #. Description of the plugin 23 #: ws-action-scheduler-cleaner.php 24 msgid "Suffering from database bloat? Try cleaning up the Action Scheduler tables through an easy-to-understand GUI." 25 msgstr "Leidet deine Datenbank unter aufgeblähten Tabellen? Bereinige die Action-Scheduler-Tabellen über eine leicht verständliche Oberfläche." 26 27 #. Author of the plugin 28 #: ws-action-scheduler-cleaner.php 29 msgid "Winning Solutions - Nagel & Mäder GbR" 30 msgstr "Winning Solutions - Nagel & Mäder GbR" 31 32 #. Author URI of the plugin 33 #: ws-action-scheduler-cleaner.php 34 msgid "https://www.winning-solutions.de" 35 msgstr "https://www.winning-solutions.de" 36 37 #: includes/class-wsacsc-admin.php:40 38 msgid "Settings" 39 msgstr "Einstellungen" 40 41 #: includes/class-wsacsc-admin.php:71 42 msgid "WS AS Cleaner" 43 msgstr "WS AS Cleaner" 44 45 #: includes/class-wsacsc-admin.php:118 includes/class-wsacsc-ajax.php:108 includes/class-wsacsc-ajax.php:314 46 msgid "Please select at least one status to clear." 47 msgstr "Bitte wähle mindestens einen Status zum Bereinigen aus." 48 49 #: includes/class-wsacsc-admin.php:119 includes/helpers.php:337 50 msgid "Clearing in progress..." 51 msgstr "Bereinigung läuft..." 52 53 #: includes/class-wsacsc-admin.php:120 54 msgid "Please wait..." 55 msgstr "Bitte warte..." 56 57 #: includes/class-wsacsc-admin.php:121 58 msgid "An error occurred. Please try again." 59 msgstr "Ein Fehler ist aufgetreten. Bitte versuche es erneut." 60 61 #: includes/class-wsacsc-admin.php:122 includes/class-wsacsc-ajax.php:138 62 msgid "Selected actions cleared successfully!" 63 msgstr "Ausgewählte Aktionen erfolgreich bereinigt!" 64 65 #: includes/class-wsacsc-admin.php:123 includes/class-wsacsc-ajax.php:180 includes/class-wsacsc-ajax.php:197 66 msgid "Logs cleared successfully!" 67 msgstr "Protokolle erfolgreich bereinigt!" 68 69 #: includes/class-wsacsc-admin.php:124 includes/class-wsacsc-ajax.php:295 70 msgid "Schedule saved successfully!" 71 msgstr "Zeitplan erfolgreich gespeichert!" 72 73 #: includes/class-wsacsc-admin.php:125 includes/class-wsacsc-ajax.php:319 74 msgid "Statuses saved successfully!" 75 msgstr "Status erfolgreich gespeichert!" 76 77 #: includes/class-wsacsc-admin.php:126 78 msgid "Optimizing table..." 79 msgstr "Tabelle wird optimiert..." 80 81 #: includes/class-wsacsc-admin.php:127 includes/class-wsacsc-admin.php:189 includes/class-wsacsc-admin.php:191 includes/class-wsacsc-admin.php:197 includes/class-wsacsc-admin.php:199 82 msgid "Loading..." 83 msgstr "Wird geladen..." 84 85 #: includes/class-wsacsc-admin.php:128 includes/class-wsacsc-ajax.php:382 86 msgid "Table optimization failed." 87 msgstr "Tabellenoptimierung fehlgeschlagen." 88 89 #: includes/class-wsacsc-admin.php:129 90 msgid "Please fix the highlighted fields before saving." 91 msgstr "Bitte korrigiere die markierten Felder vor dem Speichern." 92 93 #: includes/class-wsacsc-admin.php:130 includes/class-wsacsc-admin.php:192 94 msgid "Refresh actions table size" 95 msgstr "Größe der Aktionstabelle aktualisieren" 96 97 #: includes/class-wsacsc-admin.php:131 includes/class-wsacsc-admin.php:200 98 msgid "Refresh logs table size" 99 msgstr "Größe der Protokolltabelle aktualisieren" 100 101 #: includes/class-wsacsc-admin.php:132 102 msgid "Retrying…" 103 msgstr "Erneuter Versuch…" 104 105 #: includes/class-wsacsc-admin.php:150 106 msgid "Action Scheduler tables do not exist. Please ensure Action Scheduler is properly installed and activated." 107 msgstr "Die Action-Scheduler-Tabellen existieren nicht. Bitte stelle sicher, dass Action Scheduler ordnungsgemäß installiert und aktiviert ist." 108 109 #: includes/class-wsacsc-admin.php:159 19 110 msgid "This tool allows you to clean up the Action Scheduler tables in your WordPress database. Action Scheduler is a library used by many plugins to schedule background tasks." 20 111 msgstr "Dieses Tool ermöglicht es dir, die Action Scheduler-Tabellen in deiner WordPress-Datenbank zu bereinigen. Action Scheduler ist eine Bibliothek, die von vielen Plugins zur Planung von Hintergrundaufgaben verwendet wird." 21 112 22 msgid "Please wait..." 23 msgstr "Bitte warte..." 24 25 msgid "Loading..." 26 msgstr "Wird geladen..." 27 113 #: includes/class-wsacsc-admin.php:160 28 114 msgid "The Action Scheduler uses two main tables:" 29 115 msgstr "Der Action Scheduler verwendet zwei Haupttabellen:" 30 116 117 #: includes/class-wsacsc-admin.php:162 31 118 msgid "Actions Table: Stores scheduled actions and their statuses." 32 119 msgstr "Aktionstabelle: Speichert geplante Aktionen und deren Status." 33 120 121 #: includes/class-wsacsc-admin.php:163 34 122 msgid "Logs Table: Stores logs of action executions." 35 123 msgstr "Protokolltabelle: Speichert Protokolle von Aktionsausführungen." 36 124 125 #: includes/class-wsacsc-admin.php:165 37 126 msgid "Clearing these tables is generally safe and can improve database performance. However, please note:" 38 127 msgstr "Das Bereinigen dieser Tabellen ist im Allgemeinen sicher und kann die Datenbankleistung verbessern. Bitte beachte jedoch:" 39 128 129 #: includes/class-wsacsc-admin.php:167 40 130 msgid "Clearing can take a while depending on the size of the tables." 41 131 msgstr "Die Bereinigung kann je nach Größe der Tabellen eine Weile dauern." 42 132 133 #: includes/class-wsacsc-admin.php:168 43 134 msgid "Cleared data will be permanently deleted." 44 135 msgstr "Bereinigte Daten werden dauerhaft gelöscht." 45 136 137 #: includes/class-wsacsc-admin.php:169 46 138 msgid "It's recommended to <strong>make a backup</strong> before proceeding." 47 139 msgstr "Es wird empfohlen, vor dem Fortfahren ein <strong>Backup zu erstellen</strong>." 48 140 141 #: includes/class-wsacsc-admin.php:170 49 142 msgid "Clearing completed, failed, or canceled actions usually doesn't affect WordPress functionality." 50 143 msgstr "Das Bereinigen von abgeschlossenen, fehlgeschlagenen oder abgebrochenen Aktionen beeinträchtigt normalerweise nicht die WordPress-Funktionalität." 51 144 145 #. translators: %s: URL to Action Scheduler admin page 146 #: includes/class-wsacsc-admin.php:177 147 #, php-format 52 148 msgid "For more information, visit the <a href=\"%s\">Action Scheduler admin page</a>." 53 149 msgstr "Weitere Informationen findest du auf der <a href=\"%s\">Action Scheduler-Administrationsseite</a>." 54 150 151 #: includes/class-wsacsc-admin.php:186 55 152 msgid "Current Table Sizes:" 56 153 msgstr "Aktuelle Tabellengrößen:" 57 154 155 #: includes/class-wsacsc-admin.php:188 58 156 msgid "Actions table:" 59 157 msgstr "Aktionstabelle:" 60 158 159 #: includes/class-wsacsc-admin.php:190 includes/class-wsacsc-admin.php:198 61 160 msgid "rows" 62 161 msgstr "Zeilen" 63 162 163 #: includes/class-wsacsc-admin.php:196 64 164 msgid "Logs table:" 65 165 msgstr "Protokolltabelle:" 66 166 167 #: includes/class-wsacsc-admin.php:207 67 168 msgid "Clear Action Statuses" 68 169 msgstr "Aktionsstatus bereinigen" 69 170 70 msgid "Select which action statuses to clear:" 71 msgstr "Wähle aus, welche Aktionsstatus bereinigt werden sollen:" 72 171 #: includes/class-wsacsc-admin.php:209 172 msgid "Action statuses to clear" 173 msgstr "Zu bereinigende Aktionsstatus" 174 175 #: includes/class-wsacsc-admin.php:210 73 176 msgid "Select which statuses to remove when clearing manually, when this plugin runs scheduled action cleanup, and (if this plugin’s action cleanup schedule is disabled) which statuses Action Scheduler may delete in the background:" 74 177 msgstr "Wähle aus, welche Status bei manueller Bereinigung, bei der geplanten Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) bei der Hintergrundbereinigung von Action Scheduler entfernt werden sollen:" 75 178 179 #: includes/class-wsacsc-admin.php:217 76 180 msgid "Complete" 77 181 msgstr "Abgeschlossen" 78 182 183 #: includes/class-wsacsc-admin.php:218 79 184 msgid "Failed" 80 185 msgstr "Fehlgeschlagen" 81 186 187 #: includes/class-wsacsc-admin.php:219 82 188 msgid "Canceled" 83 189 msgstr "Abgebrochen" 84 190 191 #: includes/class-wsacsc-admin.php:221 85 192 msgid "Clear Selected Actions" 86 193 msgstr "Ausgewählte Aktionen bereinigen" 87 194 195 #: includes/class-wsacsc-admin.php:226 88 196 msgid "Clear Logs Table" 89 197 msgstr "Protokolltabelle bereinigen" 90 198 199 #: includes/class-wsacsc-admin.php:227 91 200 msgid "This will clear all entries in the logs table." 92 201 msgstr "Dies wird alle Einträge in der Protokolltabelle löschen." 93 202 203 #: includes/class-wsacsc-admin.php:228 94 204 msgid "Clear Logs" 95 205 msgstr "Protokolle bereinigen" 96 206 207 #: includes/class-wsacsc-admin.php:232 208 msgid "Optimize Tables" 209 msgstr "Tabellen optimieren" 210 211 #: includes/class-wsacsc-admin.php:233 212 msgid "Optimize the database tables to reclaim unused space and potentially improve performance." 213 msgstr "Optimiere die Datenbanktabellen, um ungenutzten Speicherplatz freizugeben und möglicherweise die Leistung zu verbessern." 214 215 #: includes/class-wsacsc-admin.php:235 216 msgid "Optimize Actions Table" 217 msgstr "Aktionstabelle optimieren" 218 219 #: includes/class-wsacsc-admin.php:236 220 msgid "Optimize Logs Table" 221 msgstr "Protokolltabelle optimieren" 222 223 #: includes/class-wsacsc-admin.php:241 97 224 msgid "Scheduling Options" 98 225 msgstr "Planungsoptionen" 99 226 100 msgid "Set up automatic clearing schedules for selected statuses (set to 0 to clean fully; leave empty to disable automatic clearing):" 101 msgstr "Richte automatische Bereinigungspläne für ausgewählte Status ein (auf 0 setzen, um vollständig zu bereinigen; leer lassen, um die automatische Bereinigung zu deaktivieren):" 102 103 msgid "Clear logs older than:" 104 msgstr "Protokolle bereinigen, die älter sind als:" 105 227 #: includes/class-wsacsc-admin.php:242 228 msgid "Finished actions can be removed automatically in two ways: this plugin’s scheduled cleanup (settings below) and Action Scheduler’s own built-in background cleanup for the actions table. The status checkboxes in “Clear Action Statuses” above define which statuses are affected—manual clearing, this plugin’s scheduled action cleanup, and (when this plugin’s action cleanup schedule is disabled) Action Scheduler’s background deletions." 229 msgstr "Abgeschlossene Aktionen können auf zwei Arten automatisch entfernt werden: über die geplante Bereinigung dieses Plugins (Einstellungen unten) und über die eingebaute Hintergrundbereinigung von Action Scheduler für die Aktionstabelle. Die Status-Kontrollkästchen unter „Aktionsstatus bereinigen“ legen fest, welche Status betroffen sind – manuelle Bereinigung, die geplante Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) die Hintergrundlöschungen von Action Scheduler." 230 231 #: includes/class-wsacsc-admin.php:243 232 msgid "Cleanup schedule and retention period are separate. Cleanup schedule controls how often this plugin runs its own WordPress cron jobs (1–365 days, or empty/0 to disable). Retention period controls how old entries must be before they are deleted. For actions, age is measured by completion or last attempt time—not the original scheduled date." 233 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist sind getrennte Einstellungen. Der Bereinigungszeitplan legt fest, wie oft dieses Plugin seine eigenen WordPress-Cronjobs ausführt (1–365 Tage, oder leer/0 zum Deaktivieren). Die Aufbewahrungsfrist legt fest, wie alt Einträge sein müssen, bevor sie gelöscht werden. Bei Aktionen wird das Alter am Abschluss- oder letzten Ausführungszeitpunkt gemessen – nicht am ursprünglichen Planungsdatum." 234 235 #: includes/class-wsacsc-admin.php:244 236 msgid "If an actions cleanup schedule is enabled, only this plugin’s cron job deletes old actions (using the selected statuses above); Action Scheduler’s built-in action cleanup is turned off to avoid duplicate deletions. If that schedule is disabled, this plugin does not run scheduled action cleanup—the actions retention period is passed to Action Scheduler instead, which deletes actions in the selected statuses when they are older than that many days." 237 msgstr "Ist ein Bereinigungszeitplan für Aktionen aktiviert, löscht nur der Cronjob dieses Plugins alte Aktionen (mit den oben gewählten Status); die eingebaute Aktionsbereinigung von Action Scheduler wird deaktiviert, um doppelte Löschungen zu vermeiden. Ist dieser Zeitplan deaktiviert, führt dieses Plugin keine geplante Aktionsbereinigung aus – die Aufbewahrungsfrist für Aktionen wird stattdessen an Action Scheduler übergeben, das Aktionen in den gewählten Status löscht, wenn sie älter als die angegebene Anzahl Tage sind." 238 239 #: includes/class-wsacsc-admin.php:245 240 msgid "Logs cleanup schedule and logs retention apply only to this plugin; Action Scheduler does not clean the logs table on its own." 241 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist für Protokolle gelten nur für dieses Plugin; Action Scheduler bereinigt die Protokolltabelle nicht von sich aus." 242 243 #: includes/class-wsacsc-admin.php:246 244 msgid "This plugin does not hide status filters on the Action Scheduler admin screen. Tabs such as Complete or Failed only appear when actions with those statuses exist in the database. On sites with a very large pending backlog, few actions may finish; if counts stay at zero, those tabs will not show." 245 msgstr "Dieses Plugin blendet keine Statusfilter auf der Action-Scheduler-Verwaltungsseite aus. Registerkarten wie „Abgeschlossen“ oder „Fehlgeschlagen“ erscheinen nur, wenn Aktionen mit diesen Status in der Datenbank existieren. Bei sehr großem Pending-Rückstau werden wenige Aktionen abgeschlossen; bleiben die Zähler bei null, werden diese Registerkarten nicht angezeigt." 246 247 #: includes/class-wsacsc-admin.php:249 248 msgid "Action Statuses" 249 msgstr "Aktionsstatus" 250 251 #: includes/class-wsacsc-admin.php:251 includes/class-wsacsc-admin.php:277 252 msgid "Cleanup Schedule:" 253 msgstr "Bereinigungszeitplan:" 254 255 #: includes/class-wsacsc-admin.php:254 includes/class-wsacsc-admin.php:269 includes/class-wsacsc-admin.php:280 includes/class-wsacsc-admin.php:295 106 256 msgid "days" 107 257 msgstr "Tage" 108 258 109 msgid "Clear action statuses older than:" 110 msgstr "Aktionsstatus bereinigen, die älter sind als:" 111 259 #: includes/class-wsacsc-admin.php:256 260 msgid "This plugin only: how often its WordPress cron job deletes old actions (empty or 0 = disabled, 1–365 days). When enabled, Action Scheduler’s built-in action cleanup is disabled. This is not the retention period." 261 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Aktionen löscht (leer oder 0 = deaktiviert, 1–365 Tage). Wenn aktiviert, ist die eingebaute Aktionsbereinigung von Action Scheduler deaktiviert. Das ist nicht die Aufbewahrungsfrist." 262 263 #: includes/class-wsacsc-admin.php:259 includes/class-wsacsc-admin.php:285 264 msgid "Schedule Time:" 265 msgstr "Zeitplan:" 266 267 #: includes/class-wsacsc-admin.php:263 268 msgid "This plugin only: time of day for its action cleanup job (WordPress timezone)." 269 msgstr "Nur dieses Plugin: Tageszeit für den Aktions-Bereinigungsjob (WordPress-Zeitzone)." 270 271 #: includes/class-wsacsc-admin.php:266 includes/class-wsacsc-admin.php:292 272 msgid "Retention Period:" 273 msgstr "Aufbewahrungsfrist:" 274 275 #: includes/class-wsacsc-admin.php:271 276 msgid "How long to keep actions before deletion (by completion or last attempt time, not scheduled date), for the statuses selected above. With a plugin action cleanup schedule enabled: used only by this plugin’s cron job. With that schedule disabled: passed to Action Scheduler’s background cleanup for the same selected statuses. 0 = delete all matching actions on every cleanup run. Required." 277 msgstr "Wie lange Aktionen vor dem Löschen aufbewahrt werden (Abschluss- oder letzter Ausführungszeitpunkt, nicht Planungsdatum), für die oben gewählten Status. Mit aktiviertem Aktions-Bereinigungszeitplan: nur für den Cronjob dieses Plugins. Ohne diesen Zeitplan: wird an die Hintergrundbereinigung von Action Scheduler für dieselben Status übergeben. 0 = bei jedem Bereinigungslauf alle passenden Aktionen löschen. Pflichtfeld." 278 279 #: includes/class-wsacsc-admin.php:275 280 msgid "Logs" 281 msgstr "Protokolle" 282 283 #: includes/class-wsacsc-admin.php:282 284 msgid "This plugin only: how often its WordPress cron job deletes old log entries (empty or 0 = disabled, 1–365 days). Action Scheduler does not clean logs automatically. This is not the retention period." 285 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Protokolleinträge löscht (leer oder 0 = deaktiviert, 1–365 Tage). Action Scheduler bereinigt Protokolle nicht automatisch. Das ist nicht die Aufbewahrungsfrist." 286 287 #: includes/class-wsacsc-admin.php:289 288 msgid "This plugin only: time of day for its log cleanup job (WordPress timezone)." 289 msgstr "Nur dieses Plugin: Tageszeit für den Protokoll-Bereinigungsjob (WordPress-Zeitzone)." 290 291 #: includes/class-wsacsc-admin.php:297 292 msgid "This plugin only: delete log entries older than this many days (0 = delete all logs on each cleanup run). Required." 293 msgstr "Nur dieses Plugin: Protokolleinträge löschen, die älter sind als diese Anzahl Tage (0 = bei jedem Bereinigungslauf alle Protokolle löschen). Pflichtfeld." 294 295 #: includes/class-wsacsc-admin.php:301 112 296 msgid "Save Schedule" 113 297 msgstr "Zeitplan speichern" 114 298 299 #: includes/class-wsacsc-admin.php:307 115 300 msgid "Powered by Winning Solutions" 116 301 msgstr "Powered by Winning Solutions" 117 302 118 msgid "Selected actions cleared successfully!" 119 msgstr "Ausgewählte Aktionen erfolgreich bereinigt!" 120 121 msgid "Logs cleared successfully!" 122 msgstr "Protokolle erfolgreich bereinigt!" 123 124 msgid "Schedule saved successfully!" 125 msgstr "Zeitplan erfolgreich gespeichert!" 126 303 #: includes/class-wsacsc-ajax.php:37 304 msgid "Another cleanup or optimization is already running. Please wait until it finishes." 305 msgstr "Eine andere Bereinigung oder Optimierung läuft bereits. Bitte warte, bis sie abgeschlossen ist." 306 307 #: includes/class-wsacsc-ajax.php:81 includes/class-wsacsc-ajax.php:96 includes/class-wsacsc-ajax.php:150 includes/class-wsacsc-ajax.php:209 includes/class-wsacsc-ajax.php:305 includes/class-wsacsc-ajax.php:329 includes/class-wsacsc-ajax.php:356 includes/class-wsacsc-ajax.php:404 308 msgid "Insufficient permissions." 309 msgstr "Unzureichende Berechtigungen." 310 311 #: includes/class-wsacsc-ajax.php:112 includes/class-wsacsc-ajax.php:156 312 msgid "Action Scheduler tables do not exist." 313 msgstr "Die Action-Scheduler-Tabellen existieren nicht." 314 315 #: includes/class-wsacsc-ajax.php:131 316 msgid "An error occurred while clearing actions." 317 msgstr "Beim Bereinigen der Aktionen ist ein Fehler aufgetreten." 318 319 #: includes/class-wsacsc-ajax.php:190 320 msgid "An error occurred while clearing logs." 321 msgstr "Beim Bereinigen der Protokolle ist ein Fehler aufgetreten." 322 323 #: includes/class-wsacsc-ajax.php:230 324 msgid "Actions schedule interval must be empty or between 1 and 365 days." 325 msgstr "Das Intervall für den Aktionszeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 326 327 #: includes/class-wsacsc-ajax.php:234 328 msgid "Logs schedule interval must be empty or between 1 and 365 days." 329 msgstr "Das Intervall für den Protokollzeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 330 331 #: includes/class-wsacsc-ajax.php:238 332 msgid "Actions schedule time must be in HH:MM format." 333 msgstr "Die Zeit für den Aktionszeitplan muss im Format HH:MM angegeben werden." 334 335 #: includes/class-wsacsc-ajax.php:242 336 msgid "Logs schedule time must be in HH:MM format." 337 msgstr "Die Zeit für den Protokollzeitplan muss im Format HH:MM angegeben werden." 338 339 #: includes/class-wsacsc-ajax.php:246 340 msgid "Actions retention period is required and must be between 0 and 365 days." 341 msgstr "Die Aufbewahrungsfrist für Aktionen ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 342 343 #: includes/class-wsacsc-ajax.php:250 344 msgid "Logs retention period is required and must be between 0 and 365 days." 345 msgstr "Die Aufbewahrungsfrist für Protokolle ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 346 347 #: includes/class-wsacsc-ajax.php:288 348 msgid "Failed to save schedule. Please try again." 349 msgstr "Der Zeitplan konnte nicht gespeichert werden. Bitte versuche es erneut." 350 351 #: includes/class-wsacsc-ajax.php:292 127 352 msgid "The settings were saved, but the cleanup schedule could not be updated yet. The plugin will retry automatically." 128 353 msgstr "Die Einstellungen wurden gespeichert, aber der Bereinigungszeitplan konnte noch nicht aktualisiert werden. Das Plugin versucht es automatisch erneut." 129 354 130 msgid "Statuses saved successfully!" 131 msgstr "Status erfolgreich gespeichert!" 132 133 msgid "Settings" 134 msgstr "Einstellungen" 135 136 msgid "Action Scheduler tables do not exist. Please ensure Action Scheduler is properly installed and activated." 137 msgstr "Die Action-Scheduler-Tabellen existieren nicht. Bitte stelle sicher, dass Action Scheduler ordnungsgemäß installiert und aktiviert ist." 138 139 msgid "Please select at least one status to clear." 140 msgstr "Bitte wähle mindestens einen Status zum Bereinigen aus." 141 142 msgid "Clearing in progress..." 143 msgstr "Bereinigung läuft..." 144 145 msgid "An error occurred. Please try again." 146 msgstr "Ein Fehler ist aufgetreten. Bitte versuche es erneut." 147 148 msgid "Optimize Tables" 149 msgstr "Tabellen optimieren" 150 151 msgid "Optimize the database tables to reclaim unused space and potentially improve performance." 152 msgstr "Optimiere die Datenbanktabellen, um ungenutzten Speicherplatz freizugeben und möglicherweise die Leistung zu verbessern." 153 154 msgid "Optimize Actions Table" 155 msgstr "Aktionstabelle optimieren" 156 157 msgid "Optimize Logs Table" 158 msgstr "Protokolltabelle optimieren" 159 160 msgid "Optimizing table..." 161 msgstr "Tabelle wird optimiert..." 162 355 #: includes/class-wsacsc-ajax.php:336 includes/class-wsacsc-ajax.php:363 356 msgid "Invalid table type." 357 msgstr "Ungültiger Tabellentyp." 358 359 #. translators: %s: table type (actions or logs). 360 #: includes/class-wsacsc-ajax.php:390 361 #, php-format 163 362 msgid "%s table optimized successfully!" 164 363 msgstr "%s-Tabelle erfolgreich optimiert!" 165 364 166 msgid "Table optimization failed." 167 msgstr "Tabellenoptimierung fehlgeschlagen." 168 169 msgid "Table does not exist." 170 msgstr "Tabelle existiert nicht." 171 172 msgid "Invalid table type." 173 msgstr "Ungültiger Tabellentyp." 174 175 msgid "Insufficient permissions." 176 msgstr "Unzureichende Berechtigungen." 177 178 msgid "Finished actions can be removed automatically in two ways: this plugin’s scheduled cleanup (settings below) and Action Scheduler’s own built-in background cleanup for the actions table. The status checkboxes in “Clear Action Statuses” above define which statuses are affected—manual clearing, this plugin’s scheduled action cleanup, and (when this plugin’s action cleanup schedule is disabled) Action Scheduler’s background deletions." 179 msgstr "Abgeschlossene Aktionen können auf zwei Arten automatisch entfernt werden: über die geplante Bereinigung dieses Plugins (Einstellungen unten) und über die eingebaute Hintergrundbereinigung von Action Scheduler für die Aktionstabelle. Die Status-Kontrollkästchen unter „Aktionsstatus bereinigen“ legen fest, welche Status betroffen sind – manuelle Bereinigung, die geplante Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) die Hintergrundlöschungen von Action Scheduler." 180 181 msgid "Cleanup schedule and retention period are separate. Cleanup schedule controls how often this plugin runs its own WordPress cron jobs (1–365 days, or empty/0 to disable). Retention period controls how old entries must be before they are deleted. For actions, age is measured by completion or last attempt time—not the original scheduled date." 182 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist sind getrennte Einstellungen. Der Bereinigungszeitplan legt fest, wie oft dieses Plugin seine eigenen WordPress-Cronjobs ausführt (1–365 Tage, oder leer/0 zum Deaktivieren). Die Aufbewahrungsfrist legt fest, wie alt Einträge sein müssen, bevor sie gelöscht werden. Bei Aktionen wird das Alter am Abschluss- oder letzten Ausführungszeitpunkt gemessen – nicht am ursprünglichen Planungsdatum." 183 184 msgid "If an actions cleanup schedule is enabled, only this plugin’s cron job deletes old actions (using the selected statuses above); Action Scheduler’s built-in action cleanup is turned off to avoid duplicate deletions. If that schedule is disabled, this plugin does not run scheduled action cleanup—the actions retention period is passed to Action Scheduler instead, which deletes actions in the selected statuses when they are older than that many days." 185 msgstr "Ist ein Bereinigungszeitplan für Aktionen aktiviert, löscht nur der Cronjob dieses Plugins alte Aktionen (mit den oben gewählten Status); die eingebaute Aktionsbereinigung von Action Scheduler wird deaktiviert, um doppelte Löschungen zu vermeiden. Ist dieser Zeitplan deaktiviert, führt dieses Plugin keine geplante Aktionsbereinigung aus – die Aufbewahrungsfrist für Aktionen wird stattdessen an Action Scheduler übergeben, das Aktionen in den gewählten Status löscht, wenn sie älter als die angegebene Anzahl Tage sind." 186 187 msgid "Logs cleanup schedule and logs retention apply only to this plugin; Action Scheduler does not clean the logs table on its own." 188 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist für Protokolle gelten nur für dieses Plugin; Action Scheduler bereinigt die Protokolltabelle nicht von sich aus." 189 190 msgid "This plugin does not hide status filters on the Action Scheduler admin screen. Tabs such as Complete or Failed only appear when actions with those statuses exist in the database. On sites with a very large pending backlog, few actions may finish; if counts stay at zero, those tabs will not show." 191 msgstr "Dieses Plugin blendet keine Statusfilter auf der Action-Scheduler-Verwaltungsseite aus. Registerkarten wie „Abgeschlossen“ oder „Fehlgeschlagen“ erscheinen nur, wenn Aktionen mit diesen Status in der Datenbank existieren. Bei sehr großem Pending-Rückstau werden wenige Aktionen abgeschlossen; bleiben die Zähler bei null, werden diese Registerkarten nicht angezeigt." 192 193 msgid "Action Statuses" 194 msgstr "Aktionsstatus" 195 196 msgid "Cleanup Schedule:" 197 msgstr "Bereinigungszeitplan:" 198 199 msgid "This plugin only: how often its WordPress cron job deletes old actions (empty or 0 = disabled, 1–365 days). When enabled, Action Scheduler’s built-in action cleanup is disabled. This is not the retention period." 200 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Aktionen löscht (leer oder 0 = deaktiviert, 1–365 Tage). Wenn aktiviert, ist die eingebaute Aktionsbereinigung von Action Scheduler deaktiviert. Das ist nicht die Aufbewahrungsfrist." 201 202 msgid "Schedule Time:" 203 msgstr "Zeitplan:" 204 205 msgid "This plugin only: time of day for its action cleanup job (WordPress timezone)." 206 msgstr "Nur dieses Plugin: Tageszeit für den Aktions-Bereinigungsjob (WordPress-Zeitzone)." 207 208 msgid "Retention Period:" 209 msgstr "Aufbewahrungsfrist:" 210 211 msgid "How long to keep actions before deletion (by completion or last attempt time, not scheduled date), for the statuses selected above. With a plugin action cleanup schedule enabled: used only by this plugin’s cron job. With that schedule disabled: passed to Action Scheduler’s background cleanup for the same selected statuses. 0 = delete all matching actions on every cleanup run. Required." 212 msgstr "Wie lange Aktionen vor dem Löschen aufbewahrt werden (Abschluss- oder letzter Ausführungszeitpunkt, nicht Planungsdatum), für die oben gewählten Status. Mit aktiviertem Aktions-Bereinigungszeitplan: nur für den Cronjob dieses Plugins. Ohne diesen Zeitplan: wird an die Hintergrundbereinigung von Action Scheduler für dieselben Status übergeben. 0 = bei jedem Bereinigungslauf alle passenden Aktionen löschen. Pflichtfeld." 213 214 msgid "Logs" 215 msgstr "Protokolle" 216 217 msgid "How often to run cleanup (empty or 0 = disabled, 1-365 days)." 218 msgstr "Wie oft die Bereinigung ausgeführt wird (leer oder 0 = deaktiviert, 1–365 Tage)." 219 220 msgid "This plugin only: how often its WordPress cron job deletes old log entries (empty or 0 = disabled, 1–365 days). Action Scheduler does not clean logs automatically. This is not the retention period." 221 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Protokolleinträge löscht (leer oder 0 = deaktiviert, 1–365 Tage). Action Scheduler bereinigt Protokolle nicht automatisch. Das ist nicht die Aufbewahrungsfrist." 222 223 msgid "This plugin only: time of day for its log cleanup job (WordPress timezone)." 224 msgstr "Nur dieses Plugin: Tageszeit für den Protokoll-Bereinigungsjob (WordPress-Zeitzone)." 225 226 msgid "This plugin only: delete log entries older than this many days (0 = delete all logs on each cleanup run). Required." 227 msgstr "Nur dieses Plugin: Protokolleinträge löschen, die älter sind als diese Anzahl Tage (0 = bei jedem Bereinigungslauf alle Protokolle löschen). Pflichtfeld." 228 229 msgid "Actions schedule interval must be empty or between 1 and 365 days." 230 msgstr "Das Intervall für den Aktionszeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 231 232 msgid "Logs schedule interval must be empty or between 1 and 365 days." 233 msgstr "Das Intervall für den Protokollzeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 234 235 msgid "Actions schedule time must be in HH:MM format." 236 msgstr "Die Zeit für den Aktionszeitplan muss im Format HH:MM angegeben werden." 237 238 msgid "Logs schedule time must be in HH:MM format." 239 msgstr "Die Zeit für den Protokollzeitplan muss im Format HH:MM angegeben werden." 240 241 msgid "Actions retention period is required and must be between 0 and 365 days." 242 msgstr "Die Aufbewahrungsfrist für Aktionen ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 243 244 msgid "Logs retention period is required and must be between 0 and 365 days." 245 msgstr "Die Aufbewahrungsfrist für Protokolle ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 246 365 #: includes/class-wsacsc-ajax.php:411 366 msgid "Invalid cleanup ID." 367 msgstr "Ungültige Bereinigungs-ID." 368 369 #: includes/class-wsacsc-ajax.php:427 370 msgid "Cleanup progress was lost or is continuing in the background. Refresh the page to check table sizes." 371 msgstr "Der Bereinigungsfortschritt ging verloren oder die Bereinigung läuft im Hintergrund weiter. Lade die Seite neu, um die Tabellengrößen zu prüfen." 372 373 #: includes/class-wsacsc-ajax.php:435 374 msgid "Invalid cleanup progress data." 375 msgstr "Ungültige Fortschrittsdaten der Bereinigung." 376 377 #: includes/class-wsacsc-ajax.php:441 378 msgid "An error occurred during cleanup." 379 msgstr "Während der Bereinigung ist ein Fehler aufgetreten." 380 381 #: includes/class-wsacsc-ajax.php:453 382 msgid "Cleanup completed successfully!" 383 msgstr "Bereinigung erfolgreich abgeschlossen!" 384 385 #. translators: %d: number of days. 386 #: includes/class-wsacsc-scheduler.php:245 387 #, php-format 388 msgid "Every %d day" 389 msgid_plural "Every %d days" 390 msgstr[0] "Jeden Tag" 391 msgstr[1] "Alle %d Tage" 392 393 #. translators: 1: rows deleted so far, 2: rows to delete in total, 3: percentage done. 394 #: includes/helpers.php:329 395 #, php-format 396 msgid "Clearing in progress… %1$s of %2$s rows deleted (%3$d%%)." 397 msgstr "Bereinigung läuft… %1$s von %2$s Zeilen gelöscht (%3$d %%)." 398 399 #. translators: %s: number of rows deleted so far. 400 #: includes/helpers.php:342 401 #, php-format 247 402 msgid "Clearing in progress… %s rows deleted so far." 248 403 msgstr "Bereinigung läuft… bisher %s Zeilen gelöscht." 249 250 msgid "Cleanup completed successfully!"251 msgstr "Bereinigung erfolgreich abgeschlossen!"252 253 msgid "Another cleanup or optimization is already running. Please wait until it finishes."254 msgstr "Eine andere Bereinigung oder Optimierung läuft bereits. Bitte warte, bis sie abgeschlossen ist."255 256 msgid "An error occurred while clearing actions."257 msgstr "Beim Bereinigen der Aktionen ist ein Fehler aufgetreten."258 259 msgid "An error occurred while clearing logs."260 msgstr "Beim Bereinigen der Protokolle ist ein Fehler aufgetreten."261 262 msgid "Cleanup progress was lost or is continuing in the background. Refresh the page to check table sizes."263 msgstr "Der Bereinigungsfortschritt ging verloren oder die Bereinigung läuft im Hintergrund weiter. Lade die Seite neu, um die Tabellengrößen zu prüfen."264 265 msgid "An error occurred during cleanup."266 msgstr "Während der Bereinigung ist ein Fehler aufgetreten."267 268 msgid "Retrying…"269 msgstr "Erneuter Versuch…" -
ws-action-scheduler-cleaner/trunk/languages/ws-action-scheduler-cleaner-de_DE_formal.po
r3750500 r3798362 1 # 1 2 msgid "" 2 3 msgstr "" 3 4 "Project-Id-Version: WS Action Scheduler Cleaner\n" 4 "Report-Msgid-Bugs-To: \n"5 "POT-Creation-Date: 202 4-10-10 12:00+0000\n"6 "PO-Revision-Date: 202 5-11-24 18:00+0100\n"5 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ws-action-scheduler-cleaner\n" 6 "POT-Creation-Date: 2026-11-10T20:25:22+00:00\n" 7 "PO-Revision-Date: 2026-11-10 12:00+0000\n" 7 8 "Last-Translator: Marco Brack <mbrack@winning-solutions.de>\n" 8 9 "Language-Team: \n" … … 14 15 "X-Generator: Poedit 3.8\n" 15 16 17 #. Plugin Name of the plugin 18 #: ws-action-scheduler-cleaner.php includes/class-wsacsc-admin.php:70 includes/class-wsacsc-admin.php:149 includes/class-wsacsc-admin.php:156 16 19 msgid "WS Action Scheduler Cleaner" 17 20 msgstr "WS Action Scheduler Cleaner" 18 21 22 #. Description of the plugin 23 #: ws-action-scheduler-cleaner.php 24 msgid "Suffering from database bloat? Try cleaning up the Action Scheduler tables through an easy-to-understand GUI." 25 msgstr "Leidet Ihre Datenbank unter aufgeblähten Tabellen? Bereinigen Sie die Action-Scheduler-Tabellen über eine leicht verständliche Oberfläche." 26 27 #. Author of the plugin 28 #: ws-action-scheduler-cleaner.php 29 msgid "Winning Solutions - Nagel & Mäder GbR" 30 msgstr "Winning Solutions - Nagel & Mäder GbR" 31 32 #. Author URI of the plugin 33 #: ws-action-scheduler-cleaner.php 34 msgid "https://www.winning-solutions.de" 35 msgstr "https://www.winning-solutions.de" 36 37 #: includes/class-wsacsc-admin.php:40 38 msgid "Settings" 39 msgstr "Einstellungen" 40 41 #: includes/class-wsacsc-admin.php:71 42 msgid "WS AS Cleaner" 43 msgstr "WS AS Cleaner" 44 45 #: includes/class-wsacsc-admin.php:118 includes/class-wsacsc-ajax.php:108 includes/class-wsacsc-ajax.php:314 46 msgid "Please select at least one status to clear." 47 msgstr "Bitte wählen Sie mindestens einen Status zum Bereinigen aus." 48 49 #: includes/class-wsacsc-admin.php:119 includes/helpers.php:337 50 msgid "Clearing in progress..." 51 msgstr "Bereinigung läuft..." 52 53 #: includes/class-wsacsc-admin.php:120 54 msgid "Please wait..." 55 msgstr "Bitte warten Sie..." 56 57 #: includes/class-wsacsc-admin.php:121 58 msgid "An error occurred. Please try again." 59 msgstr "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut." 60 61 #: includes/class-wsacsc-admin.php:122 includes/class-wsacsc-ajax.php:138 62 msgid "Selected actions cleared successfully!" 63 msgstr "Ausgewählte Aktionen erfolgreich bereinigt!" 64 65 #: includes/class-wsacsc-admin.php:123 includes/class-wsacsc-ajax.php:180 includes/class-wsacsc-ajax.php:197 66 msgid "Logs cleared successfully!" 67 msgstr "Protokolle erfolgreich bereinigt!" 68 69 #: includes/class-wsacsc-admin.php:124 includes/class-wsacsc-ajax.php:295 70 msgid "Schedule saved successfully!" 71 msgstr "Zeitplan erfolgreich gespeichert!" 72 73 #: includes/class-wsacsc-admin.php:125 includes/class-wsacsc-ajax.php:319 74 msgid "Statuses saved successfully!" 75 msgstr "Status erfolgreich gespeichert!" 76 77 #: includes/class-wsacsc-admin.php:126 78 msgid "Optimizing table..." 79 msgstr "Tabelle wird optimiert..." 80 81 #: includes/class-wsacsc-admin.php:127 includes/class-wsacsc-admin.php:189 includes/class-wsacsc-admin.php:191 includes/class-wsacsc-admin.php:197 includes/class-wsacsc-admin.php:199 82 msgid "Loading..." 83 msgstr "Wird geladen..." 84 85 #: includes/class-wsacsc-admin.php:128 includes/class-wsacsc-ajax.php:382 86 msgid "Table optimization failed." 87 msgstr "Tabellenoptimierung fehlgeschlagen." 88 89 #: includes/class-wsacsc-admin.php:129 90 msgid "Please fix the highlighted fields before saving." 91 msgstr "Bitte korrigieren Sie die markierten Felder vor dem Speichern." 92 93 #: includes/class-wsacsc-admin.php:130 includes/class-wsacsc-admin.php:192 94 msgid "Refresh actions table size" 95 msgstr "Größe der Aktionstabelle aktualisieren" 96 97 #: includes/class-wsacsc-admin.php:131 includes/class-wsacsc-admin.php:200 98 msgid "Refresh logs table size" 99 msgstr "Größe der Protokolltabelle aktualisieren" 100 101 #: includes/class-wsacsc-admin.php:132 102 msgid "Retrying…" 103 msgstr "Erneuter Versuch…" 104 105 #: includes/class-wsacsc-admin.php:150 106 msgid "Action Scheduler tables do not exist. Please ensure Action Scheduler is properly installed and activated." 107 msgstr "Die Action-Scheduler-Tabellen existieren nicht. Bitte stellen Sie sicher, dass Action Scheduler ordnungsgemäß installiert und aktiviert ist." 108 109 #: includes/class-wsacsc-admin.php:159 19 110 msgid "This tool allows you to clean up the Action Scheduler tables in your WordPress database. Action Scheduler is a library used by many plugins to schedule background tasks." 20 111 msgstr "Dieses Tool ermöglicht es Ihnen, die Action Scheduler-Tabellen in Ihrer WordPress-Datenbank zu bereinigen. Action Scheduler ist eine Bibliothek, die von vielen Plugins zur Planung von Hintergrundaufgaben verwendet wird." 21 112 22 msgid "Please wait..." 23 msgstr "Bitte warten Sie..." 24 25 msgid "Loading..." 26 msgstr "Wird geladen..." 27 113 #: includes/class-wsacsc-admin.php:160 28 114 msgid "The Action Scheduler uses two main tables:" 29 115 msgstr "Der Action Scheduler verwendet zwei Haupttabellen:" 30 116 117 #: includes/class-wsacsc-admin.php:162 31 118 msgid "Actions Table: Stores scheduled actions and their statuses." 32 119 msgstr "Aktionstabelle: Speichert geplante Aktionen und deren Status." 33 120 121 #: includes/class-wsacsc-admin.php:163 34 122 msgid "Logs Table: Stores logs of action executions." 35 123 msgstr "Protokolltabelle: Speichert Protokolle von Aktionsausführungen." 36 124 125 #: includes/class-wsacsc-admin.php:165 37 126 msgid "Clearing these tables is generally safe and can improve database performance. However, please note:" 38 127 msgstr "Das Bereinigen dieser Tabellen ist im Allgemeinen sicher und kann die Datenbankleistung verbessern. Bitte beachten Sie jedoch:" 39 128 129 #: includes/class-wsacsc-admin.php:167 40 130 msgid "Clearing can take a while depending on the size of the tables." 41 131 msgstr "Die Bereinigung kann je nach Größe der Tabellen eine Weile dauern." 42 132 133 #: includes/class-wsacsc-admin.php:168 43 134 msgid "Cleared data will be permanently deleted." 44 135 msgstr "Bereinigte Daten werden dauerhaft gelöscht." 45 136 137 #: includes/class-wsacsc-admin.php:169 46 138 msgid "It's recommended to <strong>make a backup</strong> before proceeding." 47 139 msgstr "Es wird empfohlen, vor dem Fortfahren ein <strong>Backup zu erstellen</strong>." 48 140 141 #: includes/class-wsacsc-admin.php:170 49 142 msgid "Clearing completed, failed, or canceled actions usually doesn't affect WordPress functionality." 50 143 msgstr "Das Bereinigen von abgeschlossenen, fehlgeschlagenen oder abgebrochenen Aktionen beeinträchtigt normalerweise nicht die WordPress-Funktionalität." 51 144 145 #. translators: %s: URL to Action Scheduler admin page 146 #: includes/class-wsacsc-admin.php:177 147 #, php-format 52 148 msgid "For more information, visit the <a href=\"%s\">Action Scheduler admin page</a>." 53 149 msgstr "Weitere Informationen finden Sie auf der <a href=\"%s\">Action Scheduler-Administrationsseite</a>." 54 150 151 #: includes/class-wsacsc-admin.php:186 55 152 msgid "Current Table Sizes:" 56 153 msgstr "Aktuelle Tabellengrößen:" 57 154 155 #: includes/class-wsacsc-admin.php:188 58 156 msgid "Actions table:" 59 157 msgstr "Aktionstabelle:" 60 158 159 #: includes/class-wsacsc-admin.php:190 includes/class-wsacsc-admin.php:198 61 160 msgid "rows" 62 161 msgstr "Zeilen" 63 162 163 #: includes/class-wsacsc-admin.php:196 64 164 msgid "Logs table:" 65 165 msgstr "Protokolltabelle:" 66 166 167 #: includes/class-wsacsc-admin.php:207 67 168 msgid "Clear Action Statuses" 68 169 msgstr "Aktionsstatus bereinigen" 69 170 70 msgid "Select which action statuses to clear:" 71 msgstr "Wählen Sie aus, welche Aktionsstatus bereinigt werden sollen:" 72 171 #: includes/class-wsacsc-admin.php:209 172 msgid "Action statuses to clear" 173 msgstr "Zu bereinigende Aktionsstatus" 174 175 #: includes/class-wsacsc-admin.php:210 73 176 msgid "Select which statuses to remove when clearing manually, when this plugin runs scheduled action cleanup, and (if this plugin’s action cleanup schedule is disabled) which statuses Action Scheduler may delete in the background:" 74 177 msgstr "Wählen Sie aus, welche Status bei manueller Bereinigung, bei der geplanten Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) bei der Hintergrundbereinigung von Action Scheduler entfernt werden sollen:" 75 178 179 #: includes/class-wsacsc-admin.php:217 76 180 msgid "Complete" 77 181 msgstr "Abgeschlossen" 78 182 183 #: includes/class-wsacsc-admin.php:218 79 184 msgid "Failed" 80 185 msgstr "Fehlgeschlagen" 81 186 187 #: includes/class-wsacsc-admin.php:219 82 188 msgid "Canceled" 83 189 msgstr "Abgebrochen" 84 190 191 #: includes/class-wsacsc-admin.php:221 85 192 msgid "Clear Selected Actions" 86 193 msgstr "Ausgewählte Aktionen bereinigen" 87 194 195 #: includes/class-wsacsc-admin.php:226 88 196 msgid "Clear Logs Table" 89 197 msgstr "Protokolltabelle bereinigen" 90 198 199 #: includes/class-wsacsc-admin.php:227 91 200 msgid "This will clear all entries in the logs table." 92 201 msgstr "Dies wird alle Einträge in der Protokolltabelle löschen." 93 202 203 #: includes/class-wsacsc-admin.php:228 94 204 msgid "Clear Logs" 95 205 msgstr "Protokolle bereinigen" 96 206 207 #: includes/class-wsacsc-admin.php:232 208 msgid "Optimize Tables" 209 msgstr "Tabellen optimieren" 210 211 #: includes/class-wsacsc-admin.php:233 212 msgid "Optimize the database tables to reclaim unused space and potentially improve performance." 213 msgstr "Optimiere die Datenbanktabellen, um ungenutzten Speicherplatz freizugeben und möglicherweise die Leistung zu verbessern." 214 215 #: includes/class-wsacsc-admin.php:235 216 msgid "Optimize Actions Table" 217 msgstr "Aktionstabelle optimieren" 218 219 #: includes/class-wsacsc-admin.php:236 220 msgid "Optimize Logs Table" 221 msgstr "Protokolltabelle optimieren" 222 223 #: includes/class-wsacsc-admin.php:241 97 224 msgid "Scheduling Options" 98 225 msgstr "Planungsoptionen" 99 226 100 msgid "Set up automatic clearing schedules for selected statuses (set to 0 to clean fully; leave empty to disable automatic clearing):" 101 msgstr "Richten Sie automatische Bereinigungspläne für ausgewählte Status ein (auf 0 setzen, um vollständig zu bereinigen; leer lassen, um die automatische Bereinigung zu deaktivieren):" 102 103 msgid "Clear logs older than:" 104 msgstr "Protokolle bereinigen, die älter sind als:" 105 227 #: includes/class-wsacsc-admin.php:242 228 msgid "Finished actions can be removed automatically in two ways: this plugin’s scheduled cleanup (settings below) and Action Scheduler’s own built-in background cleanup for the actions table. The status checkboxes in “Clear Action Statuses” above define which statuses are affected—manual clearing, this plugin’s scheduled action cleanup, and (when this plugin’s action cleanup schedule is disabled) Action Scheduler’s background deletions." 229 msgstr "Abgeschlossene Aktionen können auf zwei Arten automatisch entfernt werden: über die geplante Bereinigung dieses Plugins (Einstellungen unten) und über die eingebaute Hintergrundbereinigung von Action Scheduler für die Aktionstabelle. Die Status-Kontrollkästchen unter „Aktionsstatus bereinigen“ legen fest, welche Status betroffen sind – manuelle Bereinigung, die geplante Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) die Hintergrundlöschungen von Action Scheduler." 230 231 #: includes/class-wsacsc-admin.php:243 232 msgid "Cleanup schedule and retention period are separate. Cleanup schedule controls how often this plugin runs its own WordPress cron jobs (1–365 days, or empty/0 to disable). Retention period controls how old entries must be before they are deleted. For actions, age is measured by completion or last attempt time—not the original scheduled date." 233 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist sind getrennte Einstellungen. Der Bereinigungszeitplan legt fest, wie oft dieses Plugin seine eigenen WordPress-Cronjobs ausführt (1–365 Tage, oder leer/0 zum Deaktivieren). Die Aufbewahrungsfrist legt fest, wie alt Einträge sein müssen, bevor sie gelöscht werden. Bei Aktionen wird das Alter am Abschluss- oder letzten Ausführungszeitpunkt gemessen – nicht am ursprünglichen Planungsdatum." 234 235 #: includes/class-wsacsc-admin.php:244 236 msgid "If an actions cleanup schedule is enabled, only this plugin’s cron job deletes old actions (using the selected statuses above); Action Scheduler’s built-in action cleanup is turned off to avoid duplicate deletions. If that schedule is disabled, this plugin does not run scheduled action cleanup—the actions retention period is passed to Action Scheduler instead, which deletes actions in the selected statuses when they are older than that many days." 237 msgstr "Ist ein Bereinigungszeitplan für Aktionen aktiviert, löscht nur der Cronjob dieses Plugins alte Aktionen (mit den oben gewählten Status); die eingebaute Aktionsbereinigung von Action Scheduler wird deaktiviert, um doppelte Löschungen zu vermeiden. Ist dieser Zeitplan deaktiviert, führt dieses Plugin keine geplante Aktionsbereinigung aus – die Aufbewahrungsfrist für Aktionen wird stattdessen an Action Scheduler übergeben, das Aktionen in den gewählten Status löscht, wenn sie älter als die angegebene Anzahl Tage sind." 238 239 #: includes/class-wsacsc-admin.php:245 240 msgid "Logs cleanup schedule and logs retention apply only to this plugin; Action Scheduler does not clean the logs table on its own." 241 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist für Protokolle gelten nur für dieses Plugin; Action Scheduler bereinigt die Protokolltabelle nicht von sich aus." 242 243 #: includes/class-wsacsc-admin.php:246 244 msgid "This plugin does not hide status filters on the Action Scheduler admin screen. Tabs such as Complete or Failed only appear when actions with those statuses exist in the database. On sites with a very large pending backlog, few actions may finish; if counts stay at zero, those tabs will not show." 245 msgstr "Dieses Plugin blendet keine Statusfilter auf der Action-Scheduler-Verwaltungsseite aus. Registerkarten wie „Abgeschlossen“ oder „Fehlgeschlagen“ erscheinen nur, wenn Aktionen mit diesen Status in der Datenbank existieren. Bei sehr großem Pending-Rückstau werden wenige Aktionen abgeschlossen; bleiben die Zähler bei null, werden diese Registerkarten nicht angezeigt." 246 247 #: includes/class-wsacsc-admin.php:249 248 msgid "Action Statuses" 249 msgstr "Aktionsstatus" 250 251 #: includes/class-wsacsc-admin.php:251 includes/class-wsacsc-admin.php:277 252 msgid "Cleanup Schedule:" 253 msgstr "Bereinigungszeitplan:" 254 255 #: includes/class-wsacsc-admin.php:254 includes/class-wsacsc-admin.php:269 includes/class-wsacsc-admin.php:280 includes/class-wsacsc-admin.php:295 106 256 msgid "days" 107 257 msgstr "Tage" 108 258 109 msgid "Clear action statuses older than:" 110 msgstr "Aktionsstatus bereinigen, die älter sind als:" 111 259 #: includes/class-wsacsc-admin.php:256 260 msgid "This plugin only: how often its WordPress cron job deletes old actions (empty or 0 = disabled, 1–365 days). When enabled, Action Scheduler’s built-in action cleanup is disabled. This is not the retention period." 261 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Aktionen löscht (leer oder 0 = deaktiviert, 1–365 Tage). Wenn aktiviert, ist die eingebaute Aktionsbereinigung von Action Scheduler deaktiviert. Das ist nicht die Aufbewahrungsfrist." 262 263 #: includes/class-wsacsc-admin.php:259 includes/class-wsacsc-admin.php:285 264 msgid "Schedule Time:" 265 msgstr "Zeitplan:" 266 267 #: includes/class-wsacsc-admin.php:263 268 msgid "This plugin only: time of day for its action cleanup job (WordPress timezone)." 269 msgstr "Nur dieses Plugin: Tageszeit für den Aktions-Bereinigungsjob (WordPress-Zeitzone)." 270 271 #: includes/class-wsacsc-admin.php:266 includes/class-wsacsc-admin.php:292 272 msgid "Retention Period:" 273 msgstr "Aufbewahrungsfrist:" 274 275 #: includes/class-wsacsc-admin.php:271 276 msgid "How long to keep actions before deletion (by completion or last attempt time, not scheduled date), for the statuses selected above. With a plugin action cleanup schedule enabled: used only by this plugin’s cron job. With that schedule disabled: passed to Action Scheduler’s background cleanup for the same selected statuses. 0 = delete all matching actions on every cleanup run. Required." 277 msgstr "Wie lange Aktionen vor dem Löschen aufbewahrt werden (Abschluss- oder letzter Ausführungszeitpunkt, nicht Planungsdatum), für die oben gewählten Status. Mit aktiviertem Aktions-Bereinigungszeitplan: nur für den Cronjob dieses Plugins. Ohne diesen Zeitplan: wird an die Hintergrundbereinigung von Action Scheduler für dieselben Status übergeben. 0 = bei jedem Bereinigungslauf alle passenden Aktionen löschen. Pflichtfeld." 278 279 #: includes/class-wsacsc-admin.php:275 280 msgid "Logs" 281 msgstr "Protokolle" 282 283 #: includes/class-wsacsc-admin.php:282 284 msgid "This plugin only: how often its WordPress cron job deletes old log entries (empty or 0 = disabled, 1–365 days). Action Scheduler does not clean logs automatically. This is not the retention period." 285 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Protokolleinträge löscht (leer oder 0 = deaktiviert, 1–365 Tage). Action Scheduler bereinigt Protokolle nicht automatisch. Das ist nicht die Aufbewahrungsfrist." 286 287 #: includes/class-wsacsc-admin.php:289 288 msgid "This plugin only: time of day for its log cleanup job (WordPress timezone)." 289 msgstr "Nur dieses Plugin: Tageszeit für den Protokoll-Bereinigungsjob (WordPress-Zeitzone)." 290 291 #: includes/class-wsacsc-admin.php:297 292 msgid "This plugin only: delete log entries older than this many days (0 = delete all logs on each cleanup run). Required." 293 msgstr "Nur dieses Plugin: Protokolleinträge löschen, die älter sind als diese Anzahl Tage (0 = bei jedem Bereinigungslauf alle Protokolle löschen). Pflichtfeld." 294 295 #: includes/class-wsacsc-admin.php:301 112 296 msgid "Save Schedule" 113 297 msgstr "Zeitplan speichern" 114 298 299 #: includes/class-wsacsc-admin.php:307 115 300 msgid "Powered by Winning Solutions" 116 301 msgstr "Powered by Winning Solutions" 117 302 118 msgid "Selected actions cleared successfully!" 119 msgstr "Ausgewählte Aktionen erfolgreich bereinigt!" 120 121 msgid "Logs cleared successfully!" 122 msgstr "Protokolle erfolgreich bereinigt!" 123 124 msgid "Schedule saved successfully!" 125 msgstr "Zeitplan erfolgreich gespeichert!" 126 303 #: includes/class-wsacsc-ajax.php:37 304 msgid "Another cleanup or optimization is already running. Please wait until it finishes." 305 msgstr "Eine andere Bereinigung oder Optimierung läuft bereits. Bitte warten Sie, bis sie abgeschlossen ist." 306 307 #: includes/class-wsacsc-ajax.php:81 includes/class-wsacsc-ajax.php:96 includes/class-wsacsc-ajax.php:150 includes/class-wsacsc-ajax.php:209 includes/class-wsacsc-ajax.php:305 includes/class-wsacsc-ajax.php:329 includes/class-wsacsc-ajax.php:356 includes/class-wsacsc-ajax.php:404 308 msgid "Insufficient permissions." 309 msgstr "Unzureichende Berechtigungen." 310 311 #: includes/class-wsacsc-ajax.php:112 includes/class-wsacsc-ajax.php:156 312 msgid "Action Scheduler tables do not exist." 313 msgstr "Die Action-Scheduler-Tabellen existieren nicht." 314 315 #: includes/class-wsacsc-ajax.php:131 316 msgid "An error occurred while clearing actions." 317 msgstr "Beim Bereinigen der Aktionen ist ein Fehler aufgetreten." 318 319 #: includes/class-wsacsc-ajax.php:190 320 msgid "An error occurred while clearing logs." 321 msgstr "Beim Bereinigen der Protokolle ist ein Fehler aufgetreten." 322 323 #: includes/class-wsacsc-ajax.php:230 324 msgid "Actions schedule interval must be empty or between 1 and 365 days." 325 msgstr "Das Intervall für den Aktionszeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 326 327 #: includes/class-wsacsc-ajax.php:234 328 msgid "Logs schedule interval must be empty or between 1 and 365 days." 329 msgstr "Das Intervall für den Protokollzeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 330 331 #: includes/class-wsacsc-ajax.php:238 332 msgid "Actions schedule time must be in HH:MM format." 333 msgstr "Die Zeit für den Aktionszeitplan muss im Format HH:MM angegeben werden." 334 335 #: includes/class-wsacsc-ajax.php:242 336 msgid "Logs schedule time must be in HH:MM format." 337 msgstr "Die Zeit für den Protokollzeitplan muss im Format HH:MM angegeben werden." 338 339 #: includes/class-wsacsc-ajax.php:246 340 msgid "Actions retention period is required and must be between 0 and 365 days." 341 msgstr "Die Aufbewahrungsfrist für Aktionen ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 342 343 #: includes/class-wsacsc-ajax.php:250 344 msgid "Logs retention period is required and must be between 0 and 365 days." 345 msgstr "Die Aufbewahrungsfrist für Protokolle ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 346 347 #: includes/class-wsacsc-ajax.php:288 348 msgid "Failed to save schedule. Please try again." 349 msgstr "Der Zeitplan konnte nicht gespeichert werden. Bitte versuchen Sie es erneut." 350 351 #: includes/class-wsacsc-ajax.php:292 127 352 msgid "The settings were saved, but the cleanup schedule could not be updated yet. The plugin will retry automatically." 128 353 msgstr "Die Einstellungen wurden gespeichert, aber der Bereinigungszeitplan konnte noch nicht aktualisiert werden. Das Plugin versucht es automatisch erneut." 129 354 130 msgid "Statuses saved successfully!" 131 msgstr "Status erfolgreich gespeichert!" 132 133 msgid "Settings" 134 msgstr "Einstellungen" 135 136 msgid "Action Scheduler tables do not exist. Please ensure Action Scheduler is properly installed and activated." 137 msgstr "Die Action-Scheduler-Tabellen existieren nicht. Bitte stellen Sie sicher, dass Action Scheduler ordnungsgemäß installiert und aktiviert ist." 138 139 msgid "Please select at least one status to clear." 140 msgstr "Bitte wählen Sie mindestens einen Status zum Bereinigen aus." 141 142 msgid "Clearing in progress..." 143 msgstr "Bereinigung läuft..." 144 145 msgid "An error occurred. Please try again." 146 msgstr "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut." 147 148 msgid "Optimize Tables" 149 msgstr "Tabellen optimieren" 150 151 msgid "Optimize the database tables to reclaim unused space and potentially improve performance." 152 msgstr "Optimiere die Datenbanktabellen, um ungenutzten Speicherplatz freizugeben und möglicherweise die Leistung zu verbessern." 153 154 msgid "Optimize Actions Table" 155 msgstr "Aktionstabelle optimieren" 156 157 msgid "Optimize Logs Table" 158 msgstr "Protokolltabelle optimieren" 159 160 msgid "Optimizing table..." 161 msgstr "Tabelle wird optimiert..." 162 355 #: includes/class-wsacsc-ajax.php:336 includes/class-wsacsc-ajax.php:363 356 msgid "Invalid table type." 357 msgstr "Ungültiger Tabellentyp." 358 359 #. translators: %s: table type (actions or logs). 360 #: includes/class-wsacsc-ajax.php:390 361 #, php-format 163 362 msgid "%s table optimized successfully!" 164 363 msgstr "%s-Tabelle erfolgreich optimiert!" 165 364 166 msgid "Table optimization failed." 167 msgstr "Tabellenoptimierung fehlgeschlagen." 168 169 msgid "Table does not exist." 170 msgstr "Tabelle existiert nicht." 171 172 msgid "Invalid table type." 173 msgstr "Ungültiger Tabellentyp." 174 175 msgid "Insufficient permissions." 176 msgstr "Unzureichende Berechtigungen." 177 178 msgid "Finished actions can be removed automatically in two ways: this plugin’s scheduled cleanup (settings below) and Action Scheduler’s own built-in background cleanup for the actions table. The status checkboxes in “Clear Action Statuses” above define which statuses are affected—manual clearing, this plugin’s scheduled action cleanup, and (when this plugin’s action cleanup schedule is disabled) Action Scheduler’s background deletions." 179 msgstr "Abgeschlossene Aktionen können auf zwei Arten automatisch entfernt werden: über die geplante Bereinigung dieses Plugins (Einstellungen unten) und über die eingebaute Hintergrundbereinigung von Action Scheduler für die Aktionstabelle. Die Status-Kontrollkästchen unter „Aktionsstatus bereinigen“ legen fest, welche Status betroffen sind – manuelle Bereinigung, die geplante Aktionsbereinigung dieses Plugins und (wenn der Aktions-Bereinigungszeitplan dieses Plugins deaktiviert ist) die Hintergrundlöschungen von Action Scheduler." 180 181 msgid "Cleanup schedule and retention period are separate. Cleanup schedule controls how often this plugin runs its own WordPress cron jobs (1–365 days, or empty/0 to disable). Retention period controls how old entries must be before they are deleted. For actions, age is measured by completion or last attempt time—not the original scheduled date." 182 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist sind getrennte Einstellungen. Der Bereinigungszeitplan legt fest, wie oft dieses Plugin seine eigenen WordPress-Cronjobs ausführt (1–365 Tage, oder leer/0 zum Deaktivieren). Die Aufbewahrungsfrist legt fest, wie alt Einträge sein müssen, bevor sie gelöscht werden. Bei Aktionen wird das Alter am Abschluss- oder letzten Ausführungszeitpunkt gemessen – nicht am ursprünglichen Planungsdatum." 183 184 msgid "If an actions cleanup schedule is enabled, only this plugin’s cron job deletes old actions (using the selected statuses above); Action Scheduler’s built-in action cleanup is turned off to avoid duplicate deletions. If that schedule is disabled, this plugin does not run scheduled action cleanup—the actions retention period is passed to Action Scheduler instead, which deletes actions in the selected statuses when they are older than that many days." 185 msgstr "Ist ein Bereinigungszeitplan für Aktionen aktiviert, löscht nur der Cronjob dieses Plugins alte Aktionen (mit den oben gewählten Status); die eingebaute Aktionsbereinigung von Action Scheduler wird deaktiviert, um doppelte Löschungen zu vermeiden. Ist dieser Zeitplan deaktiviert, führt dieses Plugin keine geplante Aktionsbereinigung aus – die Aufbewahrungsfrist für Aktionen wird stattdessen an Action Scheduler übergeben, das Aktionen in den gewählten Status löscht, wenn sie älter als die angegebene Anzahl Tage sind." 186 187 msgid "Logs cleanup schedule and logs retention apply only to this plugin; Action Scheduler does not clean the logs table on its own." 188 msgstr "Bereinigungszeitplan und Aufbewahrungsfrist für Protokolle gelten nur für dieses Plugin; Action Scheduler bereinigt die Protokolltabelle nicht von sich aus." 189 190 msgid "This plugin does not hide status filters on the Action Scheduler admin screen. Tabs such as Complete or Failed only appear when actions with those statuses exist in the database. On sites with a very large pending backlog, few actions may finish; if counts stay at zero, those tabs will not show." 191 msgstr "Dieses Plugin blendet keine Statusfilter auf der Action-Scheduler-Verwaltungsseite aus. Registerkarten wie „Abgeschlossen“ oder „Fehlgeschlagen“ erscheinen nur, wenn Aktionen mit diesen Status in der Datenbank existieren. Bei sehr großem Pending-Rückstau werden wenige Aktionen abgeschlossen; bleiben die Zähler bei null, werden diese Registerkarten nicht angezeigt." 192 193 msgid "Action Statuses" 194 msgstr "Aktionsstatus" 195 196 msgid "Cleanup Schedule:" 197 msgstr "Bereinigungszeitplan:" 198 199 msgid "This plugin only: how often its WordPress cron job deletes old actions (empty or 0 = disabled, 1–365 days). When enabled, Action Scheduler’s built-in action cleanup is disabled. This is not the retention period." 200 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Aktionen löscht (leer oder 0 = deaktiviert, 1–365 Tage). Wenn aktiviert, ist die eingebaute Aktionsbereinigung von Action Scheduler deaktiviert. Das ist nicht die Aufbewahrungsfrist." 201 202 msgid "Schedule Time:" 203 msgstr "Zeitplan:" 204 205 msgid "This plugin only: time of day for its action cleanup job (WordPress timezone)." 206 msgstr "Nur dieses Plugin: Tageszeit für den Aktions-Bereinigungsjob (WordPress-Zeitzone)." 207 208 msgid "Retention Period:" 209 msgstr "Aufbewahrungsfrist:" 210 211 msgid "How long to keep actions before deletion (by completion or last attempt time, not scheduled date), for the statuses selected above. With a plugin action cleanup schedule enabled: used only by this plugin’s cron job. With that schedule disabled: passed to Action Scheduler’s background cleanup for the same selected statuses. 0 = delete all matching actions on every cleanup run. Required." 212 msgstr "Wie lange Aktionen vor dem Löschen aufbewahrt werden (Abschluss- oder letzter Ausführungszeitpunkt, nicht Planungsdatum), für die oben gewählten Status. Mit aktiviertem Aktions-Bereinigungszeitplan: nur für den Cronjob dieses Plugins. Ohne diesen Zeitplan: wird an die Hintergrundbereinigung von Action Scheduler für dieselben Status übergeben. 0 = bei jedem Bereinigungslauf alle passenden Aktionen löschen. Pflichtfeld." 213 214 msgid "Logs" 215 msgstr "Protokolle" 216 217 msgid "How often to run cleanup (empty or 0 = disabled, 1-365 days)." 218 msgstr "Wie oft die Bereinigung ausgeführt wird (leer oder 0 = deaktiviert, 1–365 Tage)." 219 220 msgid "This plugin only: how often its WordPress cron job deletes old log entries (empty or 0 = disabled, 1–365 days). Action Scheduler does not clean logs automatically. This is not the retention period." 221 msgstr "Nur dieses Plugin: Wie oft sein WordPress-Cronjob alte Protokolleinträge löscht (leer oder 0 = deaktiviert, 1–365 Tage). Action Scheduler bereinigt Protokolle nicht automatisch. Das ist nicht die Aufbewahrungsfrist." 222 223 msgid "This plugin only: time of day for its log cleanup job (WordPress timezone)." 224 msgstr "Nur dieses Plugin: Tageszeit für den Protokoll-Bereinigungsjob (WordPress-Zeitzone)." 225 226 msgid "This plugin only: delete log entries older than this many days (0 = delete all logs on each cleanup run). Required." 227 msgstr "Nur dieses Plugin: Protokolleinträge löschen, die älter sind als diese Anzahl Tage (0 = bei jedem Bereinigungslauf alle Protokolle löschen). Pflichtfeld." 228 229 msgid "Actions schedule interval must be empty or between 1 and 365 days." 230 msgstr "Das Intervall für den Aktionszeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 231 232 msgid "Logs schedule interval must be empty or between 1 and 365 days." 233 msgstr "Das Intervall für den Protokollzeitplan muss leer sein oder zwischen 1 und 365 Tagen liegen." 234 235 msgid "Actions schedule time must be in HH:MM format." 236 msgstr "Die Zeit für den Aktionszeitplan muss im Format HH:MM angegeben werden." 237 238 msgid "Logs schedule time must be in HH:MM format." 239 msgstr "Die Zeit für den Protokollzeitplan muss im Format HH:MM angegeben werden." 240 241 msgid "Actions retention period is required and must be between 0 and 365 days." 242 msgstr "Die Aufbewahrungsfrist für Aktionen ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 243 244 msgid "Logs retention period is required and must be between 0 and 365 days." 245 msgstr "Die Aufbewahrungsfrist für Protokolle ist erforderlich und muss zwischen 0 und 365 Tagen liegen." 246 365 #: includes/class-wsacsc-ajax.php:411 366 msgid "Invalid cleanup ID." 367 msgstr "Ungültige Bereinigungs-ID." 368 369 #: includes/class-wsacsc-ajax.php:427 370 msgid "Cleanup progress was lost or is continuing in the background. Refresh the page to check table sizes." 371 msgstr "Der Bereinigungsfortschritt ging verloren oder die Bereinigung läuft im Hintergrund weiter. Laden Sie die Seite neu, um die Tabellengrößen zu prüfen." 372 373 #: includes/class-wsacsc-ajax.php:435 374 msgid "Invalid cleanup progress data." 375 msgstr "Ungültige Fortschrittsdaten der Bereinigung." 376 377 #: includes/class-wsacsc-ajax.php:441 378 msgid "An error occurred during cleanup." 379 msgstr "Während der Bereinigung ist ein Fehler aufgetreten." 380 381 #: includes/class-wsacsc-ajax.php:453 382 msgid "Cleanup completed successfully!" 383 msgstr "Bereinigung erfolgreich abgeschlossen!" 384 385 #. translators: %d: number of days. 386 #: includes/class-wsacsc-scheduler.php:245 387 #, php-format 388 msgid "Every %d day" 389 msgid_plural "Every %d days" 390 msgstr[0] "Jeden Tag" 391 msgstr[1] "Alle %d Tage" 392 393 #. translators: 1: rows deleted so far, 2: rows to delete in total, 3: percentage done. 394 #: includes/helpers.php:329 395 #, php-format 396 msgid "Clearing in progress… %1$s of %2$s rows deleted (%3$d%%)." 397 msgstr "Bereinigung läuft… %1$s von %2$s Zeilen gelöscht (%3$d %%)." 398 399 #. translators: %s: number of rows deleted so far. 400 #: includes/helpers.php:342 401 #, php-format 247 402 msgid "Clearing in progress… %s rows deleted so far." 248 403 msgstr "Bereinigung läuft… bisher %s Zeilen gelöscht." 249 250 msgid "Cleanup completed successfully!"251 msgstr "Bereinigung erfolgreich abgeschlossen!"252 253 msgid "Another cleanup or optimization is already running. Please wait until it finishes."254 msgstr "Eine andere Bereinigung oder Optimierung läuft bereits. Bitte warten Sie, bis sie abgeschlossen ist."255 256 msgid "An error occurred while clearing actions."257 msgstr "Beim Bereinigen der Aktionen ist ein Fehler aufgetreten."258 259 msgid "An error occurred while clearing logs."260 msgstr "Beim Bereinigen der Protokolle ist ein Fehler aufgetreten."261 262 msgid "Cleanup progress was lost or is continuing in the background. Refresh the page to check table sizes."263 msgstr "Der Bereinigungsfortschritt ging verloren oder die Bereinigung läuft im Hintergrund weiter. Laden Sie die Seite neu, um die Tabellengrößen zu prüfen."264 265 msgid "An error occurred during cleanup."266 msgstr "Während der Bereinigung ist ein Fehler aufgetreten."267 268 msgid "Retrying…"269 msgstr "Erneuter Versuch…" -
ws-action-scheduler-cleaner/trunk/languages/ws-action-scheduler-cleaner.pot
r3750500 r3798362 1 #, fuzzy 1 # Copyright (C) 2026 Winning Solutions - Nagel & Mäder GbR 2 # This file is distributed under the GPLv2 or later. 2 3 msgid "" 3 4 msgstr "" 4 "Project-Id-Version: WS Action Scheduler Cleaner\n" 5 "Report-Msgid-Bugs-To: \n" 6 "POT-Creation-Date: 2024-10-10 12:00+0000\n" 7 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 5 "Project-Id-Version: WS Action Scheduler Cleaner 1.3.2\n" 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ws-action-scheduler-cleaner\n" 8 7 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" 9 8 "Language-Team: LANGUAGE <LL@li.org>\n" 10 "Language: \n"11 9 "MIME-Version: 1.0\n" 12 10 "Content-Type: text/plain; charset=UTF-8\n" 13 11 "Content-Transfer-Encoding: 8bit\n" 14 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" 15 16 #: ws-action-scheduler-cleaner.php:3 17 #: ws-action-scheduler-cleaner.php:156 12 "POT-Creation-Date: 2026-11-10T20:25:22+00:00\n" 13 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 14 "X-Generator: WP-CLI 2.12.0\n" 15 "X-Domain: ws-action-scheduler-cleaner\n" 16 17 #. Plugin Name of the plugin 18 #: ws-action-scheduler-cleaner.php 19 #: includes/class-wsacsc-admin.php:70 20 #: includes/class-wsacsc-admin.php:149 21 #: includes/class-wsacsc-admin.php:156 18 22 msgid "WS Action Scheduler Cleaner" 19 23 msgstr "" 20 24 21 #: ws-action-scheduler-cleaner.php:4 25 #. Description of the plugin 26 #: ws-action-scheduler-cleaner.php 22 27 msgid "Suffering from database bloat? Try cleaning up the Action Scheduler tables through an easy-to-understand GUI." 23 28 msgstr "" 24 29 25 #: ws-action-scheduler-cleaner.php:69 30 #. Author of the plugin 31 #: ws-action-scheduler-cleaner.php 32 msgid "Winning Solutions - Nagel & Mäder GbR" 33 msgstr "" 34 35 #. Author URI of the plugin 36 #: ws-action-scheduler-cleaner.php 37 msgid "https://www.winning-solutions.de" 38 msgstr "" 39 40 #: includes/class-wsacsc-admin.php:40 41 msgid "Settings" 42 msgstr "" 43 44 #: includes/class-wsacsc-admin.php:71 45 msgid "WS AS Cleaner" 46 msgstr "" 47 48 #: includes/class-wsacsc-admin.php:118 49 #: includes/class-wsacsc-ajax.php:108 50 #: includes/class-wsacsc-ajax.php:314 51 msgid "Please select at least one status to clear." 52 msgstr "" 53 54 #: includes/class-wsacsc-admin.php:119 55 #: includes/helpers.php:337 56 msgid "Clearing in progress..." 57 msgstr "" 58 59 #: includes/class-wsacsc-admin.php:120 26 60 msgid "Please wait..." 27 61 msgstr "" 28 62 29 #: ws-action-scheduler-cleaner.php:70 63 #: includes/class-wsacsc-admin.php:121 64 msgid "An error occurred. Please try again." 65 msgstr "" 66 67 #: includes/class-wsacsc-admin.php:122 68 #: includes/class-wsacsc-ajax.php:138 69 msgid "Selected actions cleared successfully!" 70 msgstr "" 71 72 #: includes/class-wsacsc-admin.php:123 73 #: includes/class-wsacsc-ajax.php:180 74 #: includes/class-wsacsc-ajax.php:197 75 msgid "Logs cleared successfully!" 76 msgstr "" 77 78 #: includes/class-wsacsc-admin.php:124 79 #: includes/class-wsacsc-ajax.php:295 80 msgid "Schedule saved successfully!" 81 msgstr "" 82 83 #: includes/class-wsacsc-admin.php:125 84 #: includes/class-wsacsc-ajax.php:319 85 msgid "Statuses saved successfully!" 86 msgstr "" 87 88 #: includes/class-wsacsc-admin.php:126 89 msgid "Optimizing table..." 90 msgstr "" 91 92 #: includes/class-wsacsc-admin.php:127 93 #: includes/class-wsacsc-admin.php:189 94 #: includes/class-wsacsc-admin.php:191 95 #: includes/class-wsacsc-admin.php:197 96 #: includes/class-wsacsc-admin.php:199 30 97 msgid "Loading..." 31 98 msgstr "" 32 99 33 #: ws-action-scheduler-cleaner.php:164 100 #: includes/class-wsacsc-admin.php:128 101 #: includes/class-wsacsc-ajax.php:382 102 msgid "Table optimization failed." 103 msgstr "" 104 105 #: includes/class-wsacsc-admin.php:129 106 msgid "Please fix the highlighted fields before saving." 107 msgstr "" 108 109 #: includes/class-wsacsc-admin.php:130 110 #: includes/class-wsacsc-admin.php:192 111 msgid "Refresh actions table size" 112 msgstr "" 113 114 #: includes/class-wsacsc-admin.php:131 115 #: includes/class-wsacsc-admin.php:200 116 msgid "Refresh logs table size" 117 msgstr "" 118 119 #: includes/class-wsacsc-admin.php:132 120 msgid "Retrying…" 121 msgstr "" 122 123 #: includes/class-wsacsc-admin.php:150 124 msgid "Action Scheduler tables do not exist. Please ensure Action Scheduler is properly installed and activated." 125 msgstr "" 126 127 #: includes/class-wsacsc-admin.php:159 34 128 msgid "This tool allows you to clean up the Action Scheduler tables in your WordPress database. Action Scheduler is a library used by many plugins to schedule background tasks." 35 129 msgstr "" 36 130 37 #: ws-action-scheduler-cleaner.php:165131 #: includes/class-wsacsc-admin.php:160 38 132 msgid "The Action Scheduler uses two main tables:" 39 133 msgstr "" 40 134 41 #: ws-action-scheduler-cleaner.php:167135 #: includes/class-wsacsc-admin.php:162 42 136 msgid "Actions Table: Stores scheduled actions and their statuses." 43 137 msgstr "" 44 138 45 #: ws-action-scheduler-cleaner.php:168139 #: includes/class-wsacsc-admin.php:163 46 140 msgid "Logs Table: Stores logs of action executions." 47 141 msgstr "" 48 142 49 #: ws-action-scheduler-cleaner.php:170143 #: includes/class-wsacsc-admin.php:165 50 144 msgid "Clearing these tables is generally safe and can improve database performance. However, please note:" 51 145 msgstr "" 52 146 53 #: ws-action-scheduler-cleaner.php:172147 #: includes/class-wsacsc-admin.php:167 54 148 msgid "Clearing can take a while depending on the size of the tables." 55 149 msgstr "" 56 150 57 #: ws-action-scheduler-cleaner.php:173151 #: includes/class-wsacsc-admin.php:168 58 152 msgid "Cleared data will be permanently deleted." 59 153 msgstr "" 60 154 61 #: ws-action-scheduler-cleaner.php:174155 #: includes/class-wsacsc-admin.php:169 62 156 msgid "It's recommended to <strong>make a backup</strong> before proceeding." 63 157 msgstr "" 64 158 65 #: ws-action-scheduler-cleaner.php:175159 #: includes/class-wsacsc-admin.php:170 66 160 msgid "Clearing completed, failed, or canceled actions usually doesn't affect WordPress functionality." 67 161 msgstr "" 68 162 69 #: ws-action-scheduler-cleaner.php:177 163 #. translators: %s: URL to Action Scheduler admin page 164 #: includes/class-wsacsc-admin.php:177 165 #, php-format 70 166 msgid "For more information, visit the <a href=\"%s\">Action Scheduler admin page</a>." 71 167 msgstr "" 72 168 73 #: ws-action-scheduler-cleaner.php:143169 #: includes/class-wsacsc-admin.php:186 74 170 msgid "Current Table Sizes:" 75 171 msgstr "" 76 172 77 #: ws-action-scheduler-cleaner.php:151 173 #: includes/class-wsacsc-admin.php:188 174 msgid "Actions table:" 175 msgstr "" 176 177 #: includes/class-wsacsc-admin.php:190 178 #: includes/class-wsacsc-admin.php:198 179 msgid "rows" 180 msgstr "" 181 182 #: includes/class-wsacsc-admin.php:196 183 msgid "Logs table:" 184 msgstr "" 185 186 #: includes/class-wsacsc-admin.php:207 78 187 msgid "Clear Action Statuses" 79 188 msgstr "" 80 189 81 #: ws-action-scheduler-cleaner.php:153 82 msgid "Select which action statuses to clear:" 83 msgstr "" 84 85 #: ws-action-scheduler-cleaner.php:158 190 #: includes/class-wsacsc-admin.php:209 191 msgid "Action statuses to clear" 192 msgstr "" 193 194 #: includes/class-wsacsc-admin.php:210 195 msgid "Select which statuses to remove when clearing manually, when this plugin runs scheduled action cleanup, and (if this plugin’s action cleanup schedule is disabled) which statuses Action Scheduler may delete in the background:" 196 msgstr "" 197 198 #: includes/class-wsacsc-admin.php:217 86 199 msgid "Complete" 87 200 msgstr "" 88 201 89 #: ws-action-scheduler-cleaner.php:159202 #: includes/class-wsacsc-admin.php:218 90 203 msgid "Failed" 91 204 msgstr "" 92 205 93 #: ws-action-scheduler-cleaner.php:160206 #: includes/class-wsacsc-admin.php:219 94 207 msgid "Canceled" 95 208 msgstr "" 96 209 97 #: ws-action-scheduler-cleaner.php:163210 #: includes/class-wsacsc-admin.php:221 98 211 msgid "Clear Selected Actions" 99 212 msgstr "" 100 213 101 #: ws-action-scheduler-cleaner.php:169214 #: includes/class-wsacsc-admin.php:226 102 215 msgid "Clear Logs Table" 103 216 msgstr "" 104 217 105 #: ws-action-scheduler-cleaner.php:170218 #: includes/class-wsacsc-admin.php:227 106 219 msgid "This will clear all entries in the logs table." 107 220 msgstr "" 108 221 109 #: ws-action-scheduler-cleaner.php:171222 #: includes/class-wsacsc-admin.php:228 110 223 msgid "Clear Logs" 111 224 msgstr "" 112 225 113 #: ws-action-scheduler-cleaner.php:177 226 #: includes/class-wsacsc-admin.php:232 227 msgid "Optimize Tables" 228 msgstr "" 229 230 #: includes/class-wsacsc-admin.php:233 231 msgid "Optimize the database tables to reclaim unused space and potentially improve performance." 232 msgstr "" 233 234 #: includes/class-wsacsc-admin.php:235 235 msgid "Optimize Actions Table" 236 msgstr "" 237 238 #: includes/class-wsacsc-admin.php:236 239 msgid "Optimize Logs Table" 240 msgstr "" 241 242 #: includes/class-wsacsc-admin.php:241 114 243 msgid "Scheduling Options" 115 244 msgstr "" 116 245 117 #: ws-action-scheduler-cleaner.php:178 118 msgid "Set up automatic clearing schedules for selected statuses (set to 0 to clean fully; leave empty to disable automatic clearing):" 119 msgstr "" 120 121 #: ws-action-scheduler-cleaner.php:181 122 msgid "Clear logs older than:" 123 msgstr "" 124 125 #: ws-action-scheduler-cleaner.php:185 126 #: ws-action-scheduler-cleaner.php:193 246 #: includes/class-wsacsc-admin.php:242 247 msgid "Finished actions can be removed automatically in two ways: this plugin’s scheduled cleanup (settings below) and Action Scheduler’s own built-in background cleanup for the actions table. The status checkboxes in “Clear Action Statuses” above define which statuses are affected—manual clearing, this plugin’s scheduled action cleanup, and (when this plugin’s action cleanup schedule is disabled) Action Scheduler’s background deletions." 248 msgstr "" 249 250 #: includes/class-wsacsc-admin.php:243 251 msgid "Cleanup schedule and retention period are separate. Cleanup schedule controls how often this plugin runs its own WordPress cron jobs (1–365 days, or empty/0 to disable). Retention period controls how old entries must be before they are deleted. For actions, age is measured by completion or last attempt time—not the original scheduled date." 252 msgstr "" 253 254 #: includes/class-wsacsc-admin.php:244 255 msgid "If an actions cleanup schedule is enabled, only this plugin’s cron job deletes old actions (using the selected statuses above); Action Scheduler’s built-in action cleanup is turned off to avoid duplicate deletions. If that schedule is disabled, this plugin does not run scheduled action cleanup—the actions retention period is passed to Action Scheduler instead, which deletes actions in the selected statuses when they are older than that many days." 256 msgstr "" 257 258 #: includes/class-wsacsc-admin.php:245 259 msgid "Logs cleanup schedule and logs retention apply only to this plugin; Action Scheduler does not clean the logs table on its own." 260 msgstr "" 261 262 #: includes/class-wsacsc-admin.php:246 263 msgid "This plugin does not hide status filters on the Action Scheduler admin screen. Tabs such as Complete or Failed only appear when actions with those statuses exist in the database. On sites with a very large pending backlog, few actions may finish; if counts stay at zero, those tabs will not show." 264 msgstr "" 265 266 #: includes/class-wsacsc-admin.php:249 267 msgid "Action Statuses" 268 msgstr "" 269 270 #: includes/class-wsacsc-admin.php:251 271 #: includes/class-wsacsc-admin.php:277 272 msgid "Cleanup Schedule:" 273 msgstr "" 274 275 #: includes/class-wsacsc-admin.php:254 276 #: includes/class-wsacsc-admin.php:269 277 #: includes/class-wsacsc-admin.php:280 278 #: includes/class-wsacsc-admin.php:295 127 279 msgid "days" 128 280 msgstr "" 129 281 130 #: ws-action-scheduler-cleaner.php:189 131 msgid "Clear action statuses older than:" 132 msgstr "" 133 134 #: ws-action-scheduler-cleaner.php:197 282 #: includes/class-wsacsc-admin.php:256 283 msgid "This plugin only: how often its WordPress cron job deletes old actions (empty or 0 = disabled, 1–365 days). When enabled, Action Scheduler’s built-in action cleanup is disabled. This is not the retention period." 284 msgstr "" 285 286 #: includes/class-wsacsc-admin.php:259 287 #: includes/class-wsacsc-admin.php:285 288 msgid "Schedule Time:" 289 msgstr "" 290 291 #: includes/class-wsacsc-admin.php:263 292 msgid "This plugin only: time of day for its action cleanup job (WordPress timezone)." 293 msgstr "" 294 295 #: includes/class-wsacsc-admin.php:266 296 #: includes/class-wsacsc-admin.php:292 297 msgid "Retention Period:" 298 msgstr "" 299 300 #: includes/class-wsacsc-admin.php:271 301 msgid "How long to keep actions before deletion (by completion or last attempt time, not scheduled date), for the statuses selected above. With a plugin action cleanup schedule enabled: used only by this plugin’s cron job. With that schedule disabled: passed to Action Scheduler’s background cleanup for the same selected statuses. 0 = delete all matching actions on every cleanup run. Required." 302 msgstr "" 303 304 #: includes/class-wsacsc-admin.php:275 305 msgid "Logs" 306 msgstr "" 307 308 #: includes/class-wsacsc-admin.php:282 309 msgid "This plugin only: how often its WordPress cron job deletes old log entries (empty or 0 = disabled, 1–365 days). Action Scheduler does not clean logs automatically. This is not the retention period." 310 msgstr "" 311 312 #: includes/class-wsacsc-admin.php:289 313 msgid "This plugin only: time of day for its log cleanup job (WordPress timezone)." 314 msgstr "" 315 316 #: includes/class-wsacsc-admin.php:297 317 msgid "This plugin only: delete log entries older than this many days (0 = delete all logs on each cleanup run). Required." 318 msgstr "" 319 320 #: includes/class-wsacsc-admin.php:301 135 321 msgid "Save Schedule" 136 322 msgstr "" 137 323 138 #: ws-action-scheduler-cleaner.php:203324 #: includes/class-wsacsc-admin.php:307 139 325 msgid "Powered by Winning Solutions" 140 326 msgstr "" 141 327 142 #: ws-action-scheduler-cleaner.php:252 143 msgid "Selected actions cleared successfully!" 144 msgstr "" 145 146 #: ws-action-scheduler-cleaner.php:270 147 msgid "Logs cleared successfully!" 148 msgstr "" 149 150 #: ws-action-scheduler-cleaner.php:288 151 msgid "Schedule saved successfully!" 152 msgstr "" 153 154 #: includes/class-ajax.php:278 328 #: includes/class-wsacsc-ajax.php:37 329 msgid "Another cleanup or optimization is already running. Please wait until it finishes." 330 msgstr "" 331 332 #: includes/class-wsacsc-ajax.php:81 333 #: includes/class-wsacsc-ajax.php:96 334 #: includes/class-wsacsc-ajax.php:150 335 #: includes/class-wsacsc-ajax.php:209 336 #: includes/class-wsacsc-ajax.php:305 337 #: includes/class-wsacsc-ajax.php:329 338 #: includes/class-wsacsc-ajax.php:356 339 #: includes/class-wsacsc-ajax.php:404 340 msgid "Insufficient permissions." 341 msgstr "" 342 343 #: includes/class-wsacsc-ajax.php:112 344 #: includes/class-wsacsc-ajax.php:156 345 msgid "Action Scheduler tables do not exist." 346 msgstr "" 347 348 #: includes/class-wsacsc-ajax.php:131 349 msgid "An error occurred while clearing actions." 350 msgstr "" 351 352 #: includes/class-wsacsc-ajax.php:190 353 msgid "An error occurred while clearing logs." 354 msgstr "" 355 356 #: includes/class-wsacsc-ajax.php:230 357 msgid "Actions schedule interval must be empty or between 1 and 365 days." 358 msgstr "" 359 360 #: includes/class-wsacsc-ajax.php:234 361 msgid "Logs schedule interval must be empty or between 1 and 365 days." 362 msgstr "" 363 364 #: includes/class-wsacsc-ajax.php:238 365 msgid "Actions schedule time must be in HH:MM format." 366 msgstr "" 367 368 #: includes/class-wsacsc-ajax.php:242 369 msgid "Logs schedule time must be in HH:MM format." 370 msgstr "" 371 372 #: includes/class-wsacsc-ajax.php:246 373 msgid "Actions retention period is required and must be between 0 and 365 days." 374 msgstr "" 375 376 #: includes/class-wsacsc-ajax.php:250 377 msgid "Logs retention period is required and must be between 0 and 365 days." 378 msgstr "" 379 380 #: includes/class-wsacsc-ajax.php:288 381 msgid "Failed to save schedule. Please try again." 382 msgstr "" 383 384 #: includes/class-wsacsc-ajax.php:292 155 385 msgid "The settings were saved, but the cleanup schedule could not be updated yet. The plugin will retry automatically." 156 386 msgstr "" 157 387 158 #: ws-action-scheduler-cleaner.php:302 159 msgid "Statuses saved successfully!" 160 msgstr "" 161 162 #: ws-action-scheduler-cleaner.php:420 163 msgid "Action Scheduler tables do not exist. Please ensure Action Scheduler is properly installed and activated." 164 msgstr "" 165 166 #: ws-action-scheduler-cleaner.php:445 167 msgid "Please select at least one status to clear." 168 msgstr "" 169 170 #: ws-action-scheduler-cleaner.php:446 171 msgid "Clearing in progress..." 172 msgstr "" 173 174 #: ws-action-scheduler-cleaner.php:480 175 msgid "Optimize Tables" 176 msgstr "" 177 178 #: ws-action-scheduler-cleaner.php:481 179 msgid "Optimize the database tables to reclaim unused space and potentially improve performance." 180 msgstr "" 181 182 #: ws-action-scheduler-cleaner.php:482 183 msgid "Optimize Actions Table" 184 msgstr "" 185 186 #: ws-action-scheduler-cleaner.php:483 187 msgid "Optimize Logs Table" 188 msgstr "" 189 190 #: ws-action-scheduler-cleaner.php:484 191 msgid "Optimizing table..." 192 msgstr "" 193 194 #: ws-action-scheduler-cleaner.php:485 388 #: includes/class-wsacsc-ajax.php:336 389 #: includes/class-wsacsc-ajax.php:363 390 msgid "Invalid table type." 391 msgstr "" 392 393 #. translators: %s: table type (actions or logs). 394 #: includes/class-wsacsc-ajax.php:390 395 #, php-format 195 396 msgid "%s table optimized successfully!" 196 397 msgstr "" 197 398 198 #: ws-action-scheduler-cleaner.php:486 199 msgid "Table optimization failed." 200 msgstr "" 201 202 #: ws-action-scheduler-cleaner.php:487 203 msgid "An error occurred. Please try again." 204 msgstr "" 205 206 #: ws-action-scheduler-cleaner.php:488 207 msgid "Table does not exist." 208 msgstr "" 209 210 #: ws-action-scheduler-cleaner.php:489 211 msgid "Invalid table type." 212 msgstr "" 213 214 #: ws-action-scheduler-cleaner.php:490 215 msgid "Insufficient permissions." 216 msgstr "" 217 218 #: includes/class-admin.php:221 219 msgid "Cleanup Schedule and Retention Period are separate settings. Cleanup Schedule controls how often this plugin runs its own cleanup job (when set to 1–365 days). Retention Period controls how old finished actions must be before they are deleted, based on completion or last attempt time—the same basis Action Scheduler uses—not the original scheduled date." 220 msgstr "" 221 222 #: includes/class-admin.php:222 223 msgid "When a cleanup schedule is enabled, Action Scheduler's built-in continuous cleanup is disabled to avoid duplicate deletions; only this plugin's scheduled job removes old finished actions until you clear the schedule. Without a cleanup schedule, Retention Period still applies to Action Scheduler's background cleanup. Logs retention applies only to this plugin's log cleanup." 224 msgstr "" 225 226 #: includes/class-admin.php:223 227 msgid "This plugin does not hide status filters on the Action Scheduler admin screen. Tabs such as Complete or Failed only appear when actions with those statuses exist in the database. On sites with a very large pending backlog, few actions may finish; if counts stay at zero, those tabs will not show." 228 msgstr "" 229 230 #: includes/class-admin.php:225 231 msgid "Action Statuses" 232 msgstr "" 233 234 #: includes/class-admin.php:227 235 msgid "Cleanup Schedule:" 236 msgstr "" 237 238 #: includes/class-admin.php:232 239 msgid "How often this plugin runs its cleanup job (empty or 0 = disabled, 1–365 days). This is not the retention period." 240 msgstr "" 241 242 #: includes/class-admin.php:229 243 msgid "Schedule Time:" 244 msgstr "" 245 246 #: includes/class-admin.php:233 247 msgid "Time of day to run cleanup (uses WordPress timezone)." 248 msgstr "" 249 250 #: includes/class-admin.php:236 251 msgid "Retention Period:" 252 msgstr "" 253 254 #: includes/class-admin.php:247 255 msgid "Delete selected finished statuses whose completion or last attempt is older than this many days (0 = delete all matching statuses on each cleanup run, required field)." 256 msgstr "" 257 258 #: includes/class-admin.php:245 259 msgid "Logs" 260 msgstr "" 261 262 #: includes/class-admin.php:267 263 msgid "Delete logs older than this (0 = delete all logs, required field)." 264 msgstr "" 265 266 #: includes/class-ajax.php:139 267 msgid "Actions schedule interval must be empty or between 1 and 365 days." 268 msgstr "" 269 270 #: includes/class-ajax.php:144 271 msgid "Logs schedule interval must be empty or between 1 and 365 days." 272 msgstr "" 273 274 #: includes/class-ajax.php:149 275 msgid "Actions schedule time must be in HH:MM format." 276 msgstr "" 277 278 #: includes/class-ajax.php:154 279 msgid "Logs schedule time must be in HH:MM format." 280 msgstr "" 281 282 #: includes/class-ajax.php:159 283 msgid "Actions retention period is required and must be between 0 and 365 days." 284 msgstr "" 285 286 #: includes/class-ajax.php:164 287 msgid "Logs retention period is required and must be between 0 and 365 days." 288 msgstr "" 289 290 #: includes/helpers.php:243 399 #: includes/class-wsacsc-ajax.php:411 400 msgid "Invalid cleanup ID." 401 msgstr "" 402 403 #: includes/class-wsacsc-ajax.php:427 404 msgid "Cleanup progress was lost or is continuing in the background. Refresh the page to check table sizes." 405 msgstr "" 406 407 #: includes/class-wsacsc-ajax.php:435 408 msgid "Invalid cleanup progress data." 409 msgstr "" 410 411 #: includes/class-wsacsc-ajax.php:441 412 msgid "An error occurred during cleanup." 413 msgstr "" 414 415 #: includes/class-wsacsc-ajax.php:453 416 msgid "Cleanup completed successfully!" 417 msgstr "" 418 419 #. translators: %d: number of days. 420 #: includes/class-wsacsc-scheduler.php:245 421 #, php-format 422 msgid "Every %d day" 423 msgid_plural "Every %d days" 424 msgstr[0] "" 425 msgstr[1] "" 426 427 #. translators: 1: rows deleted so far, 2: rows to delete in total, 3: percentage done. 428 #: includes/helpers.php:329 429 #, php-format 430 msgid "Clearing in progress… %1$s of %2$s rows deleted (%3$d%%)." 431 msgstr "" 432 433 #. translators: %s: number of rows deleted so far. 434 #: includes/helpers.php:342 435 #, php-format 291 436 msgid "Clearing in progress… %s rows deleted so far." 292 437 msgstr "" 293 294 #: includes/class-ajax.php:504295 msgid "Cleanup completed successfully!"296 msgstr ""297 298 #: includes/class-ajax.php:37299 msgid "Another cleanup or optimization is already running. Please wait until it finishes."300 msgstr ""301 302 #: includes/class-ajax.php:132303 msgid "An error occurred while clearing actions."304 msgstr ""305 306 #: includes/class-ajax.php:176307 msgid "An error occurred while clearing logs."308 msgstr ""309 310 #: includes/class-ajax.php:476311 msgid "Cleanup progress was lost or is continuing in the background. Refresh the page to check table sizes."312 msgstr ""313 314 #: includes/class-ajax.php:491315 msgid "An error occurred during cleanup."316 msgstr ""317 318 #: includes/class-admin.php:131319 msgid "Retrying…"320 msgstr "" -
ws-action-scheduler-cleaner/trunk/readme.txt
r3750500 r3798362 4 4 Requires at least: 6.3 5 5 Tested up to: 7.1 6 Stable tag: 1.3. 16 Stable tag: 1.3.2 7 7 Requires PHP: 7.4 8 8 License: GPLv2 or later … … 80 80 81 81 == Changelog == 82 83 = 2026-11-10: 1.3.2 = 84 * Fixed: With a cleanup schedule turned on, Action Scheduler deleted all finished actions at once. It now keeps them for your retention period. 85 * Fixed: Activation and deactivation no longer cause database errors on MySQL. Table sizes now show correctly on MySQL 8. 86 * Fixed: Clearing old actions now also removes their log entries. Retention now uses UTC time. 87 * Improved: Clearing millions of finished actions or logs now takes seconds instead of minutes. Other clears show their progress as rows deleted of the total and no longer run twice at the same time or stop early. 88 * Improved: Faster table statistics, no duplicate database index, complete German translations, and code that follows the WordPress Coding Standards. 82 89 83 90 = 2026-10-15: 1.3.1 = … … 117 124 * **Improved AJAX cleanup performance**: AJAX-based cleanup now uses batch processing with larger batches (5000 rows per batch, so still a low enough number that shouldn't cause DB server issues) for faster cleanup of large tables. 118 125 * **Enhanced user feedback**: Added modern loading spinner animation and italic styling to progress messages. Buttons remain disabled and progress messages stay visible during cleanup operations. 119 * **Prevented timeouts on large tables**: Both AJAX-based and scheduled cleanup operations now temporarily increase PHP execution time and memory limits during cleanup to handle very large tables (multiple gigabytes) without timing out. Original PHP settings are automatically restored after cleanup completes. 126 * **Prevented timeouts on large tables**: Both AJAX-based and scheduled cleanup operations now temporarily increase PHP execution time and memory limits during cleanup to handle very large tables (multiple gigabytes) without timing out. Original PHP settings are automatically restored after cleanup completes. (Since 1.3.2, the memory limit is only raised and not lowered again.) 120 127 * **Added cron health checking for version migration**: We now handle edge cases for crons after version migration better and fixed some uninstall behavior issues. 121 128 … … 142 149 == Upgrade Notice == 143 150 151 = 1.3.2 = 152 * Fixes early deletion of finished actions when a cleanup schedule is turned on. Recommended for all users. 153 144 154 = 1.3.1 = 145 155 * Fixes very high Redis CPU load caused by repeated cache group flushes, and scheduled cleanups that never ran when no time of day was set. Recommended for all users, especially sites with a persistent object cache. … … 171 181 = Manual cleanup (admin UI / AJAX) = 172 182 173 * `wsacsc_ajax_cleanup_batch_size` (default: `10000`) — Maximum rows deleted per `DELETE` statement during manual clear operations initiated from the admin screen. Higher values can speed up very large tables but increase load per query. 174 * `wsacsc_ajax_cleanup_max_seconds` (default: `18`) — Seconds of work per AJAX request before the plugin saves progress and returns. The admin UI polls for the next chunk while you keep the page open. Increase on slow hosts if chunks finish too quickly; decrease if requests time out. 183 * `wsacsc_ajax_cleanup_batch_size` (default: `10000`) — Maximum rows deleted per `DELETE` statement during manual clear operations initiated from the admin screen. Since 1.3.2, each job starts with smaller batches and adapts the size to the target time below, so this is an upper limit. 184 * `wsacsc_ajax_cleanup_target_batch_seconds` (default: `1.0`) — Target duration in seconds of one `DELETE` statement during manual clear operations. The batch size doubles while statements are faster than half this value and halves when they take more than twice this value. 185 * `wsacsc_ajax_cleanup_sleep_us` (default: `5000`) — Microseconds to pause between two `DELETE` statements during manual clear operations. 186 * `wsacsc_ajax_cleanup_max_seconds` (default: `5`) — Seconds of work per AJAX request before the plugin saves progress and returns. The admin UI polls for the next chunk while you keep the page open, so a lower value updates the progress text more often. Decrease if requests time out. 175 187 176 188 = Scheduled cleanup (WP-Cron) = 177 189 178 * `wsacsc_cron_cleanup_batch_size` (default: `2000`) — Same as the AJAX batch size, but for automatic retention cleanup run on a schedule. Defaults are lower than manual cleanup to reduce impact on live traffic. 190 * `wsacsc_cron_cleanup_batch_size` (default: `1000`) — Same as the AJAX batch size, but for automatic retention cleanup run on a schedule. Defaults are lower than manual cleanup to reduce impact on live traffic. 191 * `wsacsc_cron_cleanup_target_batch_seconds` (default: `0.5`) — Same as the AJAX target time, but for scheduled cleanup. 192 * `wsacsc_cron_cleanup_sleep_us` (default: `25000`) — Microseconds to pause between two `DELETE` statements during scheduled cleanup. 179 193 * `wsacsc_cron_cleanup_max_seconds` (default: `45`) — Seconds of work per cron run before the job pauses and schedules continuation (see below). 180 194 181 195 = Background continuation = 182 196 183 * `wsacsc_cleanup_use_background_continuation` (default: `true`) — When a chunk ends before deletion is finished, schedule a single WP-Cron event to resume the job in the background. This is important for scheduled cleanup on large tables and when no admin session is polling progress. Manual cleanup in the browser also continues via AJAX polling; setting this filter to `false` disables cron-based resumption only (unfinished scheduled jobs may stall unless something else triggers the next chunk). 197 * `wsacsc_cleanup_use_background_continuation` (default: `true`) — When a chunk ends before deletion is finished, schedule a single WP-Cron event to resume the job in the background. This is important for scheduled cleanup on large tables and when no admin session is polling progress. Manual cleanup in the browser also continues via AJAX polling; setting this filter to `false` disables cron-based resumption only (unfinished scheduled jobs may stall unless something else triggers the next chunk). Since 1.3.2, only one process works on a job at a time: while the admin page polls a manual job, the background continuation waits, and it takes over about 25 seconds after the page stops polling. 198 * `wsacsc_cleanup_continuation_delay` (default: `30`) — Seconds until the background continuation runs. Clamped between `15` and `120`. 199 * `wsacsc_cron_cleanup_cli_max_seconds` (default: `600`) — When WP-Cron runs through WP-CLI (for example `wp cron event run --due-now` from a system cron job), a scheduled cleanup keeps running its next chunks in the same process, with the normal pause between chunks, instead of waiting for the next system cron run. After this many seconds, it starts no new chunk and leaves the rest to the next run. 184 200 185 201 = Scheduled auto-optimize = … … 189 205 * `wsacsc_scheduled_auto_optimize_max_rows` (default: `100000`) — Run auto-optimize only if the table's total row count is at or below this value after cleanup. Prevents long, blocking optimize operations on tables that are still huge. Values below `1000` are raised to `1000`. 190 206 * `wsacsc_scheduled_auto_optimize_delay_seconds` (default: `5`) — Seconds to wait after the last delete batch before running `OPTIMIZE TABLE`, giving the database a short breather. Clamped between `0` and `60`. 207 208 = Resources and statistics = 209 210 * `wsacsc_clear_actions_use_rebuild` (default: `true`) — When "Clear Selected Actions" deletes almost all rows of a large table, the plugin copies the few rows to keep, empties the actions and logs tables with `TRUNCATE TABLE`, and copies the kept rows back with their original IDs. This takes seconds instead of minutes and frees the disk space at once. The tables are locked during the rebuild, so Action Scheduler waits briefly and loses nothing. The plugin falls back to deleting in batches when the conditions below are not met, when the database user lacks the `CREATE`, `DROP`, `ALTER` or `LOCK TABLES` privilege, or when the tables are busy for more than 5 seconds. If a rebuild stops halfway, the plugin restores the kept rows on the next admin page load. Scheduled cleanup never uses the rebuild. 211 * `wsacsc_rebuild_min_rows` (default: `100000`) — Smallest number of rows to delete for which the rebuild is used. 212 * `wsacsc_rebuild_max_kept_actions` (default: `10000`) — Largest number of kept actions (for example pending actions) for which the rebuild is used. The lock time grows with this number. 213 * `wsacsc_rebuild_max_kept_logs` (default: `40000`) — Largest number of kept log entries for which the rebuild is used. 214 * `wsacsc_clear_logs_use_truncate` (default: `true`) — "Clear Logs" and a logs retention of 0 days empty the logs table with `TRUNCATE TABLE`, which takes under a second and frees the disk space at once. This needs the database `DROP` privilege. Without it, or when this filter returns `false`, the plugin deletes the log entries in batches. 215 * `wsacsc_cleanup_memory_limit` (default: `512M`) — Memory limit for cleanup and optimize requests. The plugin only raises the limit through `wp_raise_memory_limit()` and never lowers it. 216 * `wsacsc_exact_count_max_rows` (default: `1000000`) — Row counts on the admin screen are exact up to this value. For a larger table, the screen shows the estimate of the database server with a `~` prefix. Values below `1000` are raised to `1000`. 191 217 192 218 Example (gentler cron, no background continuation): -
ws-action-scheduler-cleaner/trunk/uninstall.php
r3750500 r3798362 13 13 } 14 14 15 $plugin_file = __FILE__; 16 $plugin_dir = plugin_dir_path( $plugin_file ); 15 /** 16 * Remove all plugin data: indexes, cron events, jobs, locks, options, and cache entries. 17 * 18 * The code runs in a function so that it defines no global variables. 19 */ 20 function wsacsc_uninstall(): void { 21 $plugin_dir = plugin_dir_path( __FILE__ ); 17 22 18 if ( file_exists( $plugin_dir . 'includes/helpers.php' ) ) { 19 require_once $plugin_dir . 'includes/helpers.php'; 20 } 21 if ( file_exists( $plugin_dir . 'includes/class-database.php' ) ) { 22 require_once $plugin_dir . 'includes/class-database.php'; 23 } 24 if ( file_exists( $plugin_dir . 'includes/class-scheduler.php' ) ) { 25 require_once $plugin_dir . 'includes/class-scheduler.php'; 23 foreach ( array( 'helpers.php', 'class-wsacsc-database.php', 'class-wsacsc-job-lock.php', 'class-wsacsc-rebuild.php', 'class-wsacsc-cleanup.php', 'class-wsacsc-scheduler.php' ) as $file ) { 24 if ( file_exists( $plugin_dir . 'includes/' . $file ) ) { 25 require_once $plugin_dir . 'includes/' . $file; 26 } 27 } 28 29 // Put back the kept rows of an interrupted fast clear before anything else. 30 if ( class_exists( 'WSACSC_Rebuild' ) && WSACSC_Rebuild::recover() ) { 31 WSACSC_Rebuild::drop_work_tables(); 32 } 33 34 if ( class_exists( 'WSACSC_Database' ) ) { 35 WSACSC_Database::drop_plugin_indexes(); 36 } 37 38 $hook_names = array( 'wsacsc_cleanup_logs', 'wsacsc_cleanup_actions' ); 39 40 if ( class_exists( 'WSACSC_Scheduler' ) ) { 41 WSACSC_Scheduler::winningsolutions_force_clear_cron_hooks( $hook_names ); 42 } else { 43 foreach ( $hook_names as $hook_name ) { 44 wp_unschedule_hook( $hook_name ); 45 } 46 } 47 48 foreach ( $hook_names as $hook_name ) { 49 if ( false !== wp_next_scheduled( $hook_name ) && function_exists( 'wsacsc_log' ) ) { 50 wsacsc_log( sprintf( 'Warning - Hook %s still exists after cleanup attempt', $hook_name ) ); 51 } 52 } 53 54 wp_unschedule_hook( 'wsacsc_maintain_indexes' ); 55 56 if ( class_exists( 'WSACSC_Cleanup' ) ) { 57 WSACSC_Cleanup::delete_all_jobs(); 58 } 59 60 $plugin_options = array( 61 'wsacsc_logs_retention', 62 'wsacsc_actions_retention', 63 'wsacsc_selected_statuses', 64 'wsacsc_actions_schedule_interval', 65 'wsacsc_logs_schedule_interval', 66 'wsacsc_actions_schedule_time', 67 'wsacsc_logs_schedule_time', 68 'wsacsc_migration_v2_done', 69 'wsacsc_db_version', 70 'wsacsc_schedule_state', 71 'wsacsc_schedule_lock', 72 'wsacsc_schedule_revision', 73 ); 74 75 foreach ( $plugin_options as $option ) { 76 delete_option( $option ); 77 } 78 79 wp_cache_delete( 'wsacsc_tables_exist', 'wsacsc' ); 80 wp_cache_delete( 'wsacsc_table_sizes', 'wsacsc' ); 26 81 } 27 82 28 global $wpdb; 29 30 $actions_table = $wpdb->prefix . 'actionscheduler_actions'; 31 if ( class_exists( 'WSACSC_Database' ) && WSACSC_Database::check_tables_exist() ) { 32 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared 33 $wpdb->query( "DROP INDEX IF EXISTS as_status_scheduled ON `{$actions_table}`" ); 34 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared 35 $wpdb->query( "DROP INDEX IF EXISTS as_status_completed ON `{$actions_table}`" ); 36 } 37 38 $hook_names = array( 'wsacsc_cleanup_logs', 'wsacsc_cleanup_actions' ); 39 40 if ( class_exists( 'WSACSC_Scheduler' ) ) { 41 WSACSC_Scheduler::winningsolutions_force_clear_cron_hooks( $hook_names ); 42 } else { 43 foreach ( $hook_names as $hook_name ) { 44 wp_unschedule_hook( $hook_name ); 45 } 46 } 47 48 foreach ( $hook_names as $hook_name ) { 49 $still_exists = wp_next_scheduled( $hook_name ); 50 if ( false !== $still_exists && function_exists( 'wsacsc_should_log' ) && wsacsc_should_log() ) { 51 error_log( sprintf( 'WS Action Scheduler Cleaner: Warning - Hook %s still exists after cleanup attempt', $hook_name ) ); 52 } 53 } 54 55 $plugin_options = array( 56 'wsacsc_logs_retention', 57 'wsacsc_actions_retention', 58 'wsacsc_selected_statuses', 59 'wsacsc_actions_schedule_interval', 60 'wsacsc_logs_schedule_interval', 61 'wsacsc_actions_schedule_time', 62 'wsacsc_logs_schedule_time', 63 'wsacsc_migration_v2_done', 64 'wsacsc_schedule_state', 65 'wsacsc_schedule_lock', 66 'wsacsc_schedule_revision', 67 ); 68 69 foreach ( $plugin_options as $option ) { 70 delete_option( $option ); 71 } 72 73 wp_cache_delete( 'wsacsc_tables_exist', 'wsacsc' ); 74 wp_cache_delete( 'wsacsc_table_sizes', 'wsacsc' ); 83 wsacsc_uninstall(); -
ws-action-scheduler-cleaner/trunk/ws-action-scheduler-cleaner.php
r3750500 r3798362 3 3 * Plugin Name: WS Action Scheduler Cleaner 4 4 * Description: Suffering from database bloat? Try cleaning up the Action Scheduler tables through an easy-to-understand GUI. 5 * Version: 1.3. 15 * Version: 1.3.2 6 6 * Author: Winning Solutions - Nagel & Mäder GbR 7 7 * Author URI: https://www.winning-solutions.de … … 13 13 * License: GPLv2 or later 14 14 * License URI: https://www.gnu.org/licenses/gpl-2.0.html 15 * 16 * @package WS_Action_Scheduler_Cleaner 15 17 */ 16 18 … … 23 25 define( 'WSACSC_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); 24 26 25 $wsacsc_plugin_data = get_file_data( 26 __FILE__, 27 array( 28 'Version' => 'Version', 29 ), 30 'plugin' 31 ); 32 define( 'WSACSC_VERSION', ! empty( $wsacsc_plugin_data['Version'] ) ? $wsacsc_plugin_data['Version'] : '1.3.1' ); 27 // Keep equal to the Version header and to the Stable tag in readme.txt. 28 define( 'WSACSC_VERSION', '1.3.2' ); 33 29 34 30 require_once WSACSC_PLUGIN_DIR . 'includes/helpers.php'; 35 require_once WSACSC_PLUGIN_DIR . 'includes/class-database.php'; 36 require_once WSACSC_PLUGIN_DIR . 'includes/class-activation.php'; 37 require_once WSACSC_PLUGIN_DIR . 'includes/class-admin.php'; 38 require_once WSACSC_PLUGIN_DIR . 'includes/class-ajax.php'; 39 require_once WSACSC_PLUGIN_DIR . 'includes/class-cleanup.php'; 40 require_once WSACSC_PLUGIN_DIR . 'includes/class-scheduler.php'; 31 require_once WSACSC_PLUGIN_DIR . 'includes/class-wsacsc-database.php'; 32 require_once WSACSC_PLUGIN_DIR . 'includes/class-wsacsc-job-lock.php'; 33 require_once WSACSC_PLUGIN_DIR . 'includes/class-wsacsc-rebuild.php'; 34 require_once WSACSC_PLUGIN_DIR . 'includes/class-wsacsc-activation.php'; 35 require_once WSACSC_PLUGIN_DIR . 'includes/class-wsacsc-admin.php'; 36 require_once WSACSC_PLUGIN_DIR . 'includes/class-wsacsc-ajax.php'; 37 require_once WSACSC_PLUGIN_DIR . 'includes/class-wsacsc-cleanup.php'; 38 require_once WSACSC_PLUGIN_DIR . 'includes/class-wsacsc-scheduler.php'; 41 39 require_once WSACSC_PLUGIN_DIR . 'includes/filters.php'; 42 40 … … 51 49 52 50 add_action( 'admin_init', array( 'WSACSC_Activation', 'migrate_existing_settings' ) ); 51 add_action( 'admin_init', array( 'WSACSC_Activation', 'maybe_upgrade' ) ); 52 add_action( 'admin_init', array( 'WSACSC_Rebuild', 'recover' ) ); 53 add_action( WSACSC_Database::INDEX_HOOK, array( 'WSACSC_Database', 'run_index_maintenance' ) ); -
ws-action-scheduler-cleaner/trunk/wsacsc-populate-test-data.php
r3559324 r3798362 5 5 * WARNING: TESTING ONLY. Do not run on production. 6 6 * 7 * Usage: Open this file via browser from the plugin directory (must be logged in as admin, WP_DEBUG on). 8 * WP-CLI: wp eval-file path/to/wsacsc-populate-test-data.php -- --table=actions --target-mb=100 9 * WP-CLI: wp eval-file path/to/wsacsc-populate-test-data.php -- --table=logs --target-rows=50000 10 * WP-CLI: wp eval-file path/to/wsacsc-populate-test-data.php -- --table=actions --target-rows=10000 --include-pending-pct=5 11 * 12 * Realistic row shapes require Action Scheduler (e.g. via WooCommerce) so schedule classes load. 7 * Generates Action Scheduler rows that resemble a real WooCommerce site: 8 * - Action IDs follow time: older actions have lower IDs, as on a real site. 9 * - Most finished actions are "complete". "failed" and "canceled" are rare. 10 * - Every action gets the log entries that Action Scheduler writes for it 11 * ("action created", "action started via …", "action complete via …"). 12 * - Hooks, arguments, groups and schedules follow common WooCommerce patterns. 13 * 14 * Usage (browser): open this file from the plugin directory while logged in as an 15 * administrator, with WP_DEBUG on. 16 * 17 * Usage (WP-CLI): pass options as key=value arguments and run as an administrator: 18 * wp --user=admin eval-file wsacsc-populate-test-data.php table=actions target-mb=500 19 * wp --user=admin eval-file wsacsc-populate-test-data.php table=actions target-rows=100000 days=180 pending-pct=2 20 * wp --user=admin eval-file wsacsc-populate-test-data.php table=actions target-rows=50000 logs=0 21 * wp --user=admin eval-file wsacsc-populate-test-data.php table=logs target-rows=200000 22 * 23 * The actions mode fills the actions table to the target and adds the matching log 24 * entries to the logs table (logs=0 turns this off). The logs mode adds log entries 25 * for existing actions, oldest first, and needs actions in the table. 26 * 27 * Realistic row shapes need Action Scheduler classes (for example from WooCommerce), 28 * so that schedules are serialized like Action Scheduler does. 13 29 * 14 30 * @package WS_Action_Scheduler_Cleaner … … 27 43 } 28 44 29 while ( $dir && $dir !== dirname( $dir )) {45 while ( $dir && dirname( $dir ) !== $dir ) { 30 46 $candidate = $dir . DIRECTORY_SEPARATOR . 'wp-load.php'; 31 47 if ( is_readable( $candidate ) ) { … … 39 55 40 56 if ( ! defined( 'ABSPATH' ) ) { 41 $w p_load = wsacsc_populate_locate_wp_load( __DIR__ );42 if ( ! $w p_load ) {57 $wsacsc_populate_wp_load = wsacsc_populate_locate_wp_load( __DIR__ ); 58 if ( ! $wsacsc_populate_wp_load ) { 43 59 header( 'Content-Type: text/plain; charset=utf-8', true, 500 ); 44 60 echo 'Could not locate wp-load.php. Place this file inside a WordPress installation.'; 45 61 exit; 46 62 } 47 require_once $w p_load;63 require_once $wsacsc_populate_wp_load; 48 64 } 49 65 … … 57 73 58 74 if ( 'cli' === PHP_SAPI && defined( 'WP_CLI' ) && WP_CLI ) { 59 wsacsc_populate_run_cli(); 75 // WP-CLI eval-file passes positional arguments in $args. 76 wsacsc_populate_run_cli( isset( $args ) && is_array( $args ) ? $args : array() ); 60 77 exit; 61 78 } … … 75 92 */ 76 93 function wsacsc_populate_is_ajax_request() { 77 if ( isset( $_POST['wsacsc_populate_ajax'] ) && '1' === (string) $_POST['wsacsc_populate_ajax'] ) { 94 // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Routing only. The handler verifies the nonce. 95 if ( isset( $_POST['wsacsc_populate_ajax'] ) && '1' === sanitize_text_field( wp_unslash( $_POST['wsacsc_populate_ajax'] ) ) ) { 78 96 return true; 79 97 } 80 98 81 $method = isset( $_SERVER['REQUEST_METHOD'] ) ? strtoupper( (string) $_SERVER['REQUEST_METHOD']) : '';99 $method = isset( $_SERVER['REQUEST_METHOD'] ) ? strtoupper( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ) ) : ''; 82 100 if ( 'POST' !== $method ) { 83 101 return false; 84 102 } 85 103 86 $content_type = isset( $_SERVER['CONTENT_TYPE'] ) ? (string) $_SERVER['CONTENT_TYPE']: '';87 return str_contains( $content_type, 'application/json' );104 $content_type = isset( $_SERVER['CONTENT_TYPE'] ) ? sanitize_text_field( wp_unslash( $_SERVER['CONTENT_TYPE'] ) ) : ''; 105 return false !== strpos( $content_type, 'application/json' ); 88 106 } 89 107 … … 94 112 */ 95 113 function wsacsc_populate_get_request_payload() { 96 $content_type = isset( $_SERVER['CONTENT_TYPE'] ) ? (string) $_SERVER['CONTENT_TYPE'] : ''; 97 if ( str_contains( $content_type, 'application/json' ) ) { 98 // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- raw JSON body. 99 $raw = file_get_contents( 'php://input' ); 100 $data = json_decode( $raw, true ); 114 $content_type = isset( $_SERVER['CONTENT_TYPE'] ) ? sanitize_text_field( wp_unslash( $_SERVER['CONTENT_TYPE'] ) ) : ''; 115 if ( false !== strpos( $content_type, 'application/json' ) ) { 116 // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- Raw JSON body. 117 $data = json_decode( (string) file_get_contents( 'php://input' ), true ); 101 118 return is_array( $data ) ? $data : array(); 102 119 } 103 120 104 121 $payload = array(); 122 // phpcs:ignore WordPress.Security.NonceVerification.Missing -- The handler verifies the nonce in the payload. 105 123 foreach ( $_POST as $key => $value ) { 106 124 $payload[ $key ] = is_string( $value ) ? wp_unslash( $value ) : $value; … … 118 136 function wsacsc_populate_json_response( $success, array $data ) { 119 137 nocache_headers(); 120 header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) );121 138 wp_send_json( array_merge( array( 'success' => $success ), $data ) ); 122 139 } … … 154 171 } 155 172 173 /* 174 * ------------------------------------------------------------------------- 175 * Limits and tuning 176 * ------------------------------------------------------------------------- 177 */ 178 156 179 /** 157 180 * Transient key for a populate job. … … 188 211 */ 189 212 function wsacsc_populate_max_rows_per_table() { 190 return (int) apply_filters( 'wsacsc_populate_max_rows_per_table', 1000000 );191 } 192 193 /** 194 * Rows inserted per batch.213 return (int) apply_filters( 'wsacsc_populate_max_rows_per_table', 5000000 ); 214 } 215 216 /** 217 * Actions inserted per batch. Each action also gets 2 to 3 log rows. 195 218 * 196 219 * @return int 197 220 */ 198 221 function wsacsc_populate_batch_row_count() { 199 return (int) apply_filters( 'wsacsc_populate_batch_row_count', 600);222 return max( 1, (int) apply_filters( 'wsacsc_populate_batch_row_count', 600 ) ); 200 223 } 201 224 … … 206 229 */ 207 230 function wsacsc_populate_bulk_chunk_size() { 208 return (int) apply_filters( 'wsacsc_populate_bulk_chunk_size', 250);231 return max( 1, (int) apply_filters( 'wsacsc_populate_bulk_chunk_size', 250 ) ); 209 232 } 210 233 … … 215 238 */ 216 239 function wsacsc_populate_max_seconds_per_batch() { 217 return (int) apply_filters( 'wsacsc_populate_max_seconds_per_batch', 25);240 return max( 1, (int) apply_filters( 'wsacsc_populate_max_seconds_per_batch', 20 ) ); 218 241 } 219 242 … … 224 247 */ 225 248 function wsacsc_populate_size_check_interval() { 226 return (int) apply_filters( 'wsacsc_populate_size_check_interval', 40 ); 227 } 228 229 /** 230 * Estimated bytes per action row until recalibrated from information_schema. 231 * 249 return max( 1, (int) apply_filters( 'wsacsc_populate_size_check_interval', 20 ) ); 250 } 251 252 /** 253 * Estimated bytes per row (data and indexes) until recalibrated from information_schema. 254 * 255 * Measured on Action Scheduler 4.2: about 770 bytes per action row with its 10 secondary 256 * indexes, and about 140 bytes per log row. 257 * 258 * @param string $table actions or logs. 232 259 * @return int 233 260 */ 234 function wsacsc_populate_default_estimated_action_bytes() { 235 return (int) apply_filters( 'wsacsc_populate_default_estimated_action_bytes', 450 ); 236 } 237 238 /** 239 * Estimated bytes per log row until recalibrated. 261 function wsacsc_populate_default_estimated_row_bytes( $table ) { 262 if ( 'actions' === $table ) { 263 return (int) apply_filters( 'wsacsc_populate_default_estimated_action_bytes', 770 ); 264 } 265 266 return (int) apply_filters( 'wsacsc_populate_default_estimated_log_bytes', 140 ); 267 } 268 269 /** 270 * Default time span of generated history in days. 240 271 * 241 272 * @return int 242 273 */ 243 function wsacsc_populate_default_estimated_log_bytes() { 244 return (int) apply_filters( 'wsacsc_populate_default_estimated_log_bytes', 180 ); 245 } 246 247 /** 248 * Realistic WooCommerce / WordPress hooks. 249 * 250 * @return string[] 251 */ 252 function wsacsc_populate_realistic_hooks() { 274 function wsacsc_populate_default_span_days() { 275 return 90; 276 } 277 278 /* 279 * ------------------------------------------------------------------------- 280 * Realistic data model 281 * ------------------------------------------------------------------------- 282 */ 283 284 /** 285 * Status weights of finished actions, in percent. 286 * 287 * On a typical store almost all finished actions are complete. Canceled actions come 288 * mostly from unscheduled recurring actions, and failed actions are rare. 289 * 290 * @return array<string, int> 291 */ 292 function wsacsc_populate_status_weights() { 293 return (array) apply_filters( 294 'wsacsc_populate_status_weights', 295 array( 296 'complete' => 94, 297 'canceled' => 4, 298 'failed' => 2, 299 ) 300 ); 301 } 302 303 /** 304 * Typical Action Scheduler hooks with relative weights. 305 * 306 * The names come from WooCommerce, WooCommerce Subscriptions and common extensions. 307 * The weights are estimates for a busy store, not measured values. 308 * 309 * Keys of each entry: 310 * - weight: Relative frequency. 311 * - group: Action Scheduler group slug, or an empty string for no group. 312 * - args: Argument pattern (see wsacsc_populate_build_action_args()). 313 * - recurring: Interval in seconds for recurring actions, or 0 for single actions. 314 * - async: Whether the action normally runs through an async request. 315 * 316 * @return array<string, array{weight: int, group: string, args: string, recurring: int, async: bool}> 317 */ 318 function wsacsc_populate_hook_profiles() { 319 return (array) apply_filters( 320 'wsacsc_populate_hook_profiles', 321 array( 322 'woocommerce_deliver_webhook_async' => array( 323 'weight' => 22, 324 'group' => 'woocommerce-webhooks', 325 'args' => 'webhook', 326 'recurring' => 0, 327 'async' => true, 328 ), 329 'wc-admin_import_orders' => array( 330 'weight' => 20, 331 'group' => 'wc-admin-data', 332 'args' => 'id', 333 'recurring' => 0, 334 'async' => true, 335 ), 336 'woocommerce_run_product_attribute_lookup_update_callback' => array( 337 'weight' => 14, 338 'group' => 'woocommerce-db-updates', 339 'args' => 'product_lookup', 340 'recurring' => 0, 341 'async' => true, 342 ), 343 'wc-admin_import_customers' => array( 344 'weight' => 8, 345 'group' => 'wc-admin-data', 346 'args' => 'id', 347 'recurring' => 0, 348 'async' => true, 349 ), 350 'woocommerce_scheduled_subscription_payment' => array( 351 'weight' => 10, 352 'group' => '', 353 'args' => 'subscription', 354 'recurring' => 0, 355 'async' => false, 356 ), 357 'woocommerce_scheduled_subscription_expiration' => array( 358 'weight' => 3, 359 'group' => '', 360 'args' => 'subscription', 361 'recurring' => 0, 362 'async' => false, 363 ), 364 'woocommerce_scheduled_subscription_trial_end' => array( 365 'weight' => 2, 366 'group' => '', 367 'args' => 'subscription', 368 'recurring' => 0, 369 'async' => false, 370 ), 371 'woocommerce_cleanup_draft_orders' => array( 372 'weight' => 4, 373 'group' => '', 374 'args' => 'none', 375 'recurring' => DAY_IN_SECONDS, 376 'async' => false, 377 ), 378 'wc_admin_unsnooze_admin_notes' => array( 379 'weight' => 6, 380 'group' => 'wc-admin-notes', 381 'args' => 'none', 382 'recurring' => HOUR_IN_SECONDS, 383 'async' => false, 384 ), 385 'action_scheduler/migration_hook' => array( 386 'weight' => 3, 387 'group' => 'action-scheduler-migration', 388 'args' => 'none', 389 'recurring' => MINUTE_IN_SECONDS, 390 'async' => false, 391 ), 392 'mailpoet/cron/daemon-trigger' => array( 393 'weight' => 8, 394 'group' => 'mailpoet-cron', 395 'args' => 'none', 396 'recurring' => MINUTE_IN_SECONDS, 397 'async' => false, 398 ), 399 ) 400 ); 401 } 402 403 /** 404 * Pick a key from a weight map. 405 * 406 * @param array<string, int> $weights Key => weight. 407 * @return string 408 */ 409 function wsacsc_populate_pick_weighted( array $weights ) { 410 $total = array_sum( $weights ); 411 $roll = wp_rand( 1, max( 1, (int) $total ) ); 412 413 foreach ( $weights as $key => $weight ) { 414 $roll -= (int) $weight; 415 if ( $roll <= 0 ) { 416 return (string) $key; 417 } 418 } 419 420 return (string) array_key_first( $weights ); 421 } 422 423 /** 424 * Max indexed args length (matches Action Scheduler DB store). 425 * 426 * @return int 427 */ 428 function wsacsc_populate_max_args_index_length() { 429 return (int) apply_filters( 'wsacsc_populate_max_args_index_length', 191 ); 430 } 431 432 /** 433 * Build args and optional extended_args for an action row. 434 * 435 * About 1% of actions carry a long payload, which Action Scheduler stores in 436 * extended_args with an md5 hash in args. 437 * 438 * @param string $pattern Argument pattern of the hook profile. 439 * @param bool $has_extended_args Whether the table has the extended_args column. 440 * @return array{args: string, extended_args: string|null} 441 */ 442 function wsacsc_populate_build_action_args( $pattern, $has_extended_args ) { 443 switch ( $pattern ) { 444 case 'webhook': 445 $args_array = array( wp_rand( 1, 12 ), wp_rand( 1000, 250000 ) ); 446 break; 447 case 'product_lookup': 448 $args_array = array( wp_rand( 10, 60000 ), wp_rand( 1, 2 ) ); 449 break; 450 case 'subscription': 451 $args_array = array( 'subscription_id' => wp_rand( 1000, 250000 ) ); 452 break; 453 case 'id': 454 $args_array = array( wp_rand( 1000, 250000 ) ); 455 break; 456 default: 457 $args_array = array(); 458 } 459 460 if ( wp_rand( 1, 100 ) === 1 ) { 461 $args_array = array( 462 'order_id' => wp_rand( 1000, 250000 ), 463 'payload' => wp_generate_password( 220, false ), 464 'meta' => array_fill( 0, 8, wp_rand( 1, 9999 ) ), 465 ); 466 } 467 468 $json = wp_json_encode( $args_array ); 469 if ( false === $json ) { 470 $json = '[]'; 471 } 472 473 if ( strlen( $json ) <= wsacsc_populate_max_args_index_length() ) { 474 return array( 475 'args' => $json, 476 'extended_args' => null, 477 ); 478 } 479 480 if ( ! $has_extended_args ) { 481 return array( 482 'args' => substr( $json, 0, wsacsc_populate_max_args_index_length() ), 483 'extended_args' => null, 484 ); 485 } 486 253 487 return array( 254 'woocommerce_scheduled_subscription_payment', 255 'woocommerce_scheduled_subscription_trial_end', 256 'woocommerce_cleanup_sessions', 257 'woocommerce_update_product_lookup_tables', 258 'woocommerce_run_update_callback', 259 'woocommerce_cleanup_logs', 260 'woocommerce_cleanup_personal_data', 261 'woocommerce_scheduled_sales', 262 'woocommerce_scheduled_downloads', 263 'woocommerce_cleanup_expired_transients', 264 'action_scheduler/migration_hook', 265 'wp_scheduled_auto_draft_delete', 266 'wp_scheduled_delete', 267 'wp_update_plugins', 268 'wp_update_themes', 269 'wp_version_check', 270 'wp_update_core', 271 'recovery_mode_clean_expired_keys', 272 'wp_privacy_delete_old_export_files', 273 'delete_expired_transients', 274 'wp_scheduled_delete_revisions', 488 'args' => md5( $json ), 489 'extended_args' => $json, 275 490 ); 276 491 } 277 492 278 493 /** 279 * Allowed action statuses for test data. 280 * 281 * @return string[] 282 */ 283 function wsacsc_populate_statuses() { 284 return array( 'complete', 'failed', 'canceled' ); 285 } 286 287 /** 288 * Get table byte size from information_schema. 494 * Serialized schedule for an action row, as Action Scheduler stores it. 495 * 496 * @param string $status Action status. 497 * @param int $timestamp Scheduled time (Unix, UTC). 498 * @param int $recurring Recurrence interval in seconds, or 0. 499 * @return string 500 */ 501 function wsacsc_populate_build_action_schedule( $status, $timestamp, $recurring ) { 502 $fallback = 'O:28:"ActionScheduler_NullSchedule":0:{}'; 503 504 if ( ! class_exists( 'ActionScheduler_SimpleSchedule' ) ) { 505 return $fallback; 506 } 507 508 try { 509 $date = new DateTime( '@' . (int) $timestamp ); 510 $date->setTimezone( new DateTimeZone( 'UTC' ) ); 511 512 // phpcs:disable WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize -- Same storage format as Action Scheduler. 513 if ( 'canceled' === $status && class_exists( 'ActionScheduler_CanceledSchedule' ) ) { 514 return serialize( new ActionScheduler_CanceledSchedule( $date ) ); 515 } 516 517 if ( $recurring > 0 && class_exists( 'ActionScheduler_IntervalSchedule' ) ) { 518 return serialize( new ActionScheduler_IntervalSchedule( $date, $recurring ) ); 519 } 520 521 return serialize( new ActionScheduler_SimpleSchedule( $date ) ); 522 // phpcs:enable 523 } catch ( Exception $e ) { 524 return $fallback; 525 } 526 } 527 528 /** 529 * Convert a Unix timestamp to MySQL datetime strings in UTC and site time. 530 * 531 * @param int $timestamp Unix timestamp. 532 * @return array{gmt: string, local: string} 533 */ 534 function wsacsc_populate_mysql_dates( $timestamp ) { 535 return array( 536 'gmt' => gmdate( 'Y-m-d H:i:s', (int) $timestamp ), 537 'local' => wp_date( 'Y-m-d H:i:s', (int) $timestamp ), 538 ); 539 } 540 541 /* 542 * ------------------------------------------------------------------------- 543 * Schema helpers 544 * ------------------------------------------------------------------------- 545 */ 546 547 /** 548 * Optional columns and tables of the Action Scheduler schema (cached per request). 549 * 550 * @return array{has_priority: bool, has_extended_args: bool, has_groups_table: bool} 551 */ 552 function wsacsc_populate_get_actions_schema() { 553 static $schema = null; 554 555 if ( null !== $schema ) { 556 return $schema; 557 } 558 559 global $wpdb; 560 561 $actions_table = $wpdb->prefix . 'actionscheduler_actions'; 562 $groups_table = $wpdb->prefix . 'actionscheduler_groups'; 563 564 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Dev utility, cached in a static variable. 565 $columns_result = $wpdb->get_results( $wpdb->prepare( 'DESC %i', $actions_table ) ); 566 $columns = is_array( $columns_result ) ? wp_list_pluck( $columns_result, 'Field' ) : array(); 567 568 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Dev utility, cached in a static variable. 569 $groups_exist = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $groups_table ) ) ) === $groups_table; 570 571 $schema = array( 572 'has_priority' => in_array( 'priority', $columns, true ), 573 'has_extended_args' => in_array( 'extended_args', $columns, true ), 574 'has_groups_table' => $groups_exist, 575 ); 576 577 return $schema; 578 } 579 580 /** 581 * Group slug => group_id map for all groups of the hook profiles (cached per request). 582 * 583 * @return array<string, int> 584 */ 585 function wsacsc_populate_group_ids() { 586 static $map = null; 587 588 if ( null !== $map ) { 589 return $map; 590 } 591 592 $map = array(); 593 if ( ! wsacsc_populate_get_actions_schema()['has_groups_table'] ) { 594 return $map; 595 } 596 597 global $wpdb; 598 $groups_table = $wpdb->prefix . 'actionscheduler_groups'; 599 600 foreach ( wsacsc_populate_hook_profiles() as $profile ) { 601 $slug = (string) $profile['group']; 602 if ( '' === $slug || isset( $map[ $slug ] ) ) { 603 continue; 604 } 605 606 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Dev utility. 607 $existing = $wpdb->get_var( $wpdb->prepare( 'SELECT group_id FROM %i WHERE slug = %s LIMIT 1', $groups_table, $slug ) ); 608 if ( $existing ) { 609 $map[ $slug ] = (int) $existing; 610 continue; 611 } 612 613 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- Dev utility. 614 $wpdb->insert( $groups_table, array( 'slug' => $slug ), array( '%s' ) ); 615 if ( $wpdb->insert_id ) { 616 $map[ $slug ] = (int) $wpdb->insert_id; 617 } 618 } 619 620 return $map; 621 } 622 623 /** 624 * Get table byte size (data and indexes) from information_schema. 289 625 * 290 626 * @param string $table_name Full table name. … … 294 630 global $wpdb; 295 631 632 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Size must be current. 296 633 $size = $wpdb->get_var( 297 634 $wpdb->prepare( 298 'SELECT ROUND((DATA_LENGTH + INDEX_LENGTH)) AS size 299 FROM information_schema.TABLES 300 WHERE TABLE_SCHEMA = %s 301 AND TABLE_NAME = %s', 302 DB_NAME, 635 'SELECT (data_length + index_length) AS wsacsc_size FROM information_schema.TABLES WHERE table_schema = DATABASE() AND table_name = %s', 303 636 $table_name 304 637 ) … … 309 642 310 643 /** 644 * Row count of a table. 645 * 646 * @param string $table_name Full table name. 647 * @return int 648 */ 649 function wsacsc_populate_get_table_row_count( $table_name ) { 650 global $wpdb; 651 652 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Count must be current. 653 return max( 0, (int) $wpdb->get_var( $wpdb->prepare( 'SELECT COUNT(*) FROM %i', $table_name ) ) ); 654 } 655 656 /** 311 657 * Format bytes for display. 312 658 * … … 318 664 $units = array( 'B', 'KB', 'MB', 'GB', 'TB' ); 319 665 $bytes = max( 0, (int) $bytes ); 320 321 for ( $i = 0; $bytes > 1024 && $i < count( $units ) - 1; $i++ ) { 666 $count = count( $units ); 667 668 for ( $i = 0; $bytes > 1024 && $i < $count - 1; $i++ ) { 322 669 $bytes /= 1024; 323 670 } 324 671 325 672 return round( $bytes, $precision ) . ' ' . $units[ $i ]; 326 }327 328 /**329 * Detect optional columns on the actions table (cached per request).330 *331 * @return array{columns: string[], has_completed_date: bool, has_priority: bool, has_extended_args: bool, has_groups_table: bool}332 */333 function wsacsc_populate_get_actions_schema() {334 static $schema = null;335 336 if ( null !== $schema ) {337 return $schema;338 }339 340 global $wpdb;341 342 $actions_table = $wpdb->prefix . 'actionscheduler_actions';343 $groups_table = $wpdb->prefix . 'actionscheduler_groups';344 $columns_query = $wpdb->prepare( 'DESC %i', $actions_table );345 $columns_result = $wpdb->get_results( $columns_query );346 $columns = is_array( $columns_result ) ? wp_list_pluck( $columns_result, 'Field' ) : array();347 348 $groups_exist = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $groups_table ) ) === $groups_table;349 350 $schema = array(351 'columns' => $columns,352 'has_completed_date' => in_array( 'completed_date_gmt', $columns, true ) && in_array( 'completed_date_local', $columns, true ),353 'has_priority' => in_array( 'priority', $columns, true ),354 'has_extended_args' => in_array( 'extended_args', $columns, true ),355 'has_groups_table' => $groups_exist,356 );357 358 return $schema;359 }360 361 /**362 * Max indexed args length (matches Action Scheduler DB store).363 *364 * @return int365 */366 function wsacsc_populate_max_args_index_length() {367 return (int) apply_filters( 'wsacsc_populate_max_args_index_length', 191 );368 }369 370 /**371 * Whether Action Scheduler schedule classes are available.372 *373 * @return bool374 */375 function wsacsc_populate_can_use_as_classes() {376 return class_exists( 'ActionScheduler_SimpleSchedule' ) && class_exists( 'ActionScheduler_Action' );377 }378 379 /**380 * Convert a GMT mysql datetime string to site-local mysql format.381 *382 * @param string $gmt_mysql Datetime in GMT (Y-m-d H:i:s).383 * @return string384 */385 function wsacsc_populate_gmt_to_local_mysql( $gmt_mysql ) {386 if ( function_exists( 'as_get_datetime_object' ) && class_exists( 'ActionScheduler_TimezoneHelper' ) ) {387 $date = as_get_datetime_object( $gmt_mysql );388 ActionScheduler_TimezoneHelper::set_local_timezone( $date );389 return $date->format( 'Y-m-d H:i:s' );390 }391 392 return wp_date( 'Y-m-d H:i:s', strtotime( $gmt_mysql . ' UTC' ) );393 }394 395 /**396 * Hash JSON args for indexed column when payload exceeds max length (AS-compatible).397 *398 * @param string $json_args JSON-encoded args.399 * @return string400 */401 function wsacsc_populate_hash_args( $json_args ) {402 return md5( $json_args );403 }404 405 /**406 * Build args + optional extended_args for an action row.407 *408 * @param string $hook Action hook.409 * @param bool $force_long_args Force extended_args pattern (~5% of rows).410 * @return array{args: string, extended_args?: string}411 */412 function wsacsc_populate_build_action_args( $hook, $force_long_args = false ) {413 $schema = wsacsc_populate_get_actions_schema();414 $max = wsacsc_populate_max_args_index_length();415 416 $empty_hooks = array(417 'woocommerce_cleanup_sessions',418 'woocommerce_cleanup_logs',419 'woocommerce_cleanup_personal_data',420 'woocommerce_cleanup_expired_transients',421 'wp_scheduled_auto_draft_delete',422 'wp_scheduled_delete',423 'wp_update_plugins',424 'wp_update_themes',425 'wp_version_check',426 'wp_update_core',427 'recovery_mode_clean_expired_keys',428 'wp_privacy_delete_old_export_files',429 'delete_expired_transients',430 'wp_scheduled_delete_revisions',431 'action_scheduler/migration_hook',432 );433 434 if ( in_array( $hook, $empty_hooks, true ) ) {435 $args_array = array();436 } elseif ( str_contains( $hook, 'subscription' ) ) {437 $args_array = array( wp_rand( 1, 99999 ), wp_rand( 1, 9999 ) );438 } elseif ( str_contains( $hook, 'woocommerce' ) ) {439 $args_array = array( wp_rand( 1, 99999 ) );440 } else {441 $args_array = array( wp_rand( 1, 99999 ) );442 if ( wp_rand( 0, 1 ) ) {443 $args_array[] = (string) wp_rand( 1, 1000 );444 }445 }446 447 if ( $force_long_args ) {448 $args_array = array(449 'order_id' => wp_rand( 1, 99999 ),450 'payload' => wp_generate_password( 220, false ),451 'meta' => array_fill( 0, 8, wp_rand( 1, 9999 ) ),452 'description' => 'WS AS Cleaner populate extended args test row',453 );454 }455 456 $json = wp_json_encode( $args_array );457 if ( false === $json ) {458 $json = '[]';459 }460 461 $result = array( 'args' => $json );462 463 if ( strlen( $json ) <= $max ) {464 return $result;465 }466 467 if ( ! $schema['has_extended_args'] ) {468 $result['args'] = substr( $json, 0, $max );469 return $result;470 }471 472 $result['args'] = wsacsc_populate_hash_args( $json );473 $result['extended_args'] = $json;474 475 return $result;476 }477 478 /**479 * Serialized schedule fallback when AS classes are unavailable.480 *481 * @return string482 */483 function wsacsc_populate_fallback_schedule_serialized() {484 // Minimal ActionScheduler_NullSchedule-like serialized blob (schedule only; dev fallback).485 return 'O:32:"ActionScheduler_NullSchedule":0:{}';486 }487 488 /**489 * Build serialized schedule column value for an action row.490 *491 * @param string $status Action status slug.492 * @param string $scheduled_gmt Scheduled datetime GMT (Y-m-d H:i:s).493 * @return string494 */495 function wsacsc_populate_build_action_schedule( $status, $scheduled_gmt ) {496 if ( ! wsacsc_populate_can_use_as_classes() ) {497 return wsacsc_populate_fallback_schedule_serialized();498 }499 500 try {501 $timestamp = strtotime( $scheduled_gmt . ' UTC' );502 if ( false === $timestamp ) {503 return wsacsc_populate_fallback_schedule_serialized();504 }505 506 $date = new DateTime( '@' . $timestamp );507 $date->setTimezone( new DateTimeZone( 'UTC' ) );508 509 if ( 'canceled' === $status && class_exists( 'ActionScheduler_CanceledSchedule' ) ) {510 return serialize( new ActionScheduler_CanceledSchedule( $date ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize511 }512 513 if ( wp_rand( 0, 100 ) < 12 && class_exists( 'ActionScheduler_IntervalSchedule' ) ) {514 return serialize( new ActionScheduler_IntervalSchedule( $date, HOUR_IN_SECONDS ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize515 }516 517 if ( wp_rand( 0, 100 ) < 5 && class_exists( 'ActionScheduler_CronSchedule' ) ) {518 return serialize( new ActionScheduler_CronSchedule( $date, '0 0 * * *' ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize519 }520 521 return serialize( new ActionScheduler_SimpleSchedule( $date ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize522 } catch ( Exception $e ) {523 return wsacsc_populate_fallback_schedule_serialized();524 }525 }526 527 /**528 * Ensure common Action Scheduler groups exist; return slug => group_id map.529 *530 * @return array<string, int>531 */532 function wsacsc_populate_ensure_test_groups() {533 static $map = null;534 535 if ( null !== $map ) {536 return $map;537 }538 539 $map = array();540 $schema = wsacsc_populate_get_actions_schema();541 542 if ( ! $schema['has_groups_table'] ) {543 return $map;544 }545 546 global $wpdb;547 548 $groups_table = $wpdb->prefix . 'actionscheduler_groups';549 $slugs = array( 'woocommerce', 'action-scheduler', '' );550 551 foreach ( $slugs as $slug ) {552 if ( '' === $slug ) {553 continue;554 }555 556 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching557 $existing = $wpdb->get_var(558 $wpdb->prepare(559 'SELECT group_id FROM %i WHERE slug = %s LIMIT 1',560 $groups_table,561 $slug562 )563 );564 565 if ( $existing ) {566 $map[ $slug ] = (int) $existing;567 continue;568 }569 570 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery571 $wpdb->insert(572 $groups_table,573 array( 'slug' => $slug ),574 array( '%s' )575 );576 577 if ( $wpdb->insert_id ) {578 $map[ $slug ] = (int) $wpdb->insert_id;579 }580 }581 582 return $map;583 }584 585 /**586 * Pick a group_id for a new action row.587 *588 * @param array<string, int> $group_map Slug => group_id.589 * @return int590 */591 function wsacsc_populate_pick_group_id( array $group_map ) {592 if ( empty( $group_map ) || wp_rand( 0, 100 ) > 70 ) {593 return 0;594 }595 596 $ids = array_values( $group_map );597 return $ids[ wp_rand( 0, count( $ids ) - 1 ) ];598 }599 600 /**601 * Pick action priority (weighted toward default 10).602 *603 * @return int604 */605 function wsacsc_populate_pick_priority() {606 $choices = array( 10, 10, 10, 10, 0, 20 );607 return $choices[ wp_rand( 0, count( $choices ) - 1 ) ];608 }609 610 /**611 * Build coherent GMT/local datetimes for a finished or pending action.612 *613 * @param array<string, mixed> $ctx Generation context.614 * @param string $status Action status.615 * @param bool $is_pending Whether row is pending (future scheduled).616 * @return array<string, string>617 */618 function wsacsc_populate_build_action_dates( array $ctx, $status, $is_pending = false ) {619 $default_date = '0000-00-00 00:00:00';620 621 if ( $is_pending ) {622 $days_ahead = wp_rand( 1, 14 );623 $scheduled_ts = $ctx['now_gmt_ts'] + ( $days_ahead * DAY_IN_SECONDS );624 $scheduled_gmt = gmdate( 'Y-m-d H:i:s', $scheduled_ts );625 626 return array(627 'scheduled_date_gmt' => $scheduled_gmt,628 'scheduled_date_local' => wsacsc_populate_gmt_to_local_mysql( $scheduled_gmt ),629 'last_attempt_gmt' => $default_date,630 'last_attempt_local' => $default_date,631 'completed_date_gmt' => '',632 'completed_date_local' => '',633 );634 }635 636 $days_ago = wp_rand( 0, 90 );637 $scheduled_ts = $ctx['now_gmt_ts'] - ( $days_ago * DAY_IN_SECONDS );638 $offset_sec = wp_rand( 60, 7200 );639 $last_ts = min( $ctx['now_gmt_ts'] - wp_rand( 0, 3600 ), $scheduled_ts + $offset_sec );640 $scheduled_gmt = gmdate( 'Y-m-d H:i:s', $scheduled_ts );641 $last_gmt = gmdate( 'Y-m-d H:i:s', $last_ts );642 643 $dates = array(644 'scheduled_date_gmt' => $scheduled_gmt,645 'scheduled_date_local' => wsacsc_populate_gmt_to_local_mysql( $scheduled_gmt ),646 'last_attempt_gmt' => $last_gmt,647 'last_attempt_local' => wsacsc_populate_gmt_to_local_mysql( $last_gmt ),648 'completed_date_gmt' => '',649 'completed_date_local' => '',650 );651 652 if ( in_array( $status, array( 'complete', 'failed' ), true ) ) {653 $dates['completed_date_gmt'] = $last_gmt;654 $dates['completed_date_local'] = $dates['last_attempt_local'];655 }656 657 return $dates;658 }659 660 /**661 * Sanitize pending-backlog percentage for actions population.662 *663 * @param mixed $pct Raw value.664 * @return int 0-30665 */666 function wsacsc_populate_sanitize_pending_pct( $pct ) {667 if ( ! is_numeric( $pct ) ) {668 return 0;669 }670 671 $pct = (int) $pct;672 return max( 0, min( 30, $pct ) );673 673 } 674 674 … … 681 681 global $wpdb; 682 682 683 $actions_table = $wpdb->prefix . 'actionscheduler_actions'; 684 $logs_table = $wpdb->prefix . 'actionscheduler_logs'; 685 686 $actions_exist = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $actions_table ) ) === $actions_table; 687 $logs_exist = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $logs_table ) ) === $logs_table; 688 689 return $actions_exist && $logs_exist; 690 } 691 692 /** 693 * Sanitize and validate target MB from user input. 694 * 695 * @param mixed $target_mb Raw value. 683 foreach ( array( 'actionscheduler_actions', 'actionscheduler_logs' ) as $suffix ) { 684 $table = $wpdb->prefix . $suffix; 685 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Dev utility. 686 if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $table ) ) ) !== $table ) { 687 return false; 688 } 689 } 690 691 return true; 692 } 693 694 /* 695 * ------------------------------------------------------------------------- 696 * Options and jobs 697 * ------------------------------------------------------------------------- 698 */ 699 700 /** 701 * Parse an integer option within a range. 702 * 703 * @param mixed $value Raw value. 704 * @param int $min Minimum. 705 * @param int $max Maximum. 696 706 * @return int|false 697 707 */ 698 function wsacsc_populate_ sanitize_target_mb( $target_mb) {699 if ( ! is_numeric( $ target_mb) ) {708 function wsacsc_populate_parse_int( $value, $min, $max ) { 709 if ( ! is_numeric( $value ) ) { 700 710 return false; 701 711 } 702 712 703 $mb = (int) $target_mb; 704 if ( $mb < 1 || $mb > wsacsc_populate_max_target_mb() ) { 705 return false; 706 } 707 708 return $mb; 709 } 710 711 /** 712 * Sanitize populate table target (actions or logs). 713 * 714 * @param mixed $table Raw value. 715 * @return string|false 716 */ 717 function wsacsc_populate_sanitize_table( $table ) { 718 $table = sanitize_key( (string) $table ); 719 if ( ! in_array( $table, array( 'actions', 'logs' ), true ) ) { 720 return false; 721 } 722 723 return $table; 724 } 725 726 /** 727 * Sanitize target mode (size in MB or row count). 728 * 729 * @param mixed $mode Raw value. 730 * @return string|false 731 */ 732 function wsacsc_populate_sanitize_target_mode( $mode ) { 733 $mode = sanitize_key( (string) $mode ); 734 if ( ! in_array( $mode, array( 'size', 'rows' ), true ) ) { 735 return false; 736 } 737 738 return $mode; 739 } 740 741 /** 742 * Sanitize target row count (total rows desired in the table). 743 * 744 * @param mixed $target_rows Raw value. 745 * @return int|false 746 */ 747 function wsacsc_populate_sanitize_target_rows( $target_rows ) { 748 if ( ! is_numeric( $target_rows ) ) { 749 return false; 750 } 751 752 $rows = (int) $target_rows; 753 if ( $rows < 1 || $rows > wsacsc_populate_max_rows_per_table() ) { 754 return false; 755 } 756 757 return $rows; 758 } 759 760 /** 761 * Row count for an Action Scheduler table. 762 * 763 * @param string $table_name Full table name. 764 * @return int 765 */ 766 function wsacsc_populate_get_table_row_count( $table_name ) { 767 global $wpdb; 768 769 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching 770 $count = $wpdb->get_var( 771 $wpdb->prepare( 772 'SELECT COUNT(*) FROM %i', 773 $table_name 774 ) 775 ); 776 777 return max( 0, (int) $count ); 778 } 779 780 /** 781 * Parse and validate start-request options for one table. 713 $value = (int) $value; 714 return ( $value < $min || $value > $max ) ? false : $value; 715 } 716 717 /** 718 * Parse and validate start options. 782 719 * 783 720 * @param array<string, mixed> $payload Request payload. … … 785 722 */ 786 723 function wsacsc_populate_parse_start_options( array $payload ) { 787 $table = isset( $payload['table'] ) ? wsacsc_populate_sanitize_table( $payload['table'] ) : false;788 if ( false === $table) {724 $table = isset( $payload['table'] ) ? sanitize_key( (string) $payload['table'] ) : ''; 725 if ( ! in_array( $table, array( 'actions', 'logs' ), true ) ) { 789 726 return new WP_Error( 'invalid_table', __( 'Invalid table. Use actions or logs.', 'ws-action-scheduler-cleaner' ) ); 790 727 } 791 728 792 $target_mode = isset( $payload['target_mode'] ) ? wsacsc_populate_sanitize_target_mode( $payload['target_mode'] ) : false;793 if ( false === $target_mode) {729 $target_mode = isset( $payload['target_mode'] ) ? sanitize_key( (string) $payload['target_mode'] ) : ''; 730 if ( ! in_array( $target_mode, array( 'size', 'rows' ), true ) ) { 794 731 return new WP_Error( 'invalid_mode', __( 'Invalid target mode. Use size or rows.', 'ws-action-scheduler-cleaner' ) ); 795 732 } 796 733 734 $options = array( 735 'table' => $table, 736 'target_mode' => $target_mode, 737 'target_mb' => 0, 738 'target_rows' => 0, 739 'span_days' => wsacsc_populate_default_span_days(), 740 'pending_pct' => 0, 741 'with_logs' => true, 742 ); 743 797 744 if ( 'size' === $target_mode ) { 798 $ target_mb = isset( $payload['target_mb'] ) ? wsacsc_populate_sanitize_target_mb( $payload['target_mb'] ) : false;799 if ( false === $ target_mb) {745 $options['target_mb'] = wsacsc_populate_parse_int( $payload['target_mb'] ?? null, 1, wsacsc_populate_max_target_mb() ); 746 if ( false === $options['target_mb'] ) { 800 747 return new WP_Error( 801 748 'invalid_mb', 802 sprintf( 803 /* translators: %d: maximum megabytes allowed. */ 804 __( 'Target size must be between 1 and %d MB.', 'ws-action-scheduler-cleaner' ), 805 wsacsc_populate_max_target_mb() 806 ) 749 /* translators: %d: maximum megabytes allowed. */ 750 sprintf( __( 'Target size must be between 1 and %d MB.', 'ws-action-scheduler-cleaner' ), wsacsc_populate_max_target_mb() ) 807 751 ); 808 752 } 809 810 $result = array( 811 'table' => $table, 812 'target_mode' => 'size', 813 'target_mb' => $target_mb, 814 ); 815 if ( 'actions' === $table ) { 816 $result['include_pending_pct'] = wsacsc_populate_sanitize_pending_pct( $payload['include_pending_pct'] ?? 0 ); 817 } 818 return $result; 819 } 820 821 $target_rows = isset( $payload['target_rows'] ) ? wsacsc_populate_sanitize_target_rows( $payload['target_rows'] ) : false; 822 if ( false === $target_rows ) { 823 return new WP_Error( 824 'invalid_rows', 825 sprintf( 753 } else { 754 $options['target_rows'] = wsacsc_populate_parse_int( $payload['target_rows'] ?? null, 1, wsacsc_populate_max_rows_per_table() ); 755 if ( false === $options['target_rows'] ) { 756 return new WP_Error( 757 'invalid_rows', 826 758 /* translators: %d: maximum row count allowed. */ 827 __( 'Target row count must be between 1 and %d.', 'ws-action-scheduler-cleaner' ), 828 wsacsc_populate_max_rows_per_table() 829 ) 830 ); 831 } 832 833 $result = array( 834 'table' => $table, 835 'target_mode' => 'rows', 836 'target_rows' => $target_rows, 837 ); 759 sprintf( __( 'Target row count must be between 1 and %d.', 'ws-action-scheduler-cleaner' ), wsacsc_populate_max_rows_per_table() ) 760 ); 761 } 762 } 763 838 764 if ( 'actions' === $table ) { 839 $result['include_pending_pct'] = wsacsc_populate_sanitize_pending_pct( $payload['include_pending_pct'] ?? 0 ); 840 } 841 return $result; 842 } 843 844 /** 845 * Create a new populate job for one table. 846 * 847 * @param array<string, mixed> $options Parsed start options from wsacsc_populate_parse_start_options(). 765 if ( isset( $payload['span_days'] ) && '' !== $payload['span_days'] ) { 766 $options['span_days'] = wsacsc_populate_parse_int( $payload['span_days'], 1, 730 ); 767 if ( false === $options['span_days'] ) { 768 return new WP_Error( 'invalid_days', __( 'History span must be between 1 and 730 days.', 'ws-action-scheduler-cleaner' ) ); 769 } 770 } 771 772 $pending = wsacsc_populate_parse_int( $payload['pending_pct'] ?? 0, 0, 30 ); 773 if ( false === $pending ) { 774 return new WP_Error( 'invalid_pending', __( 'Pending share must be between 0 and 30 percent.', 'ws-action-scheduler-cleaner' ) ); 775 } 776 $options['pending_pct'] = $pending; 777 $options['with_logs'] = ! isset( $payload['with_logs'] ) || ! in_array( (string) $payload['with_logs'], array( '0', 'false', 'no', '' ), true ); 778 } 779 780 return $options; 781 } 782 783 /** 784 * Full table name for a job table key. 785 * 786 * @param string $table actions or logs. 787 * @return string 788 */ 789 function wsacsc_populate_table_name( $table ) { 790 global $wpdb; 791 792 return $wpdb->prefix . ( 'actions' === $table ? 'actionscheduler_actions' : 'actionscheduler_logs' ); 793 } 794 795 /** 796 * Number of rows the job still plans to insert, for the timeline. 797 * 798 * @param array<string, mixed> $job Job. 799 * @return int Planned total rows of this job (inserted and remaining). 800 */ 801 function wsacsc_populate_planned_rows( array $job ) { 802 if ( 'rows' === $job['target_mode'] ) { 803 return max( 1, (int) $job['rows_to_add'] ); 804 } 805 806 $remaining_bytes = max( 0, (int) $job['target_bytes'] - (int) $job['size_bytes'] ); 807 $remaining_rows = (int) ceil( $remaining_bytes / max( 1, (int) $job['est_row_bytes'] ) ); 808 809 return max( 1, (int) $job['rows_inserted'] + $remaining_rows ); 810 } 811 812 /** 813 * Create a new populate job. 814 * 815 * @param array<string, mixed> $options Parsed start options. 848 816 * @return array<string, mixed> 849 817 */ 850 818 function wsacsc_populate_create_job( array $options ) { 851 global $wpdb; 852 853 $table = (string) $options['table']; 854 $target_mode = (string) $options['target_mode']; 855 $populate_id = 'pop_' . wp_generate_password( 12, false, false ); 856 $actions_table = $wpdb->prefix . 'actionscheduler_actions'; 857 $logs_table = $wpdb->prefix . 'actionscheduler_logs'; 858 $db_table = 'actions' === $table ? $actions_table : $logs_table; 859 860 $size_bytes = wsacsc_populate_get_table_size_bytes( $db_table ); 861 $baseline_rows = wsacsc_populate_get_table_row_count( $db_table ); 819 $table = (string) $options['table']; 820 $db_table = wsacsc_populate_table_name( $table ); 821 $size = wsacsc_populate_get_table_size_bytes( $db_table ); 822 $baseline = wsacsc_populate_get_table_row_count( $db_table ); 823 $now = time(); 862 824 863 825 $job = array( 864 'populate_id' => $populate_id,826 'populate_id' => 'pop_' . wp_generate_password( 12, false, false ), 865 827 'table' => $table, 866 'target_mode' => $target_mode,867 'target_mb' => 0,868 'target_bytes' => 0,869 'target_rows' => 0,870 'baseline_rows' => $baseline _rows,828 'target_mode' => (string) $options['target_mode'], 829 'target_mb' => (int) $options['target_mb'], 830 'target_bytes' => (int) $options['target_mb'] * 1024 * 1024, 831 'target_rows' => (int) $options['target_rows'], 832 'baseline_rows' => $baseline, 871 833 'rows_to_add' => 0, 834 'rows_inserted' => 0, 835 'logs_inserted' => 0, 836 'size_bytes' => $size, 837 'baseline_size_bytes' => $size, 838 'est_row_bytes' => wsacsc_populate_default_estimated_row_bytes( $table ), 839 'batch_count' => 0, 840 'span_days' => (int) $options['span_days'], 841 'pending_pct' => (int) $options['pending_pct'], 842 'with_logs' => (bool) $options['with_logs'], 843 'timeline_start_ts' => $now - ( (int) $options['span_days'] * DAY_IN_SECONDS ), 844 'timeline_end_ts' => $now - MINUTE_IN_SECONDS, 845 'log_cursor_id' => 0, 872 846 'status' => 'running', 873 'rows_inserted' => 0,874 'size_bytes' => $size_bytes,875 'baseline_size_bytes' => $size_bytes,876 'est_row_bytes' => 'actions' === $table877 ? wsacsc_populate_default_estimated_action_bytes()878 : wsacsc_populate_default_estimated_log_bytes(),879 'batch_count' => 0,880 'action_id_pool' => array(),881 'last_action_id' => 0,882 847 'message' => 'actions' === $table 883 848 ? __( 'Populating actions…', 'ws-action-scheduler-cleaner' ) 884 849 : __( 'Populating logs…', 'ws-action-scheduler-cleaner' ), 885 850 'error' => '', 886 'started_at' => time(),887 'last_activity' => time(),851 'started_at' => $now, 852 'last_activity' => $now, 888 853 ); 889 854 890 $job['include_pending_pct'] = 0; 855 if ( 'rows' === $job['target_mode'] ) { 856 $job['rows_to_add'] = max( 0, (int) $options['target_rows'] - $baseline ); 857 } 858 859 wsacsc_populate_maybe_finish_job( $job ); 860 891 861 if ( 'actions' === $table ) { 892 $job['include_pending_pct'] = isset( $options['include_pending_pct'] ) 893 ? wsacsc_populate_sanitize_pending_pct( $options['include_pending_pct'] ) 894 : 0; 895 wsacsc_populate_ensure_test_groups(); 896 } 897 898 if ( 'size' === $target_mode ) { 899 $job['target_mb'] = (int) $options['target_mb']; 900 $job['target_bytes'] = (int) $options['target_mb'] * 1024 * 1024; 901 } else { 902 $job['target_rows'] = (int) $options['target_rows']; 903 $job['rows_to_add'] = max( 0, (int) $options['target_rows'] - $baseline_rows ); 904 if ( 0 === $job['rows_to_add'] ) { 905 $job['status'] = 'complete'; 906 $job['message'] = __( 'Population complete.', 'ws-action-scheduler-cleaner' ); 907 } 908 } 909 910 set_transient( wsacsc_populate_transient_key( $populate_id ), $job, wsacsc_populate_transient_ttl() ); 862 wsacsc_populate_group_ids(); 863 } 864 865 set_transient( wsacsc_populate_transient_key( $job['populate_id'] ), $job, wsacsc_populate_transient_ttl() ); 911 866 912 867 return $job; … … 926 881 927 882 $job = get_transient( wsacsc_populate_transient_key( $populate_id ) ); 928 return is_array( $job) ? $job : false;883 return ( is_array( $job ) && isset( $job['timeline_start_ts'] ) ) ? $job : false; 929 884 } 930 885 … … 936 891 */ 937 892 function wsacsc_populate_save_job( array $job ) { 938 if ( empty( $job['populate_id'] ) ) {939 return;940 }941 942 893 $job['last_activity'] = time(); 943 894 set_transient( wsacsc_populate_transient_key( $job['populate_id'] ), $job, wsacsc_populate_transient_ttl() ); … … 955 906 956 907 /** 908 * Whether the job has reached its target (size or row count). 909 * 910 * @param array<string, mixed> $job Job. 911 * @return bool 912 */ 913 function wsacsc_populate_job_target_met( array $job ) { 914 if ( 'rows' === $job['target_mode'] ) { 915 return (int) $job['rows_inserted'] >= (int) $job['rows_to_add']; 916 } 917 918 return (int) $job['size_bytes'] >= (int) $job['target_bytes']; 919 } 920 921 /** 922 * Mark job complete when its target is met. 923 * 924 * @param array<string, mixed> $job Job (by reference). 925 * @return void 926 */ 927 function wsacsc_populate_maybe_finish_job( array &$job ) { 928 if ( 'running' === $job['status'] && wsacsc_populate_job_target_met( $job ) ) { 929 $job['status'] = 'complete'; 930 $job['message'] = __( 'Population complete.', 'ws-action-scheduler-cleaner' ); 931 } 932 } 933 934 /** 935 * Mark job as failed. 936 * 937 * @param array<string, mixed> $job Job (by reference). 938 * @param string $message Error message. 939 * @return void 940 */ 941 function wsacsc_populate_fail_job( array &$job, $message ) { 942 $job['status'] = 'error'; 943 $job['error'] = (string) $message; 944 $job['message'] = (string) $message; 945 } 946 947 /** 948 * Update the table size of the job (from information_schema only periodically). 949 * 950 * @param array<string, mixed> $job Job (by reference). 951 * @param bool $force Force a size query. 952 * @return void 953 */ 954 function wsacsc_populate_update_size_estimates( array &$job, $force = false ) { 955 if ( $force || 0 === ( (int) $job['batch_count'] % wsacsc_populate_size_check_interval() ) ) { 956 global $wpdb; 957 958 $table = wsacsc_populate_table_name( $job['table'] ); 959 960 // information_schema sizes lag behind inserts (MySQL 8 caches them for up to 24 hours). 961 // ANALYZE TABLE refreshes them. It samples a few pages and is fast. 962 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Dev utility. 963 $wpdb->query( $wpdb->prepare( 'ANALYZE TABLE %i', $table ) ); 964 965 $job['size_bytes'] = wsacsc_populate_get_table_size_bytes( $table ); 966 967 $growth = (int) $job['size_bytes'] - (int) $job['baseline_size_bytes']; 968 // InnoDB grows in extents, so only recalibrate after real growth. 969 if ( (int) $job['rows_inserted'] > 0 && $growth > 4 * 1024 * 1024 ) { 970 $job['est_row_bytes'] = max( 60, (int) round( $growth / (int) $job['rows_inserted'] ) ); 971 } 972 return; 973 } 974 975 $job['size_bytes'] = (int) $job['baseline_size_bytes'] + ( (int) $job['rows_inserted'] * (int) $job['est_row_bytes'] ); 976 } 977 978 /** 957 979 * Build progress payload for JSON responses. 958 980 * … … 961 983 */ 962 984 function wsacsc_populate_job_progress( array $job ) { 963 wsacsc_populate_normalize_job( $job );964 965 $percent = 0;966 985 if ( 'complete' === $job['status'] ) { 967 986 $percent = 100; 968 987 } elseif ( 'rows' === $job['target_mode'] ) { 969 $rows_to_add = (int) $job['rows_to_add']; 970 $percent = $rows_to_add > 0 971 ? min( 100, (int) round( ( (int) $job['rows_inserted'] / $rows_to_add ) * 100 ) ) 972 : 100; 988 $percent = (int) $job['rows_to_add'] > 0 ? min( 100, (int) round( (int) $job['rows_inserted'] / (int) $job['rows_to_add'] * 100 ) ) : 100; 973 989 } else { 974 $target_bytes = (int) $job['target_bytes']; 975 $percent = $target_bytes > 0 976 ? min( 100, (int) round( ( (int) $job['size_bytes'] / $target_bytes ) * 100 ) ) 977 : 0; 990 $percent = (int) $job['target_bytes'] > 0 ? min( 100, (int) round( (int) $job['size_bytes'] / (int) $job['target_bytes'] * 100 ) ) : 0; 978 991 } 979 992 … … 986 999 'target_rows' => (int) $job['target_rows'], 987 1000 'rows_inserted' => (int) $job['rows_inserted'], 1001 'logs_inserted' => (int) $job['logs_inserted'], 988 1002 'rows_to_add' => (int) $job['rows_to_add'], 989 1003 'baseline_rows' => (int) $job['baseline_rows'], … … 998 1012 } 999 1013 1000 /** 1001 * Cached context for fast row generation within a request. 1002 * 1003 * @return array<string, mixed> 1004 */ 1005 function wsacsc_populate_get_generation_context() { 1006 static $ctx = null; 1007 1008 if ( null !== $ctx ) { 1009 return $ctx; 1010 } 1011 1012 $schema = wsacsc_populate_get_actions_schema(); 1013 1014 $ctx = array( 1015 'hooks' => wsacsc_populate_realistic_hooks(), 1016 'statuses' => wsacsc_populate_statuses(), 1017 'group_map' => wsacsc_populate_ensure_test_groups(), 1018 'has_completed_date' => $schema['has_completed_date'], 1019 'has_priority' => $schema['has_priority'], 1020 'has_extended_args' => $schema['has_extended_args'], 1021 'as_classes' => wsacsc_populate_can_use_as_classes(), 1022 'now_gmt' => current_time( 'mysql', true ), 1023 'now_local' => current_time( 'mysql', false ), 1024 'now_gmt_ts' => strtotime( current_time( 'mysql', true ) ), 1025 'now_local_ts' => strtotime( current_time( 'mysql', false ) ), 1026 ); 1027 1028 return $ctx; 1029 } 1030 1031 /** 1032 * Column list for bulk action inserts (stable order). 1033 * 1034 * @return string[] 1035 */ 1036 function wsacsc_populate_get_action_insert_columns() { 1037 static $columns = null; 1038 1039 if ( null !== $columns ) { 1040 return $columns; 1041 } 1042 1043 $columns = array( 1044 'hook', 1045 'status', 1046 'scheduled_date_gmt', 1047 'scheduled_date_local', 1048 'args', 1049 'schedule', 1050 'group_id', 1051 'attempts', 1052 'last_attempt_gmt', 1053 'last_attempt_local', 1054 'claim_id', 1055 ); 1056 1057 $schema = wsacsc_populate_get_actions_schema(); 1058 if ( $schema['has_extended_args'] ) { 1059 $args_index = array_search( 'args', $columns, true ); 1060 if ( false !== $args_index ) { 1061 array_splice( $columns, $args_index + 1, 0, array( 'extended_args' ) ); 1062 } 1063 } 1064 if ( $schema['has_completed_date'] ) { 1065 $columns[] = 'completed_date_gmt'; 1066 $columns[] = 'completed_date_local'; 1067 } 1068 if ( $schema['has_priority'] ) { 1069 $columns[] = 'priority'; 1070 } 1071 1072 return $columns; 1073 } 1074 1075 /** 1076 * Integer columns in bulk action inserts. 1077 * 1078 * @return string[] 1079 */ 1080 function wsacsc_populate_get_action_int_columns() { 1081 $ints = array( 'group_id', 'attempts', 'claim_id' ); 1082 if ( wsacsc_populate_get_actions_schema()['has_priority'] ) { 1083 $ints[] = 'priority'; 1084 } 1085 return $ints; 1086 } 1087 1088 /** 1089 * Build multiple action rows using shared context. 1090 * 1014 /* 1015 * ------------------------------------------------------------------------- 1016 * Row generation 1017 * ------------------------------------------------------------------------- 1018 */ 1019 1020 /** 1021 * Timestamp on the job timeline for the n-th row of the job. 1022 * 1023 * Rows are spread evenly over the history span in insert order, with a small jitter, 1024 * so that action IDs and dates grow together as on a real site. 1025 * 1026 * @param array<string, mixed> $job Job. 1027 * @param int $n Zero-based row number within the job. 1028 * @param int $planned Planned total rows of the job. 1029 * @return int 1030 */ 1031 function wsacsc_populate_timeline_ts( array $job, $n, $planned ) { 1032 $start = (int) $job['timeline_start_ts']; 1033 $span = max( 1, (int) $job['timeline_end_ts'] - $start ); 1034 $step = $span / max( 1, $planned ); 1035 $base = $start + (int) ( min( 1, ( $n + 0.5 ) / max( 1, $planned ) ) * $span ); 1036 $half = (int) max( 0, $step / 2 ); 1037 1038 return min( (int) $job['timeline_end_ts'], max( $start, $base + wp_rand( -$half, $half ) ) ); 1039 } 1040 1041 /** 1042 * Build action rows for one batch. 1043 * 1044 * @param array<string, mixed> $job Job. 1091 1045 * @param int $count Row count. 1092 * @param array<string, mixed> $job Populate job (for pending %).1093 1046 * @return array<int, array<string, mixed>> 1094 1047 */ 1095 function wsacsc_populate_build_action_rows( $count, array $job = array() ) { 1096 $ctx = wsacsc_populate_get_generation_context(); 1097 $hooks = $ctx['hooks']; 1098 $statuses = $ctx['statuses']; 1099 $pending_pct = isset( $job['include_pending_pct'] ) ? (int) $job['include_pending_pct'] : 0; 1100 $rows = array(); 1048 function wsacsc_populate_build_action_rows( array $job, $count ) { 1049 $schema = wsacsc_populate_get_actions_schema(); 1050 $profiles = wsacsc_populate_hook_profiles(); 1051 $weights = wp_list_pluck( $profiles, 'weight' ); 1052 $statuses = wsacsc_populate_status_weights(); 1053 $groups = wsacsc_populate_group_ids(); 1054 $planned = wsacsc_populate_planned_rows( $job ); 1055 $pending = (int) $job['pending_pct']; 1056 $empty = '0000-00-00 00:00:00'; 1057 $now = time(); 1058 $rows = array(); 1101 1059 1102 1060 for ( $i = 0; $i < $count; $i++ ) { 1103 $hook = $hooks[ wp_rand( 0, count( $hooks ) - 1 ) ]; 1104 $is_pending = $pending_pct > 0 && wp_rand( 1, 100 ) <= $pending_pct; 1105 $status = $is_pending ? 'pending' : $statuses[ wp_rand( 0, count( $statuses ) - 1 ) ]; 1106 $dates = wsacsc_populate_build_action_dates( $ctx, $status, $is_pending ); 1107 $args_fields = wsacsc_populate_build_action_args( $hook, wp_rand( 1, 100 ) <= 5 ); 1061 $n = (int) $job['rows_inserted'] + $i; 1062 $hook = wsacsc_populate_pick_weighted( $weights ); 1063 $profile = $profiles[ $hook ]; 1064 $created = wsacsc_populate_timeline_ts( $job, $n, $planned ); 1065 1066 // Pending actions are the newest rows, as on a real site with a backlog. 1067 $is_pending = $pending > 0 && ( $n + 0.5 ) / $planned >= 1 - ( $pending / 100 ); 1068 $status = $is_pending ? 'pending' : wsacsc_populate_pick_weighted( $statuses ); 1108 1069 1109 1070 if ( $is_pending ) { 1110 $attempts = 0; 1111 } elseif ( 'failed' === $status ) { 1112 $attempts = wp_rand( 1, 5 ); 1113 } elseif ( 'canceled' === $status ) { 1114 $attempts = 0; 1071 $scheduled_ts = $now + wp_rand( MINUTE_IN_SECONDS, 14 * DAY_IN_SECONDS ); 1072 } elseif ( $profile['async'] ) { 1073 $scheduled_ts = $created; 1115 1074 } else { 1075 $scheduled_ts = $created + wp_rand( 0, $profile['recurring'] > 0 ? (int) $profile['recurring'] : HOUR_IN_SECONDS ); 1076 } 1077 1078 $scheduled = wsacsc_populate_mysql_dates( $scheduled_ts ); 1079 $attempt = array( 1080 'gmt' => $empty, 1081 'local' => $empty, 1082 ); 1083 $attempts = 0; 1084 1085 // Canceled and pending actions never ran, so Action Scheduler keeps the default last attempt date. 1086 if ( in_array( $status, array( 'complete', 'failed' ), true ) ) { 1087 $lag = $profile['async'] ? wp_rand( 1, 30 ) : wp_rand( 5, 300 ); 1088 $attempt = wsacsc_populate_mysql_dates( min( $now, $scheduled_ts + $lag ) ); 1116 1089 $attempts = 1; 1117 1090 } 1091 1092 $args = wsacsc_populate_build_action_args( $profile['args'], $schema['has_extended_args'] ); 1118 1093 1119 1094 $row = array( 1120 1095 'hook' => $hook, 1121 1096 'status' => $status, 1122 'scheduled_date_gmt' => $ dates['scheduled_date_gmt'],1123 'scheduled_date_local' => $ dates['scheduled_date_local'],1124 'args' => $args _fields['args'],1125 'schedule' => wsacsc_populate_build_action_schedule( $status, $ dates['scheduled_date_gmt'] ),1126 'group_id' => wsacsc_populate_pick_group_id( $ctx['group_map'] ),1097 'scheduled_date_gmt' => $scheduled['gmt'], 1098 'scheduled_date_local' => $scheduled['local'], 1099 'args' => $args['args'], 1100 'schedule' => wsacsc_populate_build_action_schedule( $status, $scheduled_ts, (int) $profile['recurring'] ), 1101 'group_id' => ( '' !== $profile['group'] && isset( $groups[ $profile['group'] ] ) ) ? $groups[ $profile['group'] ] : 0, 1127 1102 'attempts' => $attempts, 1128 'last_attempt_gmt' => $ dates['last_attempt_gmt'],1129 'last_attempt_local' => $ dates['last_attempt_local'],1103 'last_attempt_gmt' => $attempt['gmt'], 1104 'last_attempt_local' => $attempt['local'], 1130 1105 'claim_id' => 0, 1131 '_populate_meta' => array(1132 'status' => $status,1133 'last_attempt_gmt' => $dates['last_attempt_gmt'],1134 'scheduled_date_gmt' => $dates['scheduled_date_gmt'],1135 ),1136 1106 ); 1137 1107 1138 if ( $ctx['has_extended_args'] ) { 1139 $row['extended_args'] = isset( $args_fields['extended_args'] ) ? $args_fields['extended_args'] : null; 1140 } 1141 1142 if ( $ctx['has_completed_date'] && ! empty( $dates['completed_date_gmt'] ) ) { 1143 $row['completed_date_gmt'] = $dates['completed_date_gmt']; 1144 $row['completed_date_local'] = $dates['completed_date_local']; 1145 } 1146 if ( $ctx['has_priority'] ) { 1147 $row['priority'] = wsacsc_populate_pick_priority(); 1108 if ( $schema['has_extended_args'] ) { 1109 $row['extended_args'] = $args['extended_args']; 1110 } 1111 if ( $schema['has_priority'] ) { 1112 $row['priority'] = 10; 1148 1113 } 1149 1114 … … 1155 1120 1156 1121 /** 1157 * Build log entry rows for one action (AS-style message sequence). 1158 * 1159 * @param int $action_id Action ID. 1160 * @param array<string, mixed> $meta status, last_attempt_gmt, scheduled_date_gmt. 1122 * Log rows that Action Scheduler writes for one action. 1123 * 1124 * The created time comes from the stored schedule, with a short lead time. 1125 * 1126 * @param array<string, string> $action Action row with action_id, hook, status, scheduled_date_gmt, last_attempt_gmt. 1161 1127 * @return array<int, array<string, mixed>> 1162 1128 */ 1163 function wsacsc_populate_build_log_rows_for_action( $action_id, array $meta ) { 1164 $status = isset( $meta['status'] ) ? (string) $meta['status'] : 'complete'; 1165 $last_attempt_gmt = isset( $meta['last_attempt_gmt'] ) ? (string) $meta['last_attempt_gmt'] : ''; 1166 $scheduled_gmt = isset( $meta['scheduled_date_gmt'] ) ? (string) $meta['scheduled_date_gmt'] : $last_attempt_gmt; 1167 1168 $last_ts = strtotime( $last_attempt_gmt . ' UTC' ); 1169 if ( false === $last_ts || '0000-00-00 00:00:00' === $last_attempt_gmt ) { 1170 $last_ts = strtotime( $scheduled_gmt . ' UTC' ); 1171 } 1172 if ( false === $last_ts ) { 1173 $last_ts = time(); 1174 } 1175 1176 $started_ts = max( strtotime( $scheduled_gmt . ' UTC' ) ?: $last_ts, $last_ts - wp_rand( 120, 900 ) ); 1177 1178 $entries = array(); 1129 function wsacsc_populate_build_log_rows_for_action( array $action ) { 1130 $profiles = wsacsc_populate_hook_profiles(); 1131 $hook = (string) $action['hook']; 1132 $async = isset( $profiles[ $hook ] ) ? (bool) $profiles[ $hook ]['async'] : false; 1133 $context = $async ? 'Async Request' : 'WP Cron'; 1134 $status = (string) $action['status']; 1135 $scheduled = strtotime( $action['scheduled_date_gmt'] . ' UTC' ); 1136 $attempt = '0000-00-00 00:00:00' === $action['last_attempt_gmt'] ? false : strtotime( $action['last_attempt_gmt'] . ' UTC' ); 1137 $now = time(); 1138 1139 if ( false === $scheduled ) { 1140 $scheduled = $now; 1141 } 1142 1143 // Pending actions were created recently. Other actions were created shortly before their schedule. 1144 $created = 'pending' === $status ? $now - wp_rand( 60, DAY_IN_SECONDS ) : $scheduled - ( $async ? 0 : wp_rand( 0, HOUR_IN_SECONDS ) ); 1145 $messages = array( array( $created, 'action created' ) ); 1179 1146 1180 1147 if ( 'canceled' === $status ) { 1181 $entries[] = array( 1182 'ts' => $last_ts, 1183 'message' => 'action canceled', 1148 $messages[] = array( min( $now, $scheduled + wp_rand( -HOUR_IN_SECONDS, 0 ) ), 'action canceled' ); 1149 } elseif ( false !== $attempt && in_array( $status, array( 'complete', 'failed' ), true ) ) { 1150 $messages[] = array( $attempt, 'action started via ' . $context ); 1151 if ( 'complete' === $status ) { 1152 $messages[] = array( $attempt + wp_rand( 0, 20 ), 'action complete via ' . $context ); 1153 } else { 1154 $messages[] = array( 1155 $attempt + wp_rand( 0, 60 ), 1156 sprintf( 'action failed via %s: Scheduled action for %s will not be executed as no callbacks are registered.', $context, $hook ), 1157 ); 1158 } 1159 } 1160 1161 $rows = array(); 1162 foreach ( $messages as $message ) { 1163 $dates = wsacsc_populate_mysql_dates( max( 0, (int) $message[0] ) ); 1164 $rows[] = array( 1165 'action_id' => (int) $action['action_id'], 1166 'message' => $message[1], 1167 'log_date_gmt' => $dates['gmt'], 1168 'log_date_local' => $dates['local'], 1184 1169 ); 1185 } elseif ( 'failed' === $status ) { 1186 $entries[] = array( 1187 'ts' => $started_ts, 1188 'message' => 'action started', 1170 } 1171 1172 return $rows; 1173 } 1174 1175 /** 1176 * Read actions by ID range for log generation. 1177 * 1178 * @param int $after_id Read actions with a higher ID. 1179 * @param int $limit Max actions. 1180 * @return array<int, array<string, string>> 1181 */ 1182 function wsacsc_populate_fetch_actions_after( $after_id, $limit ) { 1183 global $wpdb; 1184 1185 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Dev utility. 1186 $rows = $wpdb->get_results( 1187 $wpdb->prepare( 1188 'SELECT action_id, hook, status, scheduled_date_gmt, last_attempt_gmt FROM %i WHERE action_id > %d ORDER BY action_id LIMIT %d', 1189 wsacsc_populate_table_name( 'actions' ), 1190 (int) $after_id, 1191 (int) $limit 1192 ), 1193 ARRAY_A 1194 ); 1195 1196 return is_array( $rows ) ? $rows : array(); 1197 } 1198 1199 /** 1200 * Bulk INSERT rows in chunks. 1201 * 1202 * @param string $table Full table name. 1203 * @param array<int, array<string, mixed>> $rows Rows keyed by column name. All rows have the same keys. 1204 * @param string[] $int_columns Columns using %d placeholders. 1205 * @return array{inserted: int, first_ids: int[]}|false Rows inserted and the first insert ID of each statement. 1206 */ 1207 function wsacsc_populate_bulk_insert( $table, array $rows, array $int_columns ) { 1208 global $wpdb; 1209 1210 if ( empty( $rows ) ) { 1211 return array( 1212 'inserted' => 0, 1213 'first_ids' => array(), 1189 1214 ); 1190 $entries[] = array( 1191 'ts' => $last_ts, 1192 'message' => 'action failed via WP Cron: Simulated timeout in test data', 1193 ); 1194 } elseif ( 'pending' === $status ) { 1195 return array(); 1196 } else { 1197 $entries[] = array( 1198 'ts' => $started_ts, 1199 'message' => 'action started', 1200 ); 1201 $entries[] = array( 1202 'ts' => $last_ts, 1203 'message' => 'action complete', 1204 ); 1205 } 1206 1207 $rows = array(); 1208 foreach ( $entries as $entry ) { 1209 $log_gmt = gmdate( 'Y-m-d H:i:s', (int) $entry['ts'] ); 1210 $rows[] = array( 1211 'action_id' => (int) $action_id, 1212 'message' => $entry['message'], 1213 'log_date_gmt' => $log_gmt, 1214 'log_date_local' => wsacsc_populate_gmt_to_local_mysql( $log_gmt ), 1215 ); 1216 } 1217 1218 return $rows; 1219 } 1220 1221 /** 1222 * Load action metadata from DB for log population. 1223 * 1224 * @param int[] $action_ids Action IDs. 1225 * @return array<int, array<string, mixed>> 1226 */ 1227 function wsacsc_populate_fetch_action_meta_for_logs( array $action_ids ) { 1228 global $wpdb; 1229 1230 $action_ids = array_values( array_filter( array_map( 'intval', $action_ids ) ) ); 1231 if ( empty( $action_ids ) ) { 1232 return array(); 1233 } 1234 1235 $actions_table = $wpdb->prefix . 'actionscheduler_actions'; 1236 $ids_sql = implode( ',', array_map( 'intval', $action_ids ) ); 1237 $sql = "SELECT action_id, status, last_attempt_gmt, scheduled_date_gmt FROM `{$actions_table}` WHERE action_id IN ({$ids_sql})"; 1238 1239 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared 1240 $results = $wpdb->get_results( $sql, ARRAY_A ); 1241 $map = array(); 1242 1243 if ( is_array( $results ) ) { 1244 foreach ( $results as $row ) { 1245 $map[ (int) $row['action_id'] ] = array( 1246 'status' => (string) $row['status'], 1247 'last_attempt_gmt' => (string) $row['last_attempt_gmt'], 1248 'scheduled_date_gmt' => (string) $row['scheduled_date_gmt'], 1249 ); 1250 } 1251 } 1252 1253 return $map; 1254 } 1255 1256 /** 1257 * Build log rows for a list of action IDs (multiple logs per action when meta known). 1258 * 1259 * @param int[] $action_ids Action IDs. 1260 * @param array<int, array<string,mixed>> $meta_by_id Optional action_id => meta. 1261 * @return array<int, array<string, mixed>> 1262 */ 1263 function wsacsc_populate_build_log_rows_for_actions( array $action_ids, array $meta_by_id = array() ) { 1264 if ( empty( $meta_by_id ) ) { 1265 $meta_by_id = wsacsc_populate_fetch_action_meta_for_logs( $action_ids ); 1266 } 1267 1268 $rows = array(); 1269 foreach ( $action_ids as $action_id ) { 1270 $action_id = (int) $action_id; 1271 $meta = isset( $meta_by_id[ $action_id ] ) 1272 ? $meta_by_id[ $action_id ] 1273 : array( 1274 'status' => 'complete', 1275 'last_attempt_gmt' => gmdate( 'Y-m-d H:i:s' ), 1276 'scheduled_date_gmt' => gmdate( 'Y-m-d H:i:s' ), 1277 ); 1278 $rows = array_merge( $rows, wsacsc_populate_build_log_rows_for_action( $action_id, $meta ) ); 1279 } 1280 1281 return $rows; 1282 } 1283 1284 /** 1285 * Strip internal metadata before inserting actions. 1286 * 1287 * @param array<int, array<string, mixed>> $rows Action rows. 1288 * @return array{rows: array<int, array<string, mixed>>, metas: array<int, array<string, mixed>>} 1289 */ 1290 function wsacsc_populate_prepare_action_rows_for_insert( array $rows ) { 1291 $clean = array(); 1292 $metas = array(); 1293 1294 foreach ( $rows as $row ) { 1295 $meta = isset( $row['_populate_meta'] ) && is_array( $row['_populate_meta'] ) ? $row['_populate_meta'] : array(); 1296 unset( $row['_populate_meta'] ); 1297 $metas[] = $meta; 1298 $clean[] = $row; 1299 } 1300 1301 return array( 1302 'rows' => $clean, 1303 'metas' => $metas, 1304 ); 1305 } 1306 1307 /** 1308 * Bulk INSERT rows in chunks. 1309 * 1310 * @param string $table Table name. 1311 * @param string[] $columns Column names in order. 1312 * @param string[] $int_columns Columns using %d placeholders. 1313 * @param array<int, array<string, mixed>> $rows Rows keyed by column name. 1314 * @return int|false Total rows inserted or false on failure. 1315 */ 1316 function wsacsc_populate_bulk_insert( $table, array $columns, array $int_columns, array $rows ) { 1317 global $wpdb; 1318 1319 if ( empty( $rows ) ) { 1320 return 0; 1321 } 1322 1323 $int_columns = array_flip( $int_columns ); 1324 $inserted = 0; 1325 $cols_sql = '`' . implode( '`,`', $columns ) . '`'; 1215 } 1216 1217 $columns = array_keys( $rows[0] ); 1218 $int_map = array_flip( $int_columns ); 1219 $inserted = 0; 1220 $first_ids = array(); 1221 $cols_sql = '`' . implode( '`,`', $columns ) . '`'; 1326 1222 1327 1223 foreach ( array_chunk( $rows, wsacsc_populate_bulk_chunk_size() ) as $chunk ) { … … 1332 1228 $tuple = array(); 1333 1229 foreach ( $columns as $column ) { 1334 if ( isset( $int_columns[ $column ] ) ) { 1230 if ( null === $row[ $column ] ) { 1231 $tuple[] = 'NULL'; 1232 } elseif ( isset( $int_map[ $column ] ) ) { 1335 1233 $tuple[] = '%d'; 1336 1234 $values[] = (int) $row[ $column ]; 1337 1235 } else { 1338 1236 $tuple[] = '%s'; 1339 $values[] = $row[ $column ];1237 $values[] = (string) $row[ $column ]; 1340 1238 } 1341 1239 } … … 1343 1241 } 1344 1242 1345 $sql = "INSERT INTO `{$table}` ({$cols_sql}) VALUES " . implode( ',', $placeholders ); 1346 // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- dev bulk insert. 1347 $result = $wpdb->query( $wpdb->prepare( $sql, $values ) ); 1243 // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Dev bulk insert. Table and column names come from this file, values are prepared. 1244 $sql = "INSERT INTO `{$table}` ({$cols_sql}) VALUES " . implode( ',', $placeholders ); 1245 $result = $wpdb->query( empty( $values ) ? $sql : $wpdb->prepare( $sql, $values ) ); 1246 // phpcs:enable 1348 1247 1349 1248 if ( false === $result ) { … … 1351 1250 } 1352 1251 1353 $inserted += (int) $result; 1354 } 1355 1356 return $inserted; 1357 } 1358 1359 /** 1360 * Bulk insert actions; returns new action IDs from the last chunk. 1361 * 1362 * @param string $table Actions table. 1363 * @param array<int, array<string, mixed>> $rows Action rows. 1364 * @return array{inserted: int, ids: int[]}|false 1365 */ 1366 function wsacsc_populate_bulk_insert_actions( $table, array $rows ) { 1252 $inserted += (int) $result; 1253 $first_ids[] = (int) $wpdb->insert_id; 1254 } 1255 1256 return array( 1257 'inserted' => $inserted, 1258 'first_ids' => $first_ids, 1259 ); 1260 } 1261 1262 /** 1263 * Insert one batch of actions and, if enabled, their log entries. 1264 * 1265 * The log entries are built from the rows read back from the table, so they always match 1266 * the stored actions, even when another process inserted actions at the same time. 1267 * 1268 * @param array<string, mixed> $job Job (by reference). 1269 * @return bool False on error. 1270 */ 1271 function wsacsc_populate_insert_action_batch( array &$job ) { 1367 1272 global $wpdb; 1368 1273 1369 $columns = wsacsc_populate_get_action_insert_columns(); 1370 $int_columns = wsacsc_populate_get_action_int_columns(); 1371 $cols_sql = '`' . implode( '`,`', $columns ) . '`'; 1372 $int_map = array_flip( $int_columns ); 1373 $inserted = 0; 1374 $ids = array(); 1375 1376 foreach ( array_chunk( $rows, wsacsc_populate_bulk_chunk_size() ) as $chunk ) { 1377 $placeholders = array(); 1378 $values = array(); 1379 1380 foreach ( $chunk as $row ) { 1381 foreach ( $columns as $column ) { 1382 if ( ! array_key_exists( $column, $row ) ) { 1383 $row[ $column ] = null; 1384 } 1385 } 1386 $tuple = array(); 1387 foreach ( $columns as $column ) { 1388 if ( isset( $int_map[ $column ] ) ) { 1389 $tuple[] = '%d'; 1390 $values[] = (int) $row[ $column ]; 1391 } else { 1392 $tuple[] = '%s'; 1393 $values[] = null === $row[ $column ] ? null : (string) $row[ $column ]; 1394 } 1395 } 1396 $placeholders[] = '(' . implode( ',', $tuple ) . ')'; 1397 } 1398 1399 $sql = "INSERT INTO `{$table}` ({$cols_sql}) VALUES " . implode( ',', $placeholders ); 1400 // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- dev bulk insert. 1401 $result = $wpdb->query( $wpdb->prepare( $sql, $values ) ); 1402 1403 if ( false === $result ) { 1274 $count = wsacsc_populate_batch_row_count(); 1275 if ( 'rows' === $job['target_mode'] ) { 1276 $count = min( $count, (int) $job['rows_to_add'] - (int) $job['rows_inserted'] ); 1277 } 1278 1279 $result = wsacsc_populate_bulk_insert( wsacsc_populate_table_name( 'actions' ), wsacsc_populate_build_action_rows( $job, $count ), array( 'group_id', 'attempts', 'claim_id', 'priority' ) ); 1280 if ( false === $result ) { 1281 wsacsc_populate_fail_job( $job, $wpdb->last_error ? $wpdb->last_error : __( 'Failed to insert actions.', 'ws-action-scheduler-cleaner' ) ); 1282 return false; 1283 } 1284 1285 $job['rows_inserted'] = (int) $job['rows_inserted'] + (int) $result['inserted']; 1286 1287 if ( ! $job['with_logs'] || empty( $result['first_ids'] ) ) { 1288 return true; 1289 } 1290 1291 $actions = wsacsc_populate_fetch_actions_after( min( $result['first_ids'] ) - 1, (int) $result['inserted'] ); 1292 $logs = array(); 1293 foreach ( $actions as $action ) { 1294 $logs = array_merge( $logs, wsacsc_populate_build_log_rows_for_action( $action ) ); 1295 } 1296 1297 $log_result = wsacsc_populate_bulk_insert( wsacsc_populate_table_name( 'logs' ), $logs, array( 'action_id' ) ); 1298 if ( false === $log_result ) { 1299 wsacsc_populate_fail_job( $job, $wpdb->last_error ? $wpdb->last_error : __( 'Failed to insert logs.', 'ws-action-scheduler-cleaner' ) ); 1300 return false; 1301 } 1302 1303 $job['logs_inserted'] = (int) $job['logs_inserted'] + (int) $log_result['inserted']; 1304 1305 return true; 1306 } 1307 1308 /** 1309 * Insert one batch of log entries for existing actions, oldest actions first. 1310 * 1311 * When the cursor reaches the newest action, it starts again at the oldest action. 1312 * Further passes add another set of entries per action, as repeated runs of recurring 1313 * actions would. 1314 * 1315 * @param array<string, mixed> $job Job (by reference). 1316 * @return bool False on error. 1317 */ 1318 function wsacsc_populate_insert_log_batch( array &$job ) { 1319 global $wpdb; 1320 1321 $limit = max( 1, (int) ceil( wsacsc_populate_batch_row_count() / 2 ) ); 1322 $actions = wsacsc_populate_fetch_actions_after( (int) $job['log_cursor_id'], $limit ); 1323 1324 if ( empty( $actions ) ) { 1325 if ( 0 === (int) $job['log_cursor_id'] ) { 1326 wsacsc_populate_fail_job( $job, __( 'No actions available to attach logs. Populate actions first.', 'ws-action-scheduler-cleaner' ) ); 1404 1327 return false; 1405 1328 } 1406 1407 $chunk_count = (int) $result; 1408 $inserted += $chunk_count; 1409 $first_id = (int) $wpdb->insert_id; 1410 if ( $first_id > 0 && $chunk_count > 0 ) { 1411 for ( $i = 0; $i < $chunk_count; $i++ ) { 1412 $ids[] = $first_id + $i; 1413 } 1414 } 1415 } 1416 1417 return array( 1418 'inserted' => $inserted, 1419 'ids' => $ids, 1420 ); 1421 } 1422 1423 /** 1424 * Whether the job has reached its target (size or row count). 1425 * 1426 * @param array<string, mixed> $job Job. 1427 * @return bool 1428 */ 1429 function wsacsc_populate_job_target_met( array $job ) { 1329 $job['log_cursor_id'] = 0; 1330 return true; 1331 } 1332 1333 $logs = array(); 1334 foreach ( $actions as $action ) { 1335 $logs = array_merge( $logs, wsacsc_populate_build_log_rows_for_action( $action ) ); 1336 } 1337 1430 1338 if ( 'rows' === $job['target_mode'] ) { 1431 return (int) $job['rows_inserted'] >= (int) $job['rows_to_add']; 1432 } 1433 1434 return (int) $job['size_bytes'] >= (int) $job['target_bytes']; 1435 } 1436 1437 /** 1438 * Update estimated table sizes (information_schema only periodically). 1439 * 1440 * @param array<string, mixed> $job Job (by reference). 1441 * @param bool $force Force schema size query. 1442 * @return void 1443 */ 1444 function wsacsc_populate_update_size_estimates( array &$job, $force = false ) { 1445 global $wpdb; 1446 1447 $db_table = 'actions' === $job['table'] 1448 ? $wpdb->prefix . 'actionscheduler_actions' 1449 : $wpdb->prefix . 'actionscheduler_logs'; 1450 1451 $should_measure = $force || 0 === ( (int) $job['batch_count'] % wsacsc_populate_size_check_interval() ); 1452 1453 if ( $should_measure ) { 1454 $job['size_bytes'] = wsacsc_populate_get_table_size_bytes( $db_table ); 1455 1456 if ( (int) $job['rows_inserted'] > 0 ) { 1457 $growth = max( 0, (int) $job['size_bytes'] - (int) $job['baseline_size_bytes'] ); 1458 $min_bytes = 'actions' === $job['table'] ? 200 : 80; 1459 $job['est_row_bytes'] = max( $min_bytes, (int) round( $growth / (int) $job['rows_inserted'] ) ); 1460 } 1461 return; 1462 } 1463 1464 $job['size_bytes'] = (int) $job['baseline_size_bytes'] + ( (int) $job['rows_inserted'] * (int) $job['est_row_bytes'] ); 1465 } 1466 1467 /** 1468 * Mark job complete when its target is met. 1339 $logs = array_slice( $logs, 0, max( 0, (int) $job['rows_to_add'] - (int) $job['rows_inserted'] ) ); 1340 } 1341 1342 $result = wsacsc_populate_bulk_insert( wsacsc_populate_table_name( 'logs' ), $logs, array( 'action_id' ) ); 1343 if ( false === $result ) { 1344 wsacsc_populate_fail_job( $job, $wpdb->last_error ? $wpdb->last_error : __( 'Failed to insert logs.', 'ws-action-scheduler-cleaner' ) ); 1345 return false; 1346 } 1347 1348 $last = end( $actions ); 1349 $job['log_cursor_id'] = (int) $last['action_id']; 1350 $job['rows_inserted'] = (int) $job['rows_inserted'] + (int) $result['inserted']; 1351 1352 return true; 1353 } 1354 1355 /** 1356 * Run batches until the deadline, the target, or an error. 1469 1357 * 1470 1358 * @param array<string, mixed> $job Job (by reference). 1471 1359 * @return void 1472 1360 */ 1473 function wsacsc_populate_maybe_finish_job( array &$job ) { 1474 if ( wsacsc_populate_job_target_met( $job ) ) { 1475 $job['status'] = 'complete'; 1476 $job['message'] = __( 'Population complete.', 'ws-action-scheduler-cleaner' ); 1477 } 1478 } 1479 1480 /** 1481 * Normalize job fields (legacy combined jobs are not resumed). 1482 * 1483 * @param array<string, mixed> $job Job (by reference). 1484 * @return void 1485 */ 1486 function wsacsc_populate_normalize_job( array &$job ) { 1487 if ( empty( $job['table'] ) && isset( $job['phase'] ) ) { 1488 $job['table'] = in_array( $job['phase'], array( 'actions', 'logs' ), true ) ? (string) $job['phase'] : 'actions'; 1489 } 1490 1491 if ( ! isset( $job['target_mode'] ) ) { 1492 $job['target_mode'] = ! empty( $job['target_rows'] ) ? 'rows' : 'size'; 1493 } 1494 1495 if ( ! isset( $job['rows_inserted'] ) ) { 1496 $job['rows_inserted'] = 0; 1497 if ( 'actions' === $job['table'] && isset( $job['actions_inserted'] ) ) { 1498 $job['rows_inserted'] = (int) $job['actions_inserted']; 1499 } elseif ( 'logs' === $job['table'] && isset( $job['logs_inserted'] ) ) { 1500 $job['rows_inserted'] = (int) $job['logs_inserted']; 1501 } 1502 } 1503 1504 if ( ! isset( $job['size_bytes'] ) ) { 1505 if ( 'actions' === $job['table'] && isset( $job['actions_size_bytes'] ) ) { 1506 $job['size_bytes'] = (int) $job['actions_size_bytes']; 1507 } elseif ( 'logs' === $job['table'] && isset( $job['logs_size_bytes'] ) ) { 1508 $job['size_bytes'] = (int) $job['logs_size_bytes']; 1509 } else { 1510 $job['size_bytes'] = 0; 1511 } 1512 } 1513 1514 if ( ! isset( $job['baseline_size_bytes'] ) ) { 1515 if ( isset( $job['baseline_actions_bytes'] ) && 'actions' === $job['table'] ) { 1516 $job['baseline_size_bytes'] = (int) $job['baseline_actions_bytes']; 1517 } elseif ( isset( $job['baseline_logs_bytes'] ) && 'logs' === $job['table'] ) { 1518 $job['baseline_size_bytes'] = (int) $job['baseline_logs_bytes']; 1519 } else { 1520 $job['baseline_size_bytes'] = (int) $job['size_bytes']; 1521 } 1522 } 1523 1524 if ( ! isset( $job['est_row_bytes'] ) ) { 1525 if ( isset( $job['est_action_bytes'] ) && 'actions' === $job['table'] ) { 1526 $job['est_row_bytes'] = (int) $job['est_action_bytes']; 1527 } elseif ( isset( $job['est_log_bytes'] ) && 'logs' === $job['table'] ) { 1528 $job['est_row_bytes'] = (int) $job['est_log_bytes']; 1529 } else { 1530 $job['est_row_bytes'] = 'actions' === $job['table'] 1531 ? wsacsc_populate_default_estimated_action_bytes() 1532 : wsacsc_populate_default_estimated_log_bytes(); 1533 } 1534 } 1535 1536 if ( ! isset( $job['baseline_rows'] ) ) { 1537 $job['baseline_rows'] = 0; 1538 } 1539 1540 if ( ! isset( $job['rows_to_add'] ) ) { 1541 $job['rows_to_add'] = 'rows' === $job['target_mode'] 1542 ? max( 0, (int) $job['target_rows'] - (int) $job['baseline_rows'] ) 1543 : 0; 1544 } 1545 1546 if ( ! isset( $job['include_pending_pct'] ) ) { 1547 $job['include_pending_pct'] = 0; 1548 } 1549 } 1550 1551 /** 1552 * Merge new action IDs into the job pool (capped). 1553 * 1554 * @param array<string, mixed> $job Job (by reference). 1555 * @param int[] $ids New action IDs. 1556 * @return void 1557 */ 1558 function wsacsc_populate_merge_action_ids( array &$job, array $ids ) { 1559 if ( empty( $ids ) ) { 1560 return; 1561 } 1562 1563 $job['last_action_id'] = max( $ids ); 1564 $pool = isset( $job['action_id_pool'] ) && is_array( $job['action_id_pool'] ) ? $job['action_id_pool'] : array(); 1565 $pool = array_merge( $pool, $ids ); 1566 if ( count( $pool ) > 10000 ) { 1567 $pool = array_slice( $pool, -10000 ); 1568 } 1569 $job['action_id_pool'] = $pool; 1570 } 1571 1572 /** 1573 * Pick action IDs for log rows when not inserting actions this cycle. 1574 * 1575 * @param array<string, mixed> $job Job. 1576 * @param int $count How many IDs needed. 1577 * @return int[] 1578 */ 1579 function wsacsc_populate_pick_action_ids_for_logs( array $job, $count ) { 1580 $pool = isset( $job['action_id_pool'] ) && is_array( $job['action_id_pool'] ) ? $job['action_id_pool'] : array(); 1581 if ( empty( $pool ) ) { 1582 wsacsc_populate_refresh_action_id_pool( $job ); 1583 $pool = $job['action_id_pool']; 1584 } 1585 if ( empty( $pool ) ) { 1586 return array(); 1587 } 1588 1589 $ids = array(); 1590 wsacsc_populate_normalize_job( $job ); 1591 $offset = (int) $job['rows_inserted'] % count( $pool ); 1592 for ( $i = 0; $i < $count; $i++ ) { 1593 $ids[] = (int) $pool[ ( $offset + $i ) % count( $pool ) ]; 1594 } 1595 return $ids; 1596 } 1597 1598 /** 1599 * Refresh cached action IDs for log linking. 1600 * 1601 * @param array<string, mixed> $job Job (by reference). 1602 * @return void 1603 */ 1604 function wsacsc_populate_refresh_action_id_pool( array &$job ) { 1605 global $wpdb; 1606 1607 $actions_table = $wpdb->prefix . 'actionscheduler_actions'; 1608 $pool_query = $wpdb->prepare( 1609 'SELECT action_id FROM %i ORDER BY action_id DESC LIMIT 10000', 1610 $actions_table 1611 ); 1612 $ids = $wpdb->get_col( $pool_query ); 1613 $job['action_id_pool'] = is_array( $ids ) ? array_map( 'intval', $ids ) : array(); 1614 } 1615 1616 /** 1617 * Insert rows for one table within a time slice (bulk SQL). 1618 * 1619 * @param array<string, mixed> $job Job (by reference). 1620 * @param int $deadline Unix timestamp deadline. 1621 * @return bool False on error. 1622 */ 1623 function wsacsc_populate_insert_batch( array &$job, $deadline ) { 1624 global $wpdb; 1625 1626 wsacsc_populate_normalize_job( $job ); 1627 1628 $batch_size = wsacsc_populate_batch_row_count(); 1629 $log_columns = array( 'action_id', 'message', 'log_date_gmt', 'log_date_local' ); 1630 1631 if ( function_exists( 'wp_suspend_cache_addition' ) ) { 1632 wp_suspend_cache_addition( true ); 1633 } 1634 1635 while ( time() < $deadline ) { 1636 wsacsc_populate_maybe_finish_job( $job ); 1637 if ( 'complete' === $job['status'] || wsacsc_populate_job_target_met( $job ) ) { 1638 wsacsc_populate_maybe_finish_job( $job ); 1361 function wsacsc_populate_process_batch( array &$job ) { 1362 $deadline = time() + wsacsc_populate_max_seconds_per_batch(); 1363 1364 wp_suspend_cache_addition( true ); 1365 1366 while ( 'running' === $job['status'] && time() < $deadline ) { 1367 if ( (int) $job['rows_inserted'] >= wsacsc_populate_max_rows_per_table() ) { 1368 wsacsc_populate_fail_job( $job, __( 'Row safety limit reached.', 'ws-action-scheduler-cleaner' ) ); 1639 1369 break; 1640 1370 } 1641 1371 1642 if ( (int) $job['rows_inserted'] >= wsacsc_populate_max_rows_per_table() ) { 1643 $job['status'] = 'error'; 1644 $job['error'] = 'actions' === $job['table'] 1645 ? __( 'Actions row safety limit reached.', 'ws-action-scheduler-cleaner' ) 1646 : __( 'Logs row safety limit reached.', 'ws-action-scheduler-cleaner' ); 1647 $job['message'] = $job['error']; 1648 if ( function_exists( 'wp_suspend_cache_addition' ) ) { 1649 wp_suspend_cache_addition( false ); 1650 } 1651 return false; 1652 } 1653 1654 if ( 'actions' === $job['table'] ) { 1655 $actions_table = $wpdb->prefix . 'actionscheduler_actions'; 1656 $action_rows = wsacsc_populate_build_action_rows( $batch_size, $job ); 1657 $prepared = wsacsc_populate_prepare_action_rows_for_insert( $action_rows ); 1658 $result = wsacsc_populate_bulk_insert_actions( $actions_table, $prepared['rows'] ); 1659 1660 if ( false === $result ) { 1661 $job['status'] = 'error'; 1662 $job['error'] = $wpdb->last_error ? $wpdb->last_error : __( 'Failed to insert actions.', 'ws-action-scheduler-cleaner' ); 1663 $job['message'] = $job['error']; 1664 if ( function_exists( 'wp_suspend_cache_addition' ) ) { 1665 wp_suspend_cache_addition( false ); 1666 } 1667 return false; 1668 } 1669 1670 $job['rows_inserted'] = (int) $job['rows_inserted'] + (int) $result['inserted']; 1671 wsacsc_populate_merge_action_ids( $job, $result['ids'] ); 1672 } else { 1673 $logs_table = $wpdb->prefix . 'actionscheduler_logs'; 1674 $log_action_ids = wsacsc_populate_pick_action_ids_for_logs( $job, $batch_size ); 1675 1676 if ( empty( $log_action_ids ) ) { 1677 $job['status'] = 'error'; 1678 $job['error'] = __( 'No actions available to attach logs.', 'ws-action-scheduler-cleaner' ); 1679 $job['message'] = $job['error']; 1680 if ( function_exists( 'wp_suspend_cache_addition' ) ) { 1681 wp_suspend_cache_addition( false ); 1682 } 1683 return false; 1684 } 1685 1686 $log_rows = wsacsc_populate_build_log_rows_for_actions( $log_action_ids ); 1687 $log_count = wsacsc_populate_bulk_insert( $logs_table, $log_columns, array( 'action_id' ), $log_rows ); 1688 1689 if ( false === $log_count ) { 1690 $job['status'] = 'error'; 1691 $job['error'] = $wpdb->last_error ? $wpdb->last_error : __( 'Failed to insert logs.', 'ws-action-scheduler-cleaner' ); 1692 $job['message'] = $job['error']; 1693 if ( function_exists( 'wp_suspend_cache_addition' ) ) { 1694 wp_suspend_cache_addition( false ); 1695 } 1696 return false; 1697 } 1698 1699 $job['rows_inserted'] = (int) $job['rows_inserted'] + (int) $log_count; 1372 $ok = 'actions' === $job['table'] ? wsacsc_populate_insert_action_batch( $job ) : wsacsc_populate_insert_log_batch( $job ); 1373 if ( ! $ok ) { 1374 break; 1700 1375 } 1701 1376 … … 1703 1378 wsacsc_populate_update_size_estimates( $job ); 1704 1379 wsacsc_populate_maybe_finish_job( $job ); 1705 1706 if ( 'complete' === $job['status'] ) { 1707 break; 1708 } 1709 } 1710 1711 if ( function_exists( 'wp_suspend_cache_addition' ) ) { 1712 wp_suspend_cache_addition( false ); 1713 } 1714 1715 wsacsc_populate_update_size_estimates( $job, true ); 1716 wsacsc_populate_maybe_finish_job( $job ); 1717 1718 return true; 1719 } 1720 1721 /** 1722 * Run one batch for the current job phase. 1723 * 1724 * @param array<string, mixed> $job Job (by reference). 1380 } 1381 1382 wp_suspend_cache_addition( false ); 1383 1384 if ( 'error' !== $job['status'] ) { 1385 wsacsc_populate_update_size_estimates( $job, true ); 1386 wsacsc_populate_maybe_finish_job( $job ); 1387 } 1388 1389 if ( 'running' === $job['status'] && $job['with_logs'] && 'actions' === $job['table'] ) { 1390 $job['message'] = sprintf( 1391 /* translators: 1: actions inserted, 2: log entries inserted. */ 1392 __( 'Populating actions… %1$s actions and %2$s log entries added.', 'ws-action-scheduler-cleaner' ), 1393 number_format_i18n( (int) $job['rows_inserted'] ), 1394 number_format_i18n( (int) $job['logs_inserted'] ) 1395 ); 1396 } 1397 1398 wsacsc_populate_save_job( $job ); 1399 } 1400 1401 /* 1402 * ------------------------------------------------------------------------- 1403 * AJAX and CLI entry points 1404 * ------------------------------------------------------------------------- 1405 */ 1406 1407 /** 1408 * Send the job state as JSON. 1409 * 1410 * @param array<string, mixed> $job Job. 1725 1411 * @return void 1726 1412 */ 1727 function wsacsc_populate_process_batch( array &$job ) { 1728 wsacsc_populate_normalize_job( $job ); 1729 1730 $deadline = time() + wsacsc_populate_max_seconds_per_batch(); 1731 1732 if ( 'complete' !== $job['status'] ) { 1733 $ok = wsacsc_populate_insert_batch( $job, $deadline ); 1734 if ( false === $ok && 'running' === $job['status'] ) { 1735 // Error already set on $job. 1736 } 1737 } 1738 1739 if ( wsacsc_populate_job_target_met( $job ) && 'running' === $job['status'] ) { 1740 $job['status'] = 'complete'; 1741 $job['message'] = __( 'Population complete.', 'ws-action-scheduler-cleaner' ); 1742 } 1743 1744 if ( 'complete' === $job['status'] ) { 1745 wp_cache_flush(); 1746 } 1747 1748 wsacsc_populate_save_job( $job ); 1749 } 1750 1751 /** 1752 * AJAX: start population. 1753 * 1754 * @param array<string, mixed> $payload Request payload. 1755 * @return void 1756 */ 1757 function wsacsc_populate_ajax_start( array $payload ) { 1758 if ( ! wsacsc_populate_tables_exist() ) { 1759 wsacsc_populate_json_response( false, array( 'message' => __( 'Action Scheduler tables do not exist.', 'ws-action-scheduler-cleaner' ) ) ); 1760 } 1761 1762 $options = wsacsc_populate_parse_start_options( $payload ); 1763 if ( is_wp_error( $options ) ) { 1764 wsacsc_populate_json_response( false, array( 'message' => $options->get_error_message() ) ); 1765 } 1766 1767 $job = wsacsc_populate_create_job( $options ); 1768 if ( 'running' === $job['status'] ) { 1769 wsacsc_populate_process_batch( $job ); 1770 } 1771 1413 function wsacsc_populate_send_job( array $job ) { 1772 1414 wsacsc_populate_json_response( 1773 1415 true, … … 1780 1422 1781 1423 /** 1782 * AJAX: run batch.1424 * AJAX: start population. 1783 1425 * 1784 1426 * @param array<string, mixed> $payload Request payload. 1785 1427 * @return void 1786 1428 */ 1429 function wsacsc_populate_ajax_start( array $payload ) { 1430 if ( ! wsacsc_populate_tables_exist() ) { 1431 wsacsc_populate_json_response( false, array( 'message' => __( 'Action Scheduler tables do not exist.', 'ws-action-scheduler-cleaner' ) ) ); 1432 } 1433 1434 $options = wsacsc_populate_parse_start_options( $payload ); 1435 if ( is_wp_error( $options ) ) { 1436 wsacsc_populate_json_response( false, array( 'message' => $options->get_error_message() ) ); 1437 } 1438 1439 $job = wsacsc_populate_create_job( $options ); 1440 if ( 'running' === $job['status'] ) { 1441 wsacsc_populate_process_batch( $job ); 1442 } 1443 1444 wsacsc_populate_send_job( $job ); 1445 } 1446 1447 /** 1448 * AJAX: run batch. 1449 * 1450 * @param array<string, mixed> $payload Request payload. 1451 * @return void 1452 */ 1787 1453 function wsacsc_populate_ajax_batch( array $payload ) { 1788 $populate_id = isset( $payload['populate_id'] ) ? sanitize_key( (string) $payload['populate_id'] ) : ''; 1789 $job = wsacsc_populate_get_job( $populate_id ); 1790 1454 $job = wsacsc_populate_get_job( isset( $payload['populate_id'] ) ? (string) $payload['populate_id'] : '' ); 1791 1455 if ( false === $job ) { 1792 1456 wsacsc_populate_json_response( false, array( 'message' => __( 'Population job not found or expired.', 'ws-action-scheduler-cleaner' ) ) ); 1793 1457 } 1794 1458 1795 if ( 'running' !== $job['status'] ) { 1796 wsacsc_populate_json_response( 1797 true, 1798 array( 1799 'message' => $job['message'], 1800 'progress' => wsacsc_populate_job_progress( $job ), 1801 ) 1802 ); 1803 } 1804 1805 wsacsc_populate_process_batch( $job ); 1806 1807 wsacsc_populate_json_response( 1808 true, 1809 array( 1810 'message' => $job['message'], 1811 'progress' => wsacsc_populate_job_progress( $job ), 1812 ) 1813 ); 1459 if ( 'running' === $job['status'] ) { 1460 wsacsc_populate_process_batch( $job ); 1461 } 1462 1463 wsacsc_populate_send_job( $job ); 1814 1464 } 1815 1465 … … 1821 1471 */ 1822 1472 function wsacsc_populate_ajax_status( array $payload ) { 1823 $populate_id = isset( $payload['populate_id'] ) ? sanitize_key( (string) $payload['populate_id'] ) : ''; 1824 $job = wsacsc_populate_get_job( $populate_id ); 1825 1473 $job = wsacsc_populate_get_job( isset( $payload['populate_id'] ) ? (string) $payload['populate_id'] : '' ); 1826 1474 if ( false === $job ) { 1827 1475 wsacsc_populate_json_response( false, array( 'message' => __( 'Population job not found or expired.', 'ws-action-scheduler-cleaner' ) ) ); 1828 1476 } 1829 1477 1830 wsacsc_populate_normalize_job( $job ); 1831 $light = ! empty( $payload['light'] ); 1832 wsacsc_populate_update_size_estimates( $job, ! $light ); 1833 wsacsc_populate_save_job( $job ); 1834 1835 wsacsc_populate_json_response( 1836 true, 1837 array( 1838 'message' => $job['message'], 1839 'progress' => wsacsc_populate_job_progress( $job ), 1840 ) 1841 ); 1478 // Read-only: the batch request owns the job state, so a status poll must not save it. 1479 wsacsc_populate_send_job( $job ); 1842 1480 } 1843 1481 … … 1858 1496 1859 1497 /** 1860 * Run population from CLI (wp eval-file … -- --target-mb=100). 1861 * 1498 * Run population from WP-CLI. 1499 * 1500 * Accepts key=value arguments (for example table=actions target-mb=500) and, for 1501 * compatibility, --key=value entries in the process arguments. 1502 * 1503 * @param string[] $cli_args Positional arguments from wp eval-file. 1862 1504 * @return void 1863 1505 */ 1864 function wsacsc_populate_run_cli( ) {1506 function wsacsc_populate_run_cli( array $cli_args ) { 1865 1507 global $argv; 1866 1508 1867 $cli_args = array( 1868 'table' => 'actions', 1869 'target_mode' => 'size', 1870 'target_mb' => 100, 1509 $raw = array(); 1510 foreach ( array_merge( (array) $argv, $cli_args ) as $arg ) { 1511 if ( is_string( $arg ) && preg_match( '/^(?:--)?([a-z-]+)=(.*)$/', $arg, $matches ) ) { 1512 $raw[ $matches[1] ] = $matches[2]; 1513 } 1514 } 1515 1516 $payload = array( 1517 'table' => $raw['table'] ?? 'actions', 1518 'target_mode' => isset( $raw['target-rows'] ) ? 'rows' : 'size', 1519 'target_mb' => $raw['target-mb'] ?? 100, 1520 'target_rows' => $raw['target-rows'] ?? 0, 1521 'span_days' => $raw['days'] ?? wsacsc_populate_default_span_days(), 1522 'pending_pct' => $raw['pending-pct'] ?? ( $raw['include-pending-pct'] ?? 0 ), 1523 'with_logs' => $raw['logs'] ?? '1', 1871 1524 ); 1872 1525 1873 if ( is_array( $argv ) ) { 1874 foreach ( $argv as $arg ) { 1875 if ( ! is_string( $arg ) ) { 1876 continue; 1877 } 1878 if ( preg_match( '/^--table=(actions|logs)$/', $arg, $matches ) ) { 1879 $cli_args['table'] = $matches[1]; 1880 } elseif ( preg_match( '/^--target-mb=(\d+)$/', $arg, $matches ) ) { 1881 $cli_args['target_mode'] = 'size'; 1882 $cli_args['target_mb'] = (int) $matches[1]; 1883 } elseif ( preg_match( '/^--target-rows=(\d+)$/', $arg, $matches ) ) { 1884 $cli_args['target_mode'] = 'rows'; 1885 $cli_args['target_rows'] = (int) $matches[1]; 1886 } elseif ( preg_match( '/^--include-pending-pct=(\d+)$/', $arg, $matches ) ) { 1887 $cli_args['include_pending_pct'] = (int) $matches[1]; 1888 } 1889 } 1890 } 1891 1892 $options = wsacsc_populate_parse_start_options( $cli_args ); 1526 $options = wsacsc_populate_parse_start_options( $payload ); 1893 1527 if ( is_wp_error( $options ) ) { 1894 1528 WP_CLI::error( $options->get_error_message() ); … … 1900 1534 1901 1535 $job = wsacsc_populate_create_job( $options ); 1902 if ( 'size' === $options['target_mode'] ) { 1903 WP_CLI::log( 1904 sprintf( 1905 'Starting %s population: %d MB.', 1906 $options['table'], 1907 $options['target_mb'] 1908 ) 1909 ); 1910 } else { 1911 WP_CLI::log( 1912 sprintf( 1913 'Starting %s population: %d rows.', 1914 $options['table'], 1915 $options['target_rows'] 1916 ) 1917 ); 1918 } 1536 WP_CLI::log( 1537 sprintf( 1538 'Starting %s population: %s.', 1539 $options['table'], 1540 'size' === $options['target_mode'] ? $options['target_mb'] . ' MB' : number_format_i18n( $options['target_rows'] ) . ' rows' 1541 ) 1542 ); 1919 1543 1920 1544 while ( 'running' === $job['status'] ) { … … 1923 1547 WP_CLI::log( 1924 1548 sprintf( 1925 '%s: %s (%d%%) | %s rows inserted ',1549 '%s: %s (%d%%) | %s rows inserted%s', 1926 1550 $progress['table'], 1927 1551 $progress['size_label'], 1928 1552 $progress['percent'], 1929 number_format_i18n( $progress['rows_inserted'] ) 1553 number_format_i18n( $progress['rows_inserted'] ), 1554 $progress['logs_inserted'] ? ' | ' . number_format_i18n( $progress['logs_inserted'] ) . ' log entries' : '' 1930 1555 ) 1931 1556 ); 1932 1933 if ( 'error' === $job['status'] ) {1934 WP_CLI::error( $job['error'] );1935 }1936 1557 } 1937 1558 1938 1559 wsacsc_populate_delete_job( $job['populate_id'] ); 1560 1561 if ( 'error' === $job['status'] ) { 1562 WP_CLI::error( $job['error'] ); 1563 } 1564 1939 1565 WP_CLI::success( 'Population complete.' ); 1940 1566 } 1941 1942 1567 /** 1943 1568 * Render populate controls for one table (actions or logs). … … 1949 1574 * @param int $default_mb Default MB value. 1950 1575 * @param int $default_rows Default row count value. 1951 * @param bool $show_pending Whether to show pending-backlog option (actions only).1576 * @param bool $show_pending Whether to show the actions-only options (history span, pending backlog, logs). 1952 1577 * @return void 1953 1578 */ … … 1982 1607 1983 1608 <?php if ( $show_pending ) : ?> 1609 <div class="wsacsc-field" id="<?php echo esc_attr( $id ); ?>-field-days"> 1610 <label for="<?php echo esc_attr( $id ); ?>-span-days"><?php esc_html_e( 'History span (days)', 'ws-action-scheduler-cleaner' ); ?></label> 1611 <input type="number" id="<?php echo esc_attr( $id ); ?>-span-days" min="1" max="730" value="<?php echo esc_attr( (string) wsacsc_populate_default_span_days() ); ?>" /> 1612 <p class="wsacsc-description"> 1613 <?php esc_html_e( 'New actions are spread over this many days before now, oldest first, so that action IDs follow time as on a real site.', 'ws-action-scheduler-cleaner' ); ?> 1614 </p> 1615 </div> 1984 1616 <div class="wsacsc-field" id="<?php echo esc_attr( $id ); ?>-field-pending"> 1985 1617 <label for="<?php echo esc_attr( $id ); ?>-pending-pct"><?php esc_html_e( 'Pending backlog (%)', 'ws-action-scheduler-cleaner' ); ?></label> 1986 1618 <input type="number" id="<?php echo esc_attr( $id ); ?>-pending-pct" min="0" max="30" value="0" /> 1987 <p class=" description" style="margin:0.35rem 0 0;font-size:0.85rem;color:#50575e;">1988 <?php esc_html_e( 'Optional: share of new actions with status “pending” and a future schedule (0 = finished statuses only). Does not affect cleaner retention tests.', 'ws-action-scheduler-cleaner' ); ?>1619 <p class="wsacsc-description"> 1620 <?php esc_html_e( 'Optional: share of the newest actions with status “pending” and a future schedule (0 = finished statuses only).', 'ws-action-scheduler-cleaner' ); ?> 1989 1621 </p> 1990 1622 </div> 1623 <div class="wsacsc-field" id="<?php echo esc_attr( $id ); ?>-field-logs"> 1624 <label> 1625 <input type="checkbox" id="<?php echo esc_attr( $id ); ?>-with-logs" checked /> 1626 <?php esc_html_e( 'Also add the log entries of each action', 'ws-action-scheduler-cleaner' ); ?> 1627 </label> 1628 <p class="wsacsc-description"> 1629 <?php esc_html_e( 'Action Scheduler writes 2 to 3 log entries per action. Keep this on for realistic clear and retention timings.', 'ws-action-scheduler-cleaner' ); ?> 1630 </p> 1631 </div> 1632 <?php else : ?> 1633 <p class="wsacsc-description"> 1634 <?php esc_html_e( 'Adds the log entries of existing actions, oldest first. When every action has its entries, another pass adds a further set per action.', 'ws-action-scheduler-cleaner' ); ?> 1635 </p> 1991 1636 <?php endif; ?> 1992 1637 … … 2025 1670 2026 1671 $nonce = wp_create_nonce( 'wsacsc_populate' ); 2027 $ajax_url = esc_url ( add_query_arg( array(), wp_unslash( $_SERVER['REQUEST_URI'] ?? '') ) );1672 $ajax_url = esc_url_raw( add_query_arg( array(), sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ?? '' ) ) ) ); 2028 1673 $max_mb = wsacsc_populate_max_target_mb(); 2029 1674 $max_rows = wsacsc_populate_max_rows_per_table(); … … 2039 1684 if ( $tables_ok ) { 2040 1685 $parts = array(); 2041 if ( $schema['has_completed_date'] ) {2042 $parts[] = 'completed_date_gmt';2043 }2044 1686 if ( $schema['has_priority'] ) { 2045 1687 $parts[] = 'priority'; … … 2048 1690 $parts[] = 'extended_args'; 2049 1691 } 2050 if ( wsacsc_populate_can_use_as_classes() ) {1692 if ( class_exists( 'ActionScheduler_SimpleSchedule' ) ) { 2051 1693 $parts[] = __( 'serialized AS schedules', 'ws-action-scheduler-cleaner' ); 2052 1694 } … … 2196 1838 font-size: 1rem; 2197 1839 } 1840 .wsacsc-field label input[type="checkbox"] { 1841 margin-right: 0.35rem; 1842 } 1843 .wsacsc-description { 1844 margin: 0.35rem 0 0; 1845 font-size: 0.85rem; 1846 color: var(--wsacsc-muted); 1847 } 2198 1848 .wsacsc-field input:focus { 2199 1849 border-color: var(--wsacsc-primary); … … 2355 2005 <div class="wsacsc-card" id="wsacsc-card"> 2356 2006 <h1><?php esc_html_e( 'Test Data Populator', 'ws-action-scheduler-cleaner' ); ?></h1> 2357 <p class="wsacsc-subtitle"><?php esc_html_e( 'Fill Action Scheduler tables with realistic rows for cleanup testing .', 'ws-action-scheduler-cleaner' ); ?></p>2007 <p class="wsacsc-subtitle"><?php esc_html_e( 'Fill Action Scheduler tables with realistic rows for cleanup testing: time-ordered IDs, mostly completed actions, and the log entries of each action.', 'ws-action-scheduler-cleaner' ); ?></p> 2358 2008 2359 2009 <div class="wsacsc-notice" role="alert"> … … 2454 2104 var inputRows = document.getElementById(prefix + '-target-rows'); 2455 2105 var pendingInput = table === 'actions' ? document.getElementById(prefix + '-pending-pct') : null; 2106 var daysInput = table === 'actions' ? document.getElementById(prefix + '-span-days') : null; 2107 var logsInput = table === 'actions' ? document.getElementById(prefix + '-with-logs') : null; 2456 2108 var statusBar = document.getElementById(prefix + '-status'); 2457 2109 var statusText = document.getElementById(prefix + '-status-text'); … … 2473 2125 pollBackoff: 1000, 2474 2126 animFrameId: null, 2475 statusPollId: null,2476 2127 displayPct: 0, 2477 2128 targetPct: 0, … … 2490 2141 inputMb.disabled = rowsMode || state.running; 2491 2142 inputRows.disabled = !rowsMode || state.running; 2492 if (pendingInput) { 2493 pendingInput.disabled = state.running; 2494 } 2143 [pendingInput, daysInput, logsInput].forEach(function (input) { 2144 if (input) { 2145 input.disabled = state.running; 2146 } 2147 }); 2495 2148 modeRadios.forEach(function (radio) { 2496 2149 radio.disabled = state.running; … … 2502 2155 var inserted = (progress.rows_inserted || 0).toLocaleString(); 2503 2156 var sizeLabel = progress.size_label || ''; 2157 if (progress.logs_inserted) { 2158 sizeLabel += ' — ' + progress.logs_inserted.toLocaleString() + ' log entries added'; 2159 } 2504 2160 if (progress.target_mode === 'rows') { 2505 2161 var total = (progress.baseline_rows || 0) + (progress.rows_to_add || 0); … … 2543 2199 if (isRunning) { 2544 2200 startProgressAnimation(); 2545 startStatusPolling();2546 2201 } else { 2547 2202 stopProgressAnimation(); 2548 stopStatusPolling();2549 2203 } 2550 2204 } … … 2593 2247 cancelAnimationFrame(state.animFrameId); 2594 2248 state.animFrameId = null; 2595 }2596 }2597 2598 function startStatusPolling() {2599 if (state.statusPollId) {2600 return;2601 }2602 state.statusPollId = window.setInterval(function () {2603 if (!state.running || !state.populateId) {2604 return;2605 }2606 postJson('status', { populate_id: state.populateId, light: 1 })2607 .then(function (data) {2608 if (data && data.success && data.progress) {2609 setProgressTargets(data.progress);2610 }2611 })2612 .catch(function () {});2613 }, 250);2614 }2615 2616 function stopStatusPolling() {2617 if (state.statusPollId) {2618 clearInterval(state.statusPollId);2619 state.statusPollId = null;2620 2249 } 2621 2250 } … … 2694 2323 if (pendingInput) { 2695 2324 var pct = parseInt(pendingInput.value, 10); 2696 payload.include_pending_pct = isNaN(pct) ? 0 : Math.max(0, Math.min(30, pct)); 2325 payload.pending_pct = isNaN(pct) ? 0 : Math.max(0, Math.min(30, pct)); 2326 } 2327 if (daysInput) { 2328 payload.span_days = parseInt(daysInput.value, 10); 2329 } 2330 if (logsInput) { 2331 payload.with_logs = logsInput.checked ? '1' : '0'; 2697 2332 } 2698 2333 return payload; … … 2707 2342 } else if (isNaN(payload.target_rows) || payload.target_rows < 1 || payload.target_rows > config.maxRows) { 2708 2343 setLog(table + ': enter a row count between 1 and ' + config.maxRows.toLocaleString() + '.', 'error'); 2344 return false; 2345 } 2346 if (typeof payload.span_days !== 'undefined' && (isNaN(payload.span_days) || payload.span_days < 1 || payload.span_days > 730)) { 2347 setLog(table + ': enter a history span between 1 and 730 days.', 'error'); 2709 2348 return false; 2710 2349 }
Note:
See TracChangeset
for help on using the changeset viewer.