'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['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'; $settings['design_theme'] = in_array(($input['design_theme'] ?? 'obyte'), ['obyte', 'inherit'], true) ? (string) $input['design_theme'] : 'obyte'; $settings['design_primary_color'] = self::sanitizeHexColor((string) ($input['design_primary_color'] ?? '#00A7E6'), '#00A7E6'); $settings['design_accent_color'] = self::sanitizeHexColor((string) ($input['design_accent_color'] ?? '#F59C00'), '#F59C00'); $settings['design_radius'] = (string) max(0, min(32, (int) ($input['design_radius'] ?? 14))); $settings['custom_theme_css_url'] = esc_url_raw((string) ($input['custom_theme_css_url'] ?? '')); $settings['docs_home_intro_title'] = sanitize_text_field((string) ($input['docs_home_intro_title'] ?? $settings['docs_home_intro_title'])); $settings['docs_home_intro_content'] = wp_kses_post((string) ($input['docs_home_intro_content'] ?? $settings['docs_home_intro_content'])); $settings['product_updates_source'] = 'olm_changelog'; $settings['product_updates_olm_months'] = (string) max(1, min(24, (int) ($input['product_updates_olm_months'] ?? 4))); $settings['product_updates_olm_ignore_numbers'] = self::sanitizeOlmNumberList((string) ($input['product_updates_olm_ignore_numbers'] ?? 'olm-10109,olm-10110')); $settings['olm_base_url'] = esc_url_raw(ChangelogSync::normalizeBaseUrl((string) ($input['olm_base_url'] ?? ''))); $settings['olm_username'] = sanitize_text_field((string) ($input['olm_username'] ?? '')); $settings['olm_password'] = trim((string) ($input['olm_password'] ?? '')) ?: (string) $old['olm_password']; 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-markdown-importer')); } if (isset($_POST['kb_markdown_test_connection']) && check_admin_referer('kb_markdown_test_connection')) { self::handleConnectionTest(); } $updatesTest = null; if (isset($_POST['kb_markdown_test_product_updates']) && check_admin_referer('kb_markdown_test_product_updates')) { $updatesTest = self::handleProductUpdatesTest(); } $settings = Plugin::settings(); ?>