'array', 'sanitize_callback' => [self::class, 'sanitize'], 'default' => Settings::defaults(), ]); } public static function sanitize(array $input): array { $old = Plugin::settings(); $settings = Settings::defaults(); $settings['gitlab_base_url'] = esc_url_raw(GitLabClient::normalizeBaseUrl((string) ($input['gitlab_base_url'] ?? ''))); $settings['gitlab_token'] = trim((string) ($input['gitlab_token'] ?? '')) ?: (string) $old['gitlab_token']; $settings['gitlab_group'] = sanitize_text_field((string) ($input['gitlab_group'] ?? 'knowledgebase')); $settings['branch_pattern'] = sanitize_text_field((string) ($input['branch_pattern'] ?? '^v.*')); $settings['docs_base_slug'] = sanitize_title((string) ($input['docs_base_slug'] ?? 'docs')) ?: 'docs'; $settings['renderer_mode'] = in_array(($input['renderer_mode'] ?? 'php'), ['php', 'asciidoctor'], true) ? (string) $input['renderer_mode'] : 'php'; $settings['asciidoctor_path'] = sanitize_text_field((string) ($input['asciidoctor_path'] ?? 'asciidoctor')); $settings['image_lightbox'] = ! empty($input['image_lightbox']) ? '1' : '0'; $settings['public_docs'] = ! empty($input['public_docs']) ? '1' : '0'; $settings['allow_svg'] = ! empty($input['allow_svg']) ? '1' : '0'; $settings['cron_interval'] = in_array(($input['cron_interval'] ?? 'disabled'), ['disabled', 'hourly', 'daily', 'weekly'], true) ? (string) $input['cron_interval'] : 'disabled'; Plugin::syncCronSchedule($settings); if (($old['docs_base_slug'] ?? 'docs') !== $settings['docs_base_slug']) { flush_rewrite_rules(false); } return $settings; } public static function render(): void { if (! current_user_can('manage_kb_docs')) { wp_die(esc_html__('Insufficient permissions.', 'kb-antora-importer')); } if (isset($_POST['kb_antora_test_connection']) && check_admin_referer('kb_antora_test_connection')) { self::handleConnectionTest(); } $settings = Plugin::settings(); ?>

getGroup(Plugin::settings()['gitlab_group']); if (is_wp_error($result)) { $message = self::formatConnectionError($result); ImportLogger::error('GitLab connection failed: ' . $message); add_settings_error('kb_antora_importer', 'connection_failed', esc_html($message), 'error'); settings_errors('kb_antora_importer'); return; } ImportLogger::info('GitLab connection successful.'); add_settings_error('kb_antora_importer', 'connection_ok', esc_html__('GitLab connection successful.', 'kb-antora-importer'), 'success'); settings_errors('kb_antora_importer'); } private static function formatConnectionError(\WP_Error $error): string { $message = $error->get_error_message(); $data = $error->get_error_data(); if (! is_array($data)) { return $message; } if (! empty($data['url'])) { $message .= ' Target: ' . $data['url']; } if (! empty($data['retry_after'])) { $message .= ' Retry-After: ' . $data['retry_after']; } if (! empty($data['response_excerpt'])) { $message .= ' Response: ' . $data['response_excerpt']; } return $message; } }