adapter = $adapter ?: new ADECK_WordPress_Adapter(); add_action( 'admin_menu', [ $this, 'add_admin_menu' ] ); add_action( 'admin_init', [ $this, 'register_settings' ] ); add_action( 'admin_init', [ $this, 'maybe_redirect_after_activation' ], 20 ); add_action( 'admin_notices', [ $this, 'render_plugin_upgrade_notice' ] ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_scripts' ] ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_menu_style' ] ); add_filter( 'pre_update_option_adeck_statement_content', [ $this, 'maybe_reset_statement_to_default' ], 10, 3 ); } private function get_admin_template_path() { return ADECK_PLUGIN_DIR . 'templates/wordpress/admin-settings.php'; } public function enqueue_admin_menu_style() { $menu_icon_url = ADECK_PLUGIN_URL . 'assets/images/menu-icon.svg'; wp_register_style( 'adeck-admin-menu-style', false, [], ADECK_VERSION ); wp_enqueue_style( 'adeck-admin-menu-style' ); wp_add_inline_style( 'adeck-admin-menu-style', '#adminmenu #toplevel_page_adeck-accessibility .wp-menu-image:before{content:"";display:block;width:18px;height:20px;padding:0;margin:6px auto 0;background-color:currentColor;-webkit-mask:url("' . esc_url( $menu_icon_url ) . '") center/18px 20px no-repeat;mask:url("' . esc_url( $menu_icon_url ) . '") center/18px 20px no-repeat;}' . '#adminmenu #toplevel_page_adeck-accessibility .wp-menu-image img{display:none;}' ); } public function render_plugin_upgrade_notice() { if ( ! current_user_can( 'manage_options' ) ) { return; } $message = get_transient( 'adeck_plugin_upgrade_notice' ); if ( ! is_string( $message ) || '' === trim( $message ) ) { return; } delete_transient( 'adeck_plugin_upgrade_notice' ); ?>

adapter->get_admin_script_config() ); } public function add_admin_menu() { add_menu_page( 'ADecksibility Settings', 'ADecksibility', 'manage_options', 'adeck-accessibility', [ $this, 'render_settings_page' ], 'none', 80 ); } public function register_settings() { $color_settings = ADECK_Config_Schema::get_color_option_keys(); foreach ( $color_settings as $setting ) { register_setting( 'adeck_settings_group', $setting, [ 'sanitize_callback' => [ $this, 'sanitize_color_with_fallback' ], ] ); } register_setting( 'adeck_settings_group', 'adeck_widget_enable', [ 'sanitize_callback' => [ $this, 'sanitize_toggle_setting' ], ] ); register_setting( 'adeck_settings_group', 'adeck_widget_position', [ 'sanitize_callback' => [ $this, 'sanitize_widget_position' ], ] ); register_setting( 'adeck_settings_group', 'adeck_widget_side', [ 'sanitize_callback' => [ $this, 'sanitize_widget_side' ], ] ); register_setting( 'adeck_settings_group', 'adeck_widget_launcher_size', [ 'sanitize_callback' => [ $this, 'sanitize_widget_launcher_size' ], ] ); register_setting( 'adeck_settings_group', 'adeck_widget_launcher_icon', [ 'sanitize_callback' => [ $this, 'sanitize_widget_launcher_icon' ], ] ); register_setting( 'adeck_settings_group', 'adeck_display_mode', [ 'sanitize_callback' => [ $this, 'sanitize_display_mode' ], ] ); register_setting( 'adeck_settings_group', 'adeck_display_page_ids', [ 'sanitize_callback' => [ $this, 'sanitize_display_page_ids' ], ] ); register_setting( 'adeck_settings_group', 'adeck_display_url_patterns', [ 'sanitize_callback' => [ $this, 'sanitize_display_url_patterns' ], ] ); register_setting( 'adeck_settings_group', 'adeck_display_exclusions_enabled', [ 'sanitize_callback' => [ $this, 'sanitize_toggle_setting' ], ] ); register_setting( 'adeck_settings_group', 'adeck_display_excluded_page_ids', [ 'sanitize_callback' => [ $this, 'sanitize_display_page_ids' ], ] ); register_setting( 'adeck_settings_group', 'adeck_display_excluded_url_patterns', [ 'sanitize_callback' => [ $this, 'sanitize_display_url_patterns' ], ] ); register_setting( 'adeck_settings_group', 'adeck_display_hide_desktop', [ 'sanitize_callback' => [ $this, 'sanitize_toggle_setting' ], ] ); register_setting( 'adeck_settings_group', 'adeck_display_hide_tablet', [ 'sanitize_callback' => [ $this, 'sanitize_toggle_setting' ], ] ); register_setting( 'adeck_settings_group', 'adeck_display_hide_mobile', [ 'sanitize_callback' => [ $this, 'sanitize_toggle_setting' ], ] ); register_setting( 'adeck_settings_group', 'adeck_visible_widget_features', [ 'sanitize_callback' => [ $this, 'sanitize_visible_widget_features' ], ] ); register_setting( 'adeck_settings_group', 'adeck_visible_widget_features_initialized', [ 'sanitize_callback' => [ $this, 'sanitize_toggle_setting' ], ] ); register_setting( 'adeck_settings_group', 'adeck_statement_enable', [ 'sanitize_callback' => [ $this, 'sanitize_toggle_setting' ], ] ); register_setting( 'adeck_settings_group', 'adeck_statement_content','wp_kses_post' ); register_setting( 'adeck_settings_group', 'adeck_footer_enable', [ 'sanitize_callback' => [ $this, 'sanitize_toggle_setting' ], ] ); register_setting( 'adeck_settings_group', 'adeck_custom_logo', [ 'sanitize_callback' => [ $this, 'sanitize_logo_url' ], ] ); register_setting( 'adeck_settings_group', 'adeck_footer_link', [ 'sanitize_callback' => [ $this, 'sanitize_footer_link' ], ] ); } /** * Sanitize color values and prevent empty input from leaking into generated CSS. */ public function sanitize_color_with_fallback( $color ) { $sanitized = sanitize_hex_color( $color ); return $sanitized ? $sanitized : ''; } /** * Restrict custom logo URLs to http/https sources only. */ public function sanitize_logo_url( $url ) { if ( empty( $url ) ) return ''; $clean = esc_url_raw( $url, [ 'http', 'https' ] ); return $clean; } public function sanitize_footer_link( $url ) { $defaults = ADECK_Config_Schema::get_option_defaults(); $clean = esc_url_raw( $url, [ 'http', 'https' ] ); return '' !== $clean ? $clean : $defaults['adeck_footer_link']; } public function sanitize_toggle_setting( $value ) { return ( 'on' === $value ) ? 'on' : 'off'; } public function sanitize_widget_position( $value ) { $allowed = [ 'top-left', 'top-right', 'middle-left', 'middle-right', 'bottom-left', 'bottom-right' ]; return in_array( $value, $allowed, true ) ? $value : 'bottom-right'; } public function sanitize_widget_side( $value ) { return in_array( $value, [ 'left', 'right' ], true ) ? $value : 'right'; } public function sanitize_widget_launcher_size( $value ) { return ADECK_Config_Schema::sanitize_widget_launcher_size( $value ); } public function sanitize_widget_launcher_icon( $value ) { return ADECK_Config_Schema::sanitize_widget_launcher_icon( $value ); } public function sanitize_display_mode( $value ) { return ADECK_Config_Schema::sanitize_display_mode( $value ); } public function sanitize_display_page_ids( $value ) { return ADECK_Config_Schema::sanitize_display_page_ids( $value ); } public function sanitize_display_url_patterns( $value ) { return ADECK_Config_Schema::sanitize_display_url_patterns( $value ); } public function sanitize_visible_widget_features( $value ) { return ADECK_Config_Schema::sanitize_visible_widget_features( $value ); } public function maybe_reset_statement_to_default( $value, $old_value, $option ) { if ( 'adeck_statement_content' !== $option ) { return $value; } if ( ! current_user_can( 'manage_options' ) ) { return $value; } $reset_requested = isset( $_POST['adeck_reset_statement_to_default'] ) ? sanitize_text_field( wp_unslash( $_POST['adeck_reset_statement_to_default'] ) ) : '0'; if ( '1' !== $reset_requested ) { return $value; } return ADECK_Config_Schema::get_default_statement(); } private function render_settings_saved_notice() { ?>
Settings saved successfully!
render_settings_saved_notice(); return ob_get_clean(); } private function get_allowed_admin_tabs( $edition, $features ) { $edition_tier = isset( $edition['tier'] ) ? (string) $edition['tier'] : 'custom'; $edition_channel = isset( $edition['channel'] ) ? (string) $edition['channel'] : ''; $is_wordpress_org_public = class_exists( 'ADECK_Package_Edition' ) && ADECK_Package_Edition::is_public_package(); $show_premium_admin = ! $is_wordpress_org_public && 'pro' === $edition_tier && 'wordpress' === $edition_channel; $tabs = [ 'tab-general', 'tab-statement', 'tab-privacy' ]; if ( $show_premium_admin && ! empty( $features['displayRules'] ) ) { $tabs[] = 'tab-display'; } if ( $show_premium_admin ) { $tabs[] = 'tab-features'; $tabs[] = 'tab-whitelabel'; } return $tabs; } private function get_initial_admin_tab_state( $edition, $features, $show_welcome_modal ) { $allowed_tabs = $this->get_allowed_admin_tabs( $edition, $features ); $requested_tab = isset( $_GET['adeck_tab'] ) ? sanitize_key( wp_unslash( $_GET['adeck_tab'] ) ) : ''; if ( in_array( $requested_tab, $allowed_tabs, true ) ) { return [ 'tab' => $requested_tab, 'source' => 'query', ]; } if ( $show_welcome_modal && in_array( 'tab-privacy', $allowed_tabs, true ) ) { return [ 'tab' => 'tab-privacy', 'source' => 'welcome', ]; } return [ 'tab' => 'tab-general', 'source' => 'default', ]; } public function render_settings_page() { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html__( 'You do not have permission to access this page.', 'adecksibility' ) ); } $context = $this->adapter->get_admin_settings_page_context(); $edition = $context['edition']; $features = $context['features']; $initial_tab_state = $this->get_initial_admin_tab_state( $edition, $features, $show_welcome_modal ); $package_state = $context['package_state']; $package_state_meta = $context['package_state_meta']; $colors = $context['colors']; $widget_enable = $context['widget_enable']; $widget_pos = $context['widget_pos']; $widget_side = $context['widget_side']; $widget_launcher_size = $context['widget_launcher_size']; $display_mode = $context['display_mode']; $display_page_ids = $context['display_page_ids']; $display_url_patterns = $context['display_url_patterns']; $display_exclusions_enabled = $context['display_exclusions_enabled']; $display_excluded_page_ids = $context['display_excluded_page_ids']; $display_excluded_url_patterns = $context['display_excluded_url_patterns']; $display_hide_desktop = $context['display_hide_desktop']; $display_hide_tablet = $context['display_hide_tablet']; $display_hide_mobile = $context['display_hide_mobile']; $display_rule_pages = $context['display_rule_pages']; $widget_feature_catalog = $context['widget_feature_catalog']; $visible_widget_features = $context['visible_widget_features']; $statement_enable = $context['statement_enable']; $statement_content = $context['statement_content']; $footer_enable = $context['footer_enable']; $custom_logo = $context['custom_logo']; $footer_link = $context['footer_link']; $monitoring_status = $context['monitoring_status']; $settings_updated = $context['settings_updated']; $pos_vertical = $context['pos_vertical']; $pos_horiz = $context['pos_horiz']; $launcher_metrics = $context['launcher_metrics']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo $this->adapter->renderer()->render_template( $this->get_admin_template_path(), [ 'colors' => $colors, 'edition' => $edition, 'features' => $features, 'package_state' => $package_state, 'package_state_meta' => $package_state_meta, 'widget_enable' => $widget_enable, 'widget_pos' => $widget_pos, 'widget_side' => $widget_side, 'widget_launcher_size' => $widget_launcher_size, 'widget_launcher_icon' => isset( $context['widget_launcher_icon'] ) ? $context['widget_launcher_icon'] : ADECK_Config_Schema::get_option_defaults()['adeck_widget_launcher_icon'], 'display_mode' => $display_mode, 'display_page_ids' => $display_page_ids, 'display_url_patterns' => $display_url_patterns, 'display_exclusions_enabled' => $display_exclusions_enabled, 'display_excluded_page_ids' => $display_excluded_page_ids, 'display_excluded_url_patterns' => $display_excluded_url_patterns, 'display_hide_desktop' => $context['display_hide_desktop'], 'display_hide_tablet' => $context['display_hide_tablet'], 'display_hide_mobile' => $context['display_hide_mobile'], 'display_rule_pages' => $display_rule_pages, 'widget_feature_catalog' => $context['widget_feature_catalog'], 'visible_widget_features' => $context['visible_widget_features'], 'initial_tab' => $initial_tab_state['tab'], 'initial_tab_source' => $initial_tab_state['source'], 'statement_enable' => $statement_enable, 'statement_content' => $statement_content, 'footer_enable' => $footer_enable, 'custom_logo' => $custom_logo, 'footer_link' => $footer_link, 'monitoring_status' => $monitoring_status, 'settings_updated' => $settings_updated, 'pos_vertical' => $pos_vertical, 'pos_horiz' => $pos_horiz, 'launcher_metrics' => $launcher_metrics, 'saved_notice_html' => $settings_updated ? $this->get_settings_saved_notice_html() : '', ] ); return; } }