option_name = $option_name; } public static function instance( string $option_name ) : Settings { if ( null === self::$instance ) { self::$instance = new self( $option_name ); } return self::$instance; } public function init() : void { add_action( 'admin_menu', array( $this, 'register_menu' ) ); add_action( 'admin_init', array( $this, 'register_settings' ) ); } public function register_menu() : void { add_options_page( __( 'Admin Management Toolkit', 'adminforge-admin-management-toolkit' ), __( 'Admin Management Toolkit', 'adminforge-admin-management-toolkit' ), 'manage_options', 'afamt', array( $this, 'render_page' ) ); } public function register_settings() : void { register_setting( 'afamt', $this->option_name, array( 'type' => 'array', 'sanitize_callback' => array( $this, 'sanitize' ), 'default' => array(), ) ); } private function get_roles() : array { global $wp_roles; if ( ! $wp_roles ) { $wp_roles = wp_roles(); } return (array) $wp_roles->roles; } private function current_menu_slugs() : array { // Must be called after core/admin menus are built. global $menu; $out = array(); if ( ! is_array( $menu ) ) { return $out; } foreach ( $menu as $item ) { // $item[2] is the slug. if ( isset( $item[2] ) && is_string( $item[2] ) && '' !== $item[2] ) { $out[] = $item[2]; } } $out = array_values( array_unique( $out ) ); sort( $out ); return $out; } public function sanitize( $raw ) : array { $raw = is_array( $raw ) ? $raw : array(); $clean = get_option( $this->option_name, array() ); $clean = is_array( $clean ) ? $clean : array(); $roles = array_keys( $this->get_roles() ); // Menu control. $clean['menu_hidden'] = array(); if ( isset( $raw['menu_hidden'] ) && is_array( $raw['menu_hidden'] ) ) { foreach ( $raw['menu_hidden'] as $role => $slugs ) { if ( ! in_array( $role, $roles, true ) ) { continue; } $slugs = is_array( $slugs ) ? $slugs : array(); $slugs = array_map( 'sanitize_text_field', $slugs ); $slugs = array_values( array_filter( array_unique( $slugs ) ) ); $clean['menu_hidden'][ $role ] = $slugs; } } // Dashboard widgets. $clean['dashboard_widgets_hidden'] = array(); if ( isset( $raw['dashboard_widgets_hidden'] ) && is_array( $raw['dashboard_widgets_hidden'] ) ) { foreach ( $raw['dashboard_widgets_hidden'] as $role => $ids ) { if ( ! in_array( $role, $roles, true ) ) { continue; } $ids = is_array( $ids ) ? $ids : array(); $ids = array_map( 'sanitize_text_field', $ids ); $ids = array_values( array_filter( array_unique( $ids ) ) ); $clean['dashboard_widgets_hidden'][ $role ] = $ids; } } // UI. $clean['ui'] = isset( $clean['ui'] ) && is_array( $clean['ui'] ) ? $clean['ui'] : array(); $clean['ui']['custom_footer_text'] = isset( $raw['ui']['custom_footer_text'] ) ? wp_kses_post( $raw['ui']['custom_footer_text'] ) : ''; $clean['ui']['hide_admin_bar'] = array(); if ( isset( $raw['ui']['hide_admin_bar'] ) && is_array( $raw['ui']['hide_admin_bar'] ) ) { foreach ( $raw['ui']['hide_admin_bar'] as $role => $on ) { if ( ! in_array( $role, $roles, true ) ) { continue; } $clean['ui']['hide_admin_bar'][ $role ] = (bool) $on; } } return $clean; } public function render_page() : void { if ( ! current_user_can( 'manage_options' ) ) { return; } $options = get_option( $this->option_name, array() ); $options = is_array( $options ) ? $options : array(); $roles = $this->get_roles(); $menu_slugs = $this->current_menu_slugs(); $tab = isset( $_GET['tab'] ) ? sanitize_key( $_GET['tab'] ) : 'menu'; $tabs = array( 'menu' => __( 'Admin menu control', 'adminforge-admin-management-toolkit' ), 'dashboard' => __( 'Dashboard widgets', 'adminforge-admin-management-toolkit' ), 'ui' => __( 'Admin UI customization', 'adminforge-admin-management-toolkit' ), ); if ( ! isset( $tabs[ $tab ] ) ) { $tab = 'menu'; } echo '
'; echo '

' . esc_html__( 'Admin Management Toolkit', 'adminforge-admin-management-toolkit' ) . '

'; echo ''; echo '
'; settings_fields( 'afamt' ); switch ( $tab ) { case 'dashboard': $this->render_dashboard_tab( $roles, $options ); break; case 'ui': $this->render_ui_tab( $roles, $options ); break; case 'menu': default: $this->render_menu_tab( $roles, $menu_slugs, $options ); break; } submit_button(); echo '
'; echo '
'; } private function render_menu_tab( array $roles, array $menu_slugs, array $options ) : void { echo '

' . esc_html__( 'Hide admin menu items per role. This is applied for users who have that role.', 'adminforge-admin-management-toolkit' ) . '

'; echo ''; echo ''; echo ''; foreach ( $roles as $role_key => $role_data ) { $hidden = isset( $options['menu_hidden'][ $role_key ] ) && is_array( $options['menu_hidden'][ $role_key ] ) ? $options['menu_hidden'][ $role_key ] : array(); echo ''; echo ''; echo ''; echo ''; } echo '
' . esc_html__( 'Role', 'adminforge-admin-management-toolkit' ) . '' . esc_html__( 'Hidden menu slugs', 'adminforge-admin-management-toolkit' ) . '
' . esc_html( $role_data['name'] ) . '
' . esc_html( $role_key ) . '
'; echo '
'; foreach ( $menu_slugs as $slug ) { $checked = in_array( $slug, $hidden, true ); echo ''; } echo '
'; echo '

' . esc_html__( 'Tip: if a plugin menu isn’t listed yet, visit any admin page once, then reload this tab.', 'adminforge-admin-management-toolkit' ) . '

'; echo '
'; } private function render_dashboard_tab( array $roles, array $options ) : void { $widgets = array( 'dashboard_site_health' => __( 'Site Health Status', 'adminforge-admin-management-toolkit' ), 'dashboard_right_now' => __( 'At a Glance', 'adminforge-admin-management-toolkit' ), 'dashboard_activity' => __( 'Activity', 'adminforge-admin-management-toolkit' ), 'dashboard_quick_press' => __( 'Quick Draft', 'adminforge-admin-management-toolkit' ), 'dashboard_primary' => __( 'WordPress Events and News', 'adminforge-admin-management-toolkit' ), 'dashboard_recent_drafts'=> __( 'Recent Drafts', 'adminforge-admin-management-toolkit' ), ); echo '

' . esc_html__( 'Disable built-in dashboard widgets per role.', 'adminforge-admin-management-toolkit' ) . '

'; echo ''; echo ''; echo ''; foreach ( $roles as $role_key => $role_data ) { $hidden = isset( $options['dashboard_widgets_hidden'][ $role_key ] ) && is_array( $options['dashboard_widgets_hidden'][ $role_key ] ) ? $options['dashboard_widgets_hidden'][ $role_key ] : array(); echo ''; echo ''; echo ''; echo ''; } echo '
' . esc_html__( 'Role', 'adminforge-admin-management-toolkit' ) . '' . esc_html__( 'Hidden dashboard widgets', 'adminforge-admin-management-toolkit' ) . '
' . esc_html( $role_data['name'] ) . '
' . esc_html( $role_key ) . '
'; foreach ( $widgets as $id => $label ) { $checked = in_array( $id, $hidden, true ); echo ''; } echo '

' . esc_html__( 'Note: plugin-added widgets may still appear; this tab focuses on core widgets.', 'adminforge-admin-management-toolkit' ) . '

'; echo '
'; } private function render_ui_tab( array $roles, array $options ) : void { $ui = isset( $options['ui'] ) && is_array( $options['ui'] ) ? $options['ui'] : array(); $footer = isset( $ui['custom_footer_text'] ) ? (string) $ui['custom_footer_text'] : ''; $hide_admin_bar = isset( $ui['hide_admin_bar'] ) && is_array( $ui['hide_admin_bar'] ) ? $ui['hide_admin_bar'] : array(); echo '

' . esc_html__( 'Small admin UI customizations.', 'adminforge-admin-management-toolkit' ) . '

'; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo '

' . esc_html__( 'Admin bar (front-end)', 'adminforge-admin-management-toolkit' ) . '

'; echo '

' . esc_html__( 'Hide the front-end admin bar for selected roles.', 'adminforge-admin-management-toolkit' ) . '

'; echo '
'; foreach ( $roles as $role_key => $role_data ) { $checked = ! empty( $hide_admin_bar[ $role_key ] ); echo ''; } echo '
'; } }