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 '
' . esc_html__( 'Hide admin menu items per role. This is applied for users who have that role.', 'adminforge-admin-management-toolkit' ) . '
'; 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 '';
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 ' | ';
echo '
' . esc_html__( 'Disable built-in dashboard widgets per role.', 'adminforge-admin-management-toolkit' ) . '
'; 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 ) . ' | ';
echo '';
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 ' | ';
echo '
' . esc_html__( 'Small admin UI customizations.', 'adminforge-admin-management-toolkit' ) . '
'; echo '| '; echo ' | ';
echo '';
echo ' ' . esc_html__( 'Supports basic HTML. Leave empty to keep the default footer.', 'adminforge-admin-management-toolkit' ) . ' '; echo ' | ';
echo '
|---|
' . esc_html__( 'Hide the front-end admin bar for selected roles.', 'adminforge-admin-management-toolkit' ) . '
'; echo '