fields = new AHA_Mobile_Menu_Settings_Fields( $this->option_name, array( $this, 'get_settings' ) ); add_action( 'admin_menu', array( $this, 'register_menu' ) ); add_action( 'admin_init', array( $this, 'register_settings' ) ); add_action( 'admin_init', array( $this, 'maybe_dismiss_review_notice' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) ); add_action( 'admin_notices', array( $this, 'render_review_notice' ) ); } /** * Register admin menu */ public function register_menu() { add_menu_page( __( 'Aha Mobile Menu', 'aha-mobile-menu' ), __( 'Aha Mobile Menu', 'aha-mobile-menu' ), 'manage_options', 'aha-mobile-menu', array( $this, 'render_settings_page' ), 'dashicons-menu', 76 ); } /** * Register settings */ public function register_settings() { register_setting( 'aha_mobile_menu_group', $this->option_name, array( 'sanitize_callback' => array( $this, 'sanitize_settings' ), ) ); // Sidebar General Settings Section (Tab: General) add_settings_section( 'aha_mobile_menu_general', __( 'General Settings', 'aha-mobile-menu' ), array( $this->fields, 'render_section_general' ), 'aha-mobile-menu-general' ); add_settings_field( 'aha_mobile_menu_enable', __( 'Enable Sidebar', 'aha-mobile-menu' ), array( $this->fields, 'render_field_enable' ), 'aha-mobile-menu-general', 'aha_mobile_menu_general' ); add_settings_field( 'aha_mobile_menu_position', __( 'Sidebar Position', 'aha-mobile-menu' ), array( $this->fields, 'render_field_position' ), 'aha-mobile-menu-general', 'aha_mobile_menu_general' ); add_settings_field( 'aha_mobile_menu_animation', __( 'Animation', 'aha-mobile-menu' ), array( $this->fields, 'render_field_animation' ), 'aha-mobile-menu-general', 'aha_mobile_menu_general' ); add_settings_field( 'aha_mobile_menu_mobile_only', __( 'Mobile Only', 'aha-mobile-menu' ), array( $this->fields, 'render_field_mobile_only' ), 'aha-mobile-menu-general', 'aha_mobile_menu_general' ); // Logo and Menu Settings (Tab: Content) add_settings_section( 'aha_mobile_menu_content', __( 'Sidebar Content', 'aha-mobile-menu' ), array( $this->fields, 'render_section_content' ), 'aha-mobile-menu-content' ); add_settings_field( 'aha_mobile_menu_logo', __( 'Sidebar Logo', 'aha-mobile-menu' ), array( $this->fields, 'render_field_logo' ), 'aha-mobile-menu-content', 'aha_mobile_menu_content' ); add_settings_field( 'aha_mobile_menu_menu', __( 'Menu to Display', 'aha-mobile-menu' ), array( $this->fields, 'render_field_menu' ), 'aha-mobile-menu-content', 'aha_mobile_menu_content' ); add_settings_field( 'aha_mobile_menu_enable_search', __( 'Enable Search', 'aha-mobile-menu' ), array( $this->fields, 'render_field_enable_search' ), 'aha-mobile-menu-content', 'aha_mobile_menu_content' ); // Social Networks Settings (Tab: Content) add_settings_section( 'aha_mobile_menu_social', __( 'Social Networks', 'aha-mobile-menu' ), array( $this->fields, 'render_section_social' ), 'aha-mobile-menu-social' ); add_settings_field( 'aha_mobile_menu_social_links', __( 'Social Links', 'aha-mobile-menu' ), array( $this->fields, 'render_field_social_links' ), 'aha-mobile-menu-social', 'aha_mobile_menu_social' ); // Design Settings (Tab: Appearance) add_settings_section( 'aha_mobile_menu_design', __( 'Visual Customization', 'aha-mobile-menu' ), array( $this->fields, 'render_section_design' ), 'aha-mobile-menu-design' ); add_settings_field( 'aha_mobile_menu_color_palette', __( 'Color Palette', 'aha-mobile-menu' ), array( $this->fields, 'render_field_color_palette' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_bg_color', __( 'Background Color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_bg_color' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_text_color', __( 'Text Color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_text_color' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_close_button_divider', '', array( $this->fields, 'render_field_close_button_divider' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_close_button_title', '', array( $this->fields, 'render_field_close_button_title' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_close_button_bg_color', __( 'Close Button Background Color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_close_button_bg_color' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_close_button_icon_color', __( 'Close Button Icon Color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_close_button_icon_color' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_search_divider', '', array( $this->fields, 'render_field_search_divider' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_search_title', '', array( $this->fields, 'render_field_search_title' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_search_input_bg_color', __( 'Search Input Background Color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_search_input_bg_color' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_search_input_border_color', __( 'Search Input Border Color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_search_input_border_color' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_search_input_text_color', __( 'Search Input Text Color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_search_input_text_color' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_search_icon_color', __( 'Search Icon Color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_search_icon_color' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_search_button_bg_color', __( 'Search Button Background Color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_search_button_bg_color' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_menu_links_divider', '', array( $this->fields, 'render_field_menu_links_divider' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_menu_links_title', '', array( $this->fields, 'render_field_menu_links_title' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_menu_link_color', __( 'Menu Link Color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_menu_link_color' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_menu_link_active_color', __( 'Menu Link Active Color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_menu_link_active_color' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_menu_link_hover_color', __( 'Menu Link Hover Color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_menu_link_hover_color' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_social_divider', '', array( $this->fields, 'render_field_social_divider' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_social_title', '', array( $this->fields, 'render_field_social_title' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_social_bg_color', __( 'Social Icon Background Color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_social_bg_color' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); add_settings_field( 'aha_mobile_menu_social_icon_color', __( 'Social Icon Color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_social_icon_color' ), 'aha-mobile-menu-design', 'aha_mobile_menu_design' ); // Behavior Settings (Tab: General) add_settings_section( 'aha_mobile_menu_behavior', __( 'Behavior', 'aha-mobile-menu' ), array( $this->fields, 'render_section_behavior' ), 'aha-mobile-menu-behavior' ); add_settings_field( 'aha_mobile_menu_close_on_click_outside', __( 'Close on Click Outside', 'aha-mobile-menu' ), array( $this->fields, 'render_field_close_on_click_outside' ), 'aha-mobile-menu-behavior', 'aha_mobile_menu_behavior' ); add_settings_field( 'aha_mobile_menu_close_on_navigation', __( 'Close on Navigation', 'aha-mobile-menu' ), array( $this->fields, 'render_field_close_on_navigation' ), 'aha-mobile-menu-behavior', 'aha_mobile_menu_behavior' ); add_settings_field( 'aha_mobile_menu_trigger_classes', __( 'Additional Trigger Classes', 'aha-mobile-menu' ), array( $this->fields, 'render_field_trigger_classes' ), 'aha-mobile-menu-behavior', 'aha_mobile_menu_behavior' ); // Exclusions Settings (Tab: Exclusions) add_settings_section( 'aha_mobile_menu_exclusions', __( 'Page Exclusions', 'aha-mobile-menu' ), array( $this->fields, 'render_section_exclusions' ), 'aha-mobile-menu-exclusions' ); add_settings_field( 'aha_mobile_menu_excluded_pages', __( 'Excluded Pages/Posts', 'aha-mobile-menu' ), array( $this->fields, 'render_field_excluded_pages' ), 'aha-mobile-menu-exclusions', 'aha_mobile_menu_exclusions' ); add_settings_field( 'aha_mobile_menu_excluded_post_types', __( 'Excluded Post Types', 'aha-mobile-menu' ), array( $this->fields, 'render_field_excluded_post_types' ), 'aha-mobile-menu-exclusions', 'aha_mobile_menu_exclusions' ); // Trigger / Menu icon (Tab: Menu icon) – shortcode for header (Elementor, Astra, etc.) add_settings_section( 'aha_mobile_menu_trigger', __( 'Menu trigger icon (shortcode)', 'aha-mobile-menu' ), array( $this->fields, 'render_section_trigger' ), 'aha-mobile-menu-trigger' ); add_settings_field( 'aha_mobile_menu_trigger_icon_style', __( 'Icon style', 'aha-mobile-menu' ), array( $this->fields, 'render_field_trigger_icon_style' ), 'aha-mobile-menu-trigger', 'aha_mobile_menu_trigger' ); add_settings_field( 'aha_mobile_menu_trigger_icon_color', __( 'Icon color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_trigger_icon_color' ), 'aha-mobile-menu-trigger', 'aha_mobile_menu_trigger' ); add_settings_field( 'aha_mobile_menu_trigger_bg_color', __( 'Background color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_trigger_bg_color' ), 'aha-mobile-menu-trigger', 'aha_mobile_menu_trigger' ); add_settings_field( 'aha_mobile_menu_trigger_bg_opacity', __( 'Background opacity (%)', 'aha-mobile-menu' ), array( $this->fields, 'render_field_trigger_bg_opacity' ), 'aha-mobile-menu-trigger', 'aha_mobile_menu_trigger' ); add_settings_field( 'aha_mobile_menu_trigger_icon_size', __( 'Icon size (px)', 'aha-mobile-menu' ), array( $this->fields, 'render_field_trigger_icon_size' ), 'aha-mobile-menu-trigger', 'aha_mobile_menu_trigger' ); add_settings_field( 'aha_mobile_menu_trigger_padding', __( 'Padding (px)', 'aha-mobile-menu' ), array( $this->fields, 'render_field_trigger_padding' ), 'aha-mobile-menu-trigger', 'aha_mobile_menu_trigger' ); add_settings_field( 'aha_mobile_menu_trigger_position', __( 'Position', 'aha-mobile-menu' ), array( $this->fields, 'render_field_trigger_position' ), 'aha-mobile-menu-trigger', 'aha_mobile_menu_trigger' ); add_settings_field( 'aha_mobile_menu_trigger_top_right', __( 'Top & Right (when absolute)', 'aha-mobile-menu' ), array( $this->fields, 'render_field_trigger_top_right' ), 'aha-mobile-menu-trigger', 'aha_mobile_menu_trigger' ); add_settings_field( 'aha_mobile_menu_trigger_z_index', __( 'Z-index', 'aha-mobile-menu' ), array( $this->fields, 'render_field_trigger_z_index' ), 'aha-mobile-menu-trigger', 'aha_mobile_menu_trigger' ); add_settings_field( 'aha_mobile_menu_trigger_border', __( 'Border', 'aha-mobile-menu' ), array( $this->fields, 'render_field_trigger_border' ), 'aha-mobile-menu-trigger', 'aha_mobile_menu_trigger' ); add_settings_field( 'aha_mobile_menu_trigger_border_color', __( 'Border color', 'aha-mobile-menu' ), array( $this->fields, 'render_field_trigger_border_color' ), 'aha-mobile-menu-trigger', 'aha_mobile_menu_trigger' ); } /** * Sanitize settings * * @param array $input Input data. * @return array Sanitized data. */ public function sanitize_settings( $input ) { if ( ! is_array( $input ) ) { return array(); } // Get existing settings to merge with new values $existing = get_option( $this->option_name, array() ); $sanitized = array(); // List of checkbox fields that need special handling $checkbox_fields = array( 'enable', 'mobile_only', 'enable_search', 'close_on_click_outside', 'close_on_navigation', ); // Handle checkboxes - if not present in input, set to 0 foreach ( $checkbox_fields as $field ) { $sanitized[ $field ] = isset( $input[ $field ] ) && $input[ $field ] ? 1 : 0; } // Sanitize position if ( isset( $input['position'] ) ) { $sanitized['position'] = in_array( $input['position'], array( 'left', 'right' ), true ) ? $input['position'] : 'left'; } // Sanitize logo (attachment ID) if ( isset( $input['logo'] ) ) { $sanitized['logo'] = absint( $input['logo'] ); } // Sanitize menu (term ID) if ( isset( $input['menu'] ) ) { $sanitized['menu'] = absint( $input['menu'] ); } // Sanitize animation if ( isset( $input['animation'] ) ) { $allowed_animations = array( 'slide', 'fade' ); $sanitized['animation'] = in_array( $input['animation'], $allowed_animations, true ) ? $input['animation'] : 'slide'; } // Sanitize action buttons if ( isset( $input['action_button_1_text'] ) ) { $sanitized['action_button_1_text'] = sanitize_text_field( $input['action_button_1_text'] ); } if ( isset( $input['action_button_1_url'] ) ) { $sanitized['action_button_1_url'] = esc_url_raw( $input['action_button_1_url'] ); } if ( isset( $input['action_button_2_text'] ) ) { $sanitized['action_button_2_text'] = sanitize_text_field( $input['action_button_2_text'] ); } if ( isset( $input['action_button_2_url'] ) ) { $sanitized['action_button_2_url'] = esc_url_raw( $input['action_button_2_url'] ); } $icon_choices = array_keys( aha_mobile_menu_get_action_button_icons() ); if ( isset( $input['action_button_1_icon'] ) && in_array( $input['action_button_1_icon'], $icon_choices, true ) ) { $sanitized['action_button_1_icon'] = $input['action_button_1_icon']; } if ( isset( $input['action_button_1_icon_position'] ) && in_array( $input['action_button_1_icon_position'], array( 'before', 'after' ), true ) ) { $sanitized['action_button_1_icon_position'] = $input['action_button_1_icon_position']; } if ( isset( $input['action_button_2_icon'] ) && in_array( $input['action_button_2_icon'], $icon_choices, true ) ) { $sanitized['action_button_2_icon'] = $input['action_button_2_icon']; } if ( isset( $input['action_button_2_icon_position'] ) && in_array( $input['action_button_2_icon_position'], array( 'before', 'after' ), true ) ) { $sanitized['action_button_2_icon_position'] = $input['action_button_2_icon_position']; } // Sanitize colors $color_fields = array( 'bg_color', 'text_color', 'close_button_bg_color', 'close_button_icon_color', 'search_input_bg_color', 'search_input_border_color', 'search_input_text_color', 'search_icon_color', 'search_button_bg_color', 'menu_link_color', 'menu_link_active_color', 'menu_link_hover_color', 'social_bg_color', 'social_icon_color', 'action_button_1_bg_color', 'action_button_1_text_color', 'action_button_2_bg_color', 'action_button_2_text_color', ); foreach ( $color_fields as $field ) { if ( isset( $input[ $field ] ) ) { $sanitized[ $field ] = sanitize_hex_color( $input[ $field ] ); } } // Sanitize social links (empty list must clear saved links — no rows means key absent from POST). if ( ! empty( $input['social_links_present'] ) ) { $sanitized['social_links'] = array(); if ( isset( $input['social_links'] ) && is_array( $input['social_links'] ) ) { foreach ( $input['social_links'] as $link ) { if ( isset( $link['url'], $link['network'] ) && ! empty( $link['url'] ) && ! empty( $link['network'] ) ) { $sanitized['social_links'][] = array( 'url' => esc_url_raw( $link['url'] ), 'network' => sanitize_text_field( $link['network'] ), ); } } } } elseif ( isset( $existing['social_links'] ) ) { $sanitized['social_links'] = $existing['social_links']; } // Sanitize trigger classes if ( isset( $input['trigger_classes'] ) ) { if ( is_string( $input['trigger_classes'] ) ) { $trigger_classes = array_filter( array_map( 'trim', explode( "\n", $input['trigger_classes'] ) ) ); $sanitized['trigger_classes'] = array_map( 'sanitize_text_field', $trigger_classes ); } elseif ( is_array( $input['trigger_classes'] ) ) { $sanitized['trigger_classes'] = array_map( 'sanitize_text_field', $input['trigger_classes'] ); } else { $sanitized['trigger_classes'] = array(); } } // Trigger icon (shortcode) if ( isset( $input['trigger_icon_style'] ) ) { $allowed = array( 'hamburger', 'hamburger-highlight', 'kebab', 'kebab-thick' ); $sanitized['trigger_icon_style'] = in_array( $input['trigger_icon_style'], $allowed, true ) ? $input['trigger_icon_style'] : 'hamburger'; } if ( isset( $input['trigger_icon_color'] ) && is_string( $input['trigger_icon_color'] ) ) { $sanitized['trigger_icon_color'] = sanitize_hex_color( $input['trigger_icon_color'] ) ?: '#374151'; } if ( isset( $input['trigger_bg_color'] ) && is_string( $input['trigger_bg_color'] ) ) { $sanitized['trigger_bg_color'] = sanitize_hex_color( $input['trigger_bg_color'] ) ?: '#ffffff'; } if ( isset( $input['trigger_icon_size'] ) ) { $sz = absint( $input['trigger_icon_size'] ); $sanitized['trigger_icon_size'] = $sz >= 24 && $sz <= 64 ? $sz : 40; } if ( array_key_exists( 'trigger_padding', $input ) ) { $sanitized['trigger_padding'] = ( '' === $input['trigger_padding'] || ! is_numeric( $input['trigger_padding'] ) ) ? '' : max( 0, min( 30, absint( $input['trigger_padding'] ) ) ); } if ( isset( $input['trigger_position'] ) ) { $sanitized['trigger_position'] = in_array( $input['trigger_position'], array( 'relative', 'absolute' ), true ) ? $input['trigger_position'] : 'relative'; } if ( array_key_exists( 'trigger_top', $input ) ) { $sanitized['trigger_top'] = ( '' === $input['trigger_top'] || ! is_numeric( $input['trigger_top'] ) ) ? '' : (int) $input['trigger_top']; } if ( array_key_exists( 'trigger_right', $input ) ) { $sanitized['trigger_right'] = ( '' === $input['trigger_right'] || ! is_numeric( $input['trigger_right'] ) ) ? '' : (int) $input['trigger_right']; } if ( array_key_exists( 'trigger_z_index', $input ) ) { $sanitized['trigger_z_index'] = ( '' === $input['trigger_z_index'] || ! is_numeric( $input['trigger_z_index'] ) ) ? '' : (int) $input['trigger_z_index']; } $sanitized['trigger_border'] = ! empty( $input['trigger_border'] ) ? 1 : 0; if ( isset( $input['trigger_border_color'] ) && is_string( $input['trigger_border_color'] ) ) { $sanitized['trigger_border_color'] = sanitize_hex_color( $input['trigger_border_color'] ) ?: '#e5e7eb'; } if ( isset( $input['trigger_bg_opacity'] ) ) { $op = absint( $input['trigger_bg_opacity'] ); $sanitized['trigger_bg_opacity'] = $op <= 100 ? $op : 100; } // Sanitize excluded pages if ( isset( $input['excluded_pages'] ) ) { if ( is_string( $input['excluded_pages'] ) ) { $excluded = array_filter( array_map( 'trim', explode( "\n", $input['excluded_pages'] ) ) ); $sanitized['excluded_pages'] = array_map( 'intval', array_filter( $excluded, 'is_numeric' ) ); } elseif ( is_array( $input['excluded_pages'] ) ) { $sanitized['excluded_pages'] = array_map( 'intval', array_filter( $input['excluded_pages'], 'is_numeric' ) ); } else { $sanitized['excluded_pages'] = array(); } } // Sanitize excluded post types // Always set this field, even if not in input (to handle unchecked checkboxes) $sanitized['excluded_post_types'] = array(); if ( isset( $input['excluded_post_types'] ) && is_array( $input['excluded_post_types'] ) && ! empty( $input['excluded_post_types'] ) ) { $all_post_types = $this->get_all_post_types(); foreach ( $input['excluded_post_types'] as $post_type ) { $post_type = sanitize_text_field( $post_type ); if ( isset( $all_post_types[ $post_type ] ) ) { $sanitized['excluded_post_types'][] = $post_type; } } } // Merge with existing settings to preserve fields not in the form return array_merge( $existing, $sanitized ); } /** * Get settings * * @return array */ public function get_settings() { $defaults = array( 'enable' => 1, 'position' => 'left', 'mobile_only' => 1, 'logo' => '', 'menu' => 0, 'enable_search' => 1, 'social_links' => array(), 'action_button_1_text' => '', 'action_button_1_url' => '', 'action_button_1_icon' => '', 'action_button_1_icon_position' => 'before', 'action_button_2_text' => '', 'action_button_2_url' => '', 'action_button_2_icon' => '', 'action_button_2_icon_position' => 'before', 'bg_color' => '#ffffff', 'text_color' => '#000000', 'close_button_bg_color' => '#ededed', 'close_button_icon_color' => '#31322e', 'search_input_bg_color' => '', 'search_input_border_color' => '', 'search_input_text_color' => '', 'search_icon_color' => '', 'search_button_bg_color' => '', 'menu_link_color' => '', 'menu_link_active_color' => '', 'menu_link_hover_color' => '', 'social_bg_color' => '', 'social_icon_color' => '', 'action_button_1_bg_color' => '', 'action_button_1_text_color' => '', 'action_button_2_bg_color' => '', 'action_button_2_text_color' => '', 'animation' => 'slide', 'close_on_click_outside' => 1, 'close_on_navigation' => 1, 'trigger_classes' => array(), 'trigger_icon_style' => 'hamburger', 'trigger_icon_color' => '#374151', 'trigger_bg_color' => '#ffffff', 'trigger_icon_size' => 40, 'trigger_padding' => '', 'trigger_position' => 'relative', 'trigger_top' => '', 'trigger_right' => '', 'trigger_z_index' => '', 'trigger_border' => 0, 'trigger_border_color' => '#e5e7eb', 'trigger_bg_opacity' => 100, 'excluded_pages' => array(), 'excluded_post_types' => array(), ); $settings = get_option( $this->option_name, array() ); $settings = wp_parse_args( $settings, $defaults ); // Process excluded_pages - convert string to array if needed if ( isset( $settings['excluded_pages'] ) && is_string( $settings['excluded_pages'] ) ) { $excluded = array_filter( array_map( 'trim', explode( "\n", $settings['excluded_pages'] ) ) ); $settings['excluded_pages'] = array_map( 'intval', array_filter( $excluded, 'is_numeric' ) ); } elseif ( ! isset( $settings['excluded_pages'] ) || ! is_array( $settings['excluded_pages'] ) ) { $settings['excluded_pages'] = array(); } return $settings; } /** * Enqueue admin assets * * @param string $hook Hook name. */ public function enqueue_admin_assets( $hook ) { if ( 'toplevel_page_aha-mobile-menu' !== $hook ) { return; } wp_enqueue_style( 'wp-color-picker' ); wp_enqueue_script( 'wp-color-picker' ); wp_enqueue_media(); wp_enqueue_script( 'aha-mobile-menu-admin', AHA_MOBILE_MENU_URL . 'assets/js/admin.js', array( 'jquery', 'wp-color-picker' ), AHA_MOBILE_MENU_VERSION, true ); wp_enqueue_style( 'aha-mobile-menu-admin', AHA_MOBILE_MENU_URL . 'assets/css/admin.css', array(), AHA_MOBILE_MENU_VERSION ); } /** * Persist dismissal of the WordPress.org review notice (per user). * * @since 1.0.1 */ public function maybe_dismiss_review_notice() { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Nonce verified below. if ( empty( $_GET['aha_mm_dismiss_review'] ) || empty( $_GET['_wpnonce'] ) ) { return; } if ( ! current_user_can( 'manage_options' ) ) { return; } if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['_wpnonce'] ) ), 'aha_mm_dismiss_review' ) ) { return; } update_user_meta( get_current_user_id(), 'aha_mobile_menu_dismiss_review_notice', '1' ); wp_safe_redirect( admin_url( 'admin.php?page=aha-mobile-menu' ) ); exit; } /** * Dismissible notice encouraging a WordPress.org plugin review. * * @since 1.0.1 */ public function render_review_notice() { if ( ! current_user_can( 'manage_options' ) ) { return; } $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null; if ( ! $screen || 'toplevel_page_aha-mobile-menu' !== $screen->id ) { return; } if ( get_user_meta( get_current_user_id(), 'aha_mobile_menu_dismiss_review_notice', true ) ) { return; } $dismiss_url = wp_nonce_url( add_query_arg( 'aha_mm_dismiss_review', '1' ), 'aha_mm_dismiss_review', '_wpnonce' ); $review_url = defined( 'AHA_MOBILE_MENU_WP_ORG_REVIEW_URL' ) ? AHA_MOBILE_MENU_WP_ORG_REVIEW_URL : 'https://wordpress.org/support/plugin/aha-mobile-menu/reviews/#new-post'; ?>
__( 'General', 'aha-mobile-menu' ), 'content' => __( 'Content', 'aha-mobile-menu' ), 'appearance' => __( 'Appearance', 'aha-mobile-menu' ), 'exclusions' => __( 'Exclusions', 'aha-mobile-menu' ), 'trigger' => __( 'Menu icon', 'aha-mobile-menu' ), ); /** * Filter settings tabs (allows Pro to add e.g. License tab). * * @param array $tabs Associative array of tab_slug => label. */ $tabs = apply_filters( 'aha_mobile_menu_settings_tabs', $tabs ); if ( ! array_key_exists( $active_tab, $tabs ) ) { $active_tab = 'general'; } ?>' . esc_html__( 'Settings saved.', 'aha-mobile-menu' ) . '