Changeset 3639910 for roxyapi/trunk/src/Admin/SettingsPage.php
- Timestamp:
- 08/10/2026 03:32:57 AM (2 months ago)
- File:
-
- 1 edited
-
roxyapi/trunk/src/Admin/SettingsPage.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
roxyapi/trunk/src/Admin/SettingsPage.php
r3639803 r3639910 157 157 echo '<div class="wrap roxyapi-settings">'; 158 158 159 // "Settings saved." is added by wp-admin/options-head.php, which only the 160 // core options-*.php screens load, so a custom menu page saves silently 161 // unless it registers the notice itself. Core's own rule is mirrored here, 162 // including staying quiet when the same save also produced an error. 163 // The string carries OUR text domain even though core ships the same one: 164 // borrowing `default` would leave it untranslated the day core reworded it. 165 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only flag, set by options.php on its own redirect after it has verified the nonce. 166 if ( isset( $_GET['settings-updated'] ) && count( get_settings_errors( self::OPTION_NAME ) ) === 0 ) { 167 add_settings_error( self::OPTION_NAME, 'roxyapi_settings_updated', __( 'Settings saved.', 'roxyapi' ), 'success' ); 168 } 169 159 170 settings_errors( self::OPTION_NAME ); 160 171 161 if ( ! $is_configured ) { 162 $html = Templates::render( 163 'admin-onboarding', 164 array( 165 'signup_url' => Onboarding::signup_url(), 166 'playground_url' => Onboarding::playground_url(), 167 'shortcodes_url' => admin_url( 'admin.php?page=' . ShortcodesPage::PAGE_SLUG ), 168 'samples' => Onboarding::quickstart_samples(), 169 'key_input' => SettingsFields::api_key_input_html(), 170 'key_help' => SettingsFields::api_key_help_html(), 171 'key_disabled' => $key_disabled, 172 'is_configured' => false, 173 'option_group' => self::OPTION_GROUP, 174 ) 175 ); 176 } else { 177 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only tab selector on a manage_options page. 178 $active_tab = isset( $_GET['tab'] ) ? sanitize_key( wp_unslash( $_GET['tab'] ) ) : 'connect'; 179 if ( ! in_array( $active_tab, array( 'connect', 'branding', 'display', 'privacy', 'advanced' ), true ) ) { 180 $active_tab = 'connect'; 181 } 182 183 $html = Templates::render( 184 'admin-connected', 185 array( 186 'active_tab' => $active_tab, 187 'attribution_input' => SettingsFields::attribution_checkbox_html(), 188 'consent_label_input' => SettingsFields::consent_label_textarea_html(), 189 'palette_preset_input' => SettingsFields::palette_preset_input_html(), 190 'palette_colors_input' => SettingsFields::palette_colors_html(), 191 'palette_reset_input' => SettingsFields::palette_reset_html(), 192 'palette_is_custom' => (string) ( SettingsSchema::get_option()['palette_preset'] ?? '' ) === '', 193 'theme_mode_input' => SettingsFields::theme_mode_input_html(), 194 'display_language_input' => SettingsFields::display_language_input_html(), 195 'hide_readings_input' => SettingsFields::hide_readings_html(), 196 'disclaimer_show_input' => SettingsFields::disclaimer_show_html(), 197 'disclaimer_text_input' => SettingsFields::disclaimer_text_html(), 198 'form_title_input' => SettingsFields::form_title_input_html(), 199 'form_submit_input' => SettingsFields::form_submit_input_html(), 200 'cache_preset_input' => SettingsFields::cache_preset_input_html(), 201 'privacy_policy_url' => admin_url( 'options-privacy.php' ), 202 'shortcodes_url' => admin_url( 'admin.php?page=' . ShortcodesPage::PAGE_SLUG ), 203 'samples' => Onboarding::quickstart_samples(), 204 'key_input' => SettingsFields::api_key_input_html(), 205 'key_help' => SettingsFields::api_key_help_html(), 206 'key_disabled' => $key_disabled, 207 'option_group' => self::OPTION_GROUP, 208 'docs_url' => Onboarding::docs_url(), 209 'support_url' => Onboarding::support_url(), 210 'dashboard_url' => Onboarding::dashboard_url(), 211 ) 212 ); 213 } 172 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only tab selector on a manage_options page. 173 $active_tab = isset( $_GET['tab'] ) ? sanitize_key( wp_unslash( $_GET['tab'] ) ) : 'connect'; 174 if ( ! in_array( $active_tab, array( 'connect', 'branding', 'display', 'privacy', 'advanced' ), true ) ) { 175 $active_tab = 'connect'; 176 } 177 178 // Every tab renders whether or not a key is stored. Readings render from 179 // the moment the plugin is activated, so the settings that shape them 180 // (language, palette, theme, disclaimer, hide-written-readings) have to be 181 // reachable from that same moment. Only the Connect tab body changes: 182 // setup steps before a key, key management after one. 183 $onboarding = $is_configured ? '' : Templates::render( 184 'admin-onboarding', 185 array( 186 'signup_url' => Onboarding::signup_url(), 187 'playground_url' => Onboarding::playground_url(), 188 'shortcodes_url' => admin_url( 'admin.php?page=' . ShortcodesPage::PAGE_SLUG ), 189 'samples' => Onboarding::quickstart_samples(), 190 'key_input' => SettingsFields::api_key_input_html(), 191 'key_help' => SettingsFields::api_key_help_html(), 192 'key_disabled' => $key_disabled, 193 'is_configured' => false, 194 'option_group' => self::OPTION_GROUP, 195 ) 196 ); 197 198 $html = Templates::render( 199 'admin-connected', 200 array( 201 'is_configured' => $is_configured, 202 'onboarding' => $onboarding, 203 'active_tab' => $active_tab, 204 'attribution_input' => SettingsFields::attribution_checkbox_html(), 205 'consent_label_input' => SettingsFields::consent_label_textarea_html(), 206 'palette_preset_input' => SettingsFields::palette_preset_input_html(), 207 'palette_colors_input' => SettingsFields::palette_colors_html(), 208 'palette_reset_input' => SettingsFields::palette_reset_html(), 209 'palette_is_custom' => (string) ( SettingsSchema::get_option()['palette_preset'] ?? '' ) === '', 210 'theme_mode_input' => SettingsFields::theme_mode_input_html(), 211 'display_language_input' => SettingsFields::display_language_input_html(), 212 'hide_readings_input' => SettingsFields::hide_readings_html(), 213 'disclaimer_show_input' => SettingsFields::disclaimer_show_html(), 214 'disclaimer_text_input' => SettingsFields::disclaimer_text_html(), 215 'form_title_input' => SettingsFields::form_title_input_html(), 216 'form_submit_input' => SettingsFields::form_submit_input_html(), 217 'cache_preset_input' => SettingsFields::cache_preset_input_html(), 218 'privacy_policy_url' => admin_url( 'options-privacy.php' ), 219 'shortcodes_url' => admin_url( 'admin.php?page=' . ShortcodesPage::PAGE_SLUG ), 220 'samples' => Onboarding::quickstart_samples(), 221 'key_input' => SettingsFields::api_key_input_html(), 222 'key_help' => SettingsFields::api_key_help_html(), 223 'key_disabled' => $key_disabled, 224 'option_group' => self::OPTION_GROUP, 225 'docs_url' => Onboarding::docs_url(), 226 'support_url' => Onboarding::support_url(), 227 'dashboard_url' => Onboarding::dashboard_url(), 228 ) 229 ); 214 230 215 231 // Templates assemble $html from pre-escaped fragments: every dynamic
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)