'Gemeinsame Ping-URL', 'files_url' => 'Ping-URL für Dateien', 'database_url' => 'Ping-URL für Datenbank'); public static function labels() { return array( 'default_url' => __('Gemeinsame Ping-URL', 'servermetry'), 'files_url' => __('Ping-URL für Dateien', 'servermetry'), 'database_url' => __('Ping-URL für Datenbank', 'servermetry'), ); } public function register() { add_action('admin_menu', array($this, 'menu')); add_action('admin_init', array($this, 'settings')); } public function get() { return array_merge(array_fill_keys(array_keys(self::FIELDS), ''), (array) get_option(self::OPTION, array())); } public static function valid_url($url) { if (!is_string($url) || strlen($url) > 2048) { return false; } $parts = wp_parse_url($url); return is_array($parts) && isset($parts['scheme'], $parts['host'], $parts['path']) && 'https' === strtolower($parts['scheme']) && !isset($parts['user']) && !isset($parts['pass']) && !isset($parts['query']) && !isset($parts['fragment']) && (!isset($parts['port']) || 443 === $parts['port']) && 1 === preg_match('~^/api/v1/backup/ping/[a-zA-Z0-9_-]{16,200}$~D', $parts['path']) && false !== wp_http_validate_url($url); } public function sanitize($input) { $old = $this->get(); $input = is_array($input) ? $input : array(); foreach (self::labels() as $key => $label) { if (!empty($input['remove_' . $key])) { $old[$key] = ''; continue; } $value = isset($input[$key]) && is_string($input[$key]) ? trim($input[$key]) : ''; if ('' === $value) { continue; // Blank secret fields preserve their stored value. } if (!self::valid_url($value)) { add_settings_error(self::OPTION, $key, $label . ': ' . __('Bitte eine vollständige HTTPS-Ping-URL ohne Status-Endung oder URL-Parameter eingeben. Der bisherige Wert bleibt erhalten.', 'servermetry')); continue; } $old[$key] = $value; } return array_intersect_key($old, self::FIELDS); } public function menu() { add_options_page('ServerMetry', 'ServerMetry', 'manage_options', 'servermetry', array($this, 'page')); } public function settings() { add_option(self::OPTION, array(), '', false); register_setting('servermetry', self::OPTION, array('type' => 'array', 'sanitize_callback' => array($this, 'sanitize'), 'show_in_rest' => false)); add_settings_section('servermetry_backup', __('UpdraftPlus-Backups', 'servermetry'), '__return_false', 'servermetry'); foreach (self::labels() as $key => $label) { add_settings_field($key, $label, array($this, 'field'), 'servermetry', 'servermetry_backup', array('label_for' => $key, 'key' => $key)); } } public function field($args) { $key = $args['key']; $configured = !empty($this->get()[$key]); echo ''; echo '
' . esc_html($configured ? __('URL gespeichert. Leer lassen, um sie zu behalten.', 'servermetry') : __('Noch keine URL gespeichert. Vollständige Ping-URL aus ServerMetry eintragen.', 'servermetry')) . '
'; if ($configured) { echo ''; } } public function dashboard_url() { $urls = array_filter($this->get()); $dev_only = !empty($urls); foreach ($urls as $url) { $parts = wp_parse_url($url); if (!is_array($parts) || 'dev-api.servermetry.com' !== strtolower($parts['host'] ?? '')) { $dev_only = false; } } return $dev_only ? 'https://dev.servermetry.com' : 'https://servermetry.com'; } public function page() { if (!current_user_can('manage_options')) { return; } echo '' . esc_html__('UpdraftPlus ist nicht aktiv. Die Einstellungen können bereits gespeichert werden; Backup-Meldungen beginnen mit dem nächsten UpdraftPlus-Lauf.', 'servermetry') . '
' . esc_html__('Start, Erfolg, Warnung und endgültiger Fehler werden automatisch gemeldet. ServerMetry berechnet die Laufzeit aus Start und Abschluss.', 'servermetry') . '
'; echo '' . esc_html__('Die gemeinsame URL gilt für Dateien und Datenbank. Die beiden optionalen URLs ersetzen sie für den jeweiligen Bestandteil. Ein kombinierter Lauf meldet an beide Ziele; identische URLs werden nur einmal verwendet.', 'servermetry') . '
'; echo '' . esc_html__('Noch keine Backup-Meldung gesendet.', 'servermetry') . '
'; } else { echo '' . esc_html(wp_date('d.m.Y H:i:s', $last['time']) . ' — ' . $last['status']) . '
'; } echo '' . esc_html__('Zum Prüfen ein echtes Backup starten und danach den Unterjob-Verlauf in ServerMetry öffnen. Ein künstlicher Erfolgstest würde den überwachten Backup-Status verändern.', 'servermetry') . ' UpdraftPlus
'; echo '' . esc_html__('Benachrichtigungen, Zeitplan, Toleranz und Laufzeitgrenze in ServerMetry einstellen. Das Plugin führt selbst keine Backups aus und richtet keine Alarmregeln ein.', 'servermetry') . ' ' . esc_html__('ServerMetry → Backup-Pläne', 'servermetry') . ' · ' . esc_html__('Regeln → Backup', 'servermetry') . '
'; echo '' . esc_html__('Mit dem Speichern einer Ping-URL aktivierst du die Übertragung von Backup-Status, Laufkennung, Warnungsanzahl sowie Datei- und Datenbank-Zeitplänen an diesen ServerMetry-Endpunkt. Ohne URL beginnen keine neuen Meldungen. Bereits gestartete Läufe behalten ihre Ziele. Ein ServerMetry-Konto und ein eingerichteter Unterjob sind erforderlich.', 'servermetry') . ' ' . esc_html__('Nutzungsbedingungen', 'servermetry') . ' · ' . esc_html__('Datenschutz', 'servermetry') . '