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;
}
}