— per review) add_action('admin_enqueue_scripts', [$this, 'enqueue_admin_assets']); // Settings-Link in der Pluginliste add_filter('plugin_action_links_' . plugin_basename(__FILE__), function($links){ if (current_user_can('manage_options')) { $url = admin_url('options-general.php?page=' . self::PAGE_SLUG); $links[] = ''.esc_html__('Settings', 'admin-maintenance-msg').''; } return $links; }); } public function on_activate(): void { // Migration alter Option → neue Option $defaults = ['enabled'=>0,'from'=>'','to'=>'','message'=>'']; if (!get_option(self::OPTION)) { $old = get_option(self::OPTION_OLD); if (is_array($old)) { add_option(self::OPTION, wp_parse_args($old, $defaults)); // Alte Option optional aufräumen: delete_option(self::OPTION_OLD); } else { add_option(self::OPTION, $defaults); } } } /** ========= Assets ========= */ public function enqueue_admin_assets(): void { // CSS global für Admin + Network-Admin $css_url = plugin_dir_url(__FILE__) . 'assets/admin.css'; wp_register_style(self::HANDLE_CSS, $css_url, [], self::VERSION, 'all'); wp_enqueue_style(self::HANDLE_CSS); } /** ========= Settings ========= */ private function get_opts(): array { $opts = get_option(self::OPTION, []); $defaults = ['enabled'=>0,'from'=>'','to'=>'','message'=>'']; return wp_parse_args($opts, $defaults); } public function add_settings_page(): void { add_options_page( __('Wartungshinweis', 'admin-maintenance-msg'), __('Wartungshinweis', 'admin-maintenance-msg'), 'manage_options', self::PAGE_SLUG, [$this, 'render_settings_page'] ); } public function register_settings(): void { register_setting(self::OPTION, self::OPTION, [ 'type' => 'array', 'sanitize_callback' => [$this, 'sanitize_opts'], 'default' => ['enabled'=>0,'from'=>'','to'=>'','message'=>''], ]); add_settings_section('ammsg_section_main', '', '__return_null', self::OPTION); add_settings_field('enabled', __('Wartung aktiv', 'admin-maintenance-msg'), function() { $o = $this->get_opts(); ?> get_opts(); ?>
get_opts(); ?> get_opts(); ?> get_opts(); $out['enabled'] = isset($input['enabled']) ? 1 : 0; $out['from'] = isset($input['from']) ? sanitize_text_field($input['from']) : ''; $out['to'] = isset($input['to']) ? sanitize_text_field($input['to']) : ''; $out['message'] = isset($input['message']) ? wp_kses_post($input['message']) : ''; foreach (['from','to'] as $k) { if ($out[$k] && !$this->parse_local_dt($out[$k])) { $out[$k] = ''; } } return $out; } /** ========= Helpers ========= */ private function parse_local_dt($dt): ?DateTime { if (!$dt) return null; $tz = function_exists('wp_timezone') ? wp_timezone() : new DateTimeZone('UTC'); $norm = str_replace(' ', 'T', $dt); $d = DateTime::createFromFormat('Y-m-d\TH:i', $norm, $tz); if ($d instanceof DateTime) return $d; try { return new DateTime($dt, $tz); } catch (Exception $e) { return null; } } private function weekday_de_short(DateTimeInterface $dt): string { $map = ['So','Mo','Di','Mi','Do','Fr','Sa']; return $map[(int)$dt->format('w')]; } private function weekday_de_long(DateTimeInterface $dt): string { $map = ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag']; return $map[(int)$dt->format('w')]; } private function format_window_text(?DateTime $from, ?DateTime $to): string { if (!$from) return ''; $tzabbr = $from->format('T'); if ($to && $from->format('Y-m-d') !== $to->format('Y-m-d')) { return sprintf( '%s, %s, %s – %s, %s, %s (%s)', $this->weekday_de_short($from), $from->format('d.m.Y'), $from->format('H:i'), $this->weekday_de_short($to), $to->format('d.m.Y'), $to->format('H:i'), $tzabbr ); } return sprintf( '%s, %s, %s–%s (%s)', $this->weekday_de_long($from), $from->format('d.m.Y'), $from->format('H:i'), $to ? $to->format('H:i') : $from->format('H:i'), $tzabbr ); } /** ========= Notice ========= */ public function maybe_show_notice(): void { $o = $this->get_opts(); $enabled = !empty($o['enabled']); $from = $this->parse_local_dt($o['from']); $to = $this->parse_local_dt($o['to']); $within = false; if ($from && $to) { $now = new DateTime('now', $from->getTimezone()); $within = ($now >= $from && $now <= $to); } if (!$enabled && !$within) return; $window_text = $this->format_window_text($from, $to); $repl = []; if ($from) { $repl['{WEEKDAY}'] = $this->weekday_de_long($from); $repl['{DATE}'] = $from->format('d.m.Y'); $repl['{FROM}'] = $from->format('H:i'); $repl['{DATETIME_FROM}'] = $from->format('d.m.Y H:i'); $repl['{TZ}'] = $from->format('T'); } if ($to) { $repl['{WEEKDAY_TO}'] = $this->weekday_de_long($to); $repl['{DATE_TO}'] = $to->format('d.m.Y'); $repl['{TO}'] = $to->format('H:i'); $repl['{DATETIME_TO}'] = $to->format('d.m.Y H:i'); } $raw = isset($o['message']) ? trim($o['message']) : ''; if ($raw === '' && $from && $to) { $message = sprintf( /* translators: 1: date (dd.mm.yyyy), 2: start time (HH:MM), 3: end time (HH:MM) */ __('Wir führen am %1$s zwischen %2$s und %3$s planmäßige Wartungsarbeiten durch. Innerhalb dieses Zeitraums steht die Website nicht zur Verfügung.', 'admin-maintenance-msg'), $from->format('d.m.Y'), $from->format('H:i'), $to->format('H:i') ); if ($window_text) { $message .= ' – ' . $window_text; } } else { $message = $raw !== '' ? $raw : __('Geplante Wartungsarbeiten.', 'admin-maintenance-msg'); if ($repl) { $message = strtr($message, $repl); } if ($window_text && !preg_match('/\{(WEEKDAY|DATE|FROM|TO|TZ|DATETIME_FROM|DATETIME_TO|WEEKDAY_TO|DATE_TO)\}/', $raw)) { $message .= ' – ' . $window_text; } } ?>