1048576, 'delay_ms' => 0, 'history_limit' => 200, 'restore_points_limit' => 2, 'backups_limit' => 3, ]; private const RANGES = [ 'request_size' => [524288, 26214400], 'delay_ms' => [0, 10000], 'history_limit' => [10, 5000], 'restore_points_limit' => [0, 10], 'backups_limit' => [1, 20], ]; public function all(): array { $stored = get_site_option(self::OPTION, []); $stored = is_array($stored) ? array_intersect_key($stored, self::DEFAULTS) : []; return array_merge(self::DEFAULTS, array_map('intval', $stored)); } /** @return int */ public function get(string $key) { $all = $this->all(); if (!array_key_exists($key, $all)) { throw new \InvalidArgumentException(esc_html("Unknown setting {$key}")); } return $all[$key]; } public function update(array $changes): array { $current = $this->all(); foreach ($changes as $key => $value) { if (!array_key_exists($key, self::DEFAULTS)) { /* translators: %s: setting name */ throw new RelayError('settings.unknown_key', esc_html(sprintf(__('Unknown setting: %s', 'siterelay'), $key))); } if (!is_numeric($value) || (float) $value !== (float) (int) $value) { /* translators: %s: setting name */ throw new RelayError('settings.invalid', esc_html(sprintf(__('%s must be a whole number.', 'siterelay'), $key))); } [$min, $max] = self::RANGES[$key]; $current[$key] = max($min, min($max, (int) $value)); } update_site_option(self::OPTION, $current); return $current; } }