WordPress Dashboard Navigation: The Complete Admin Guide (2026)

WordPress Dashboard Navigation: The Complete Admin Guide (2026)

Last verified: October 16, 2026
24 min read
Guide
500+ WP projects

#How to set up the WordPress dashboard for clients

Opening wp-admin on a fresh install is like walking into a cockpit where half the buttons trigger an ejection seat. For developers, this is clutter. For clients, it’s anxiety.

A professional WordPress setup isn’t just about the theme; it’s about the backend experience. This guide walks through the dashboard as WordPress 7.1 ships it, then shows the code I use to trim it for client accounts. Every function and hook below exists in WordPress core and links back to the developer reference where it matters.

#1. What is in the WordPress dashboard menu

#1.1 Default widgets on the dashboard home screen

When you first log into WordPress (yoursite.com/wp-admin), you’re greeted by the Dashboard. This is your command center, but it’s often cluttered with widgets you’ll never use.

Default Dashboard Widgets (with the IDs core registers in wp_dashboard_setup()):

  • Welcome Panel: Quick links for getting started (not a widget, but a panel hooked to the welcome_panel action)
  • At a Glance (dashboard_right_now): Post and page counts, theme info
  • Activity (dashboard_activity): Recently published posts and recent comments
  • Quick Draft (dashboard_quick_press): Fast way to create a draft post
  • WordPress Events and News (dashboard_primary): Upcoming WordCamps and news
  • Site Health Status (dashboard_site_health): Security and performance notices

#1.2 What each admin sidebar menu item is for

The left sidebar is your main navigation menu. Understanding each section is crucial:

Posts: Dynamic content with dates, categories, and tags. Use for: news, articles, updates, blog entries.

Media: Your file library. Images, PDFs, videos, audio files. WordPress organizes by upload date by default.

Pages: Static, hierarchical content. Use for: About, Contact, Services, Privacy Policy.

Comments: Manage all site comments. Moderation, spam checking, replies.

Appearance: Themes, plus either the Site Editor (block themes) or menus, widgets and the Customizer (classic themes).

Plugins: Install, activate, deactivate, and configure plugins.

Users: Manage user accounts, roles, and profiles.

Tools: Import, export, Site Health, and the export and erase personal data screens.

Settings: Core WordPress configuration. General, writing, reading, discussion, media, permalinks.

#1.3 What is the difference between posts and pages

Stop explaining “chronological vs static.” It confuses people. Use this analogy:

  • Pages are your House. (Home, About, Contact). They rarely move.
  • Posts are your Newspaper. (News, Articles, Updates). A new one comes out every week.

Technical Differences:

FeaturePostsPages
Date-based archivesYesNo
CategoriesYesNo
TagsYesNo
RSS FeedIncludedExcluded
HierarchicalNoYes (parent/child)
Template selectionYes, if the theme provides post templatesYes

Template selection for posts arrived in WordPress 4.7, when post type templates stopped being page-only.

#2. How to use screen options in WordPress

The most powerful button in WordPress is hidden in the top right corner: Screen Options.

#2.1 How to hide columns in the All Posts list

Before you hand over a site, go to Posts > All Posts and uncheck:

  • Comments (if disabled globally)
  • Tags (if you only use Categories)
  • Author (if it’s a single-author blog)

This reduces cognitive load. Your client doesn’t need to see columns they will never use. The same panel holds Number of items per page, which sets how many rows the list loads.

#2.2 Screen options in the post editor

In the classic editor, Screen Options reveals:

  • Categories
  • Tags
  • Featured Image
  • Excerpt
  • Trackbacks
  • Custom Fields
  • Discussion
  • Slug
  • Author

In the block editor the button does not exist. The same panels are switched on and off in the editor’s Preferences dialog.

Pro Tip: Enable “Custom Fields” only for editors who need it. It exposes raw post meta, which is useful for advanced content management and confusing for everyone else.

#2.3 Screen options in the page editor

Similar to posts, but includes:

  • Page Attributes: Parent page, template selection, order
  • Featured Image
  • Custom Fields
  • Discussion
  • Slug
  • Author

#3. How to customize the WordPress admin dashboard

#3.1 How to remove default dashboard widgets

By default, the main Dashboard (/wp-admin/index.php) is a graveyard of useless widgets: “WordPress Events and News”, “Quick Draft”, “Welcome”.

Don’t just minimize them. Remove them via code. The widgets go through remove_meta_box() on the wp_dashboard_setup action. The Welcome panel is not a meta box, so it needs remove_action() on its own hook:

function wppoland_clean_dashboard() {
    remove_meta_box('dashboard_primary', 'dashboard', 'side');      // WordPress Events and News
    remove_meta_box('dashboard_quick_press', 'dashboard', 'side');  // Quick Draft
    remove_meta_box('dashboard_activity', 'dashboard', 'normal');   // Activity
}
add_action('wp_dashboard_setup', 'wppoland_clean_dashboard');

// The Welcome panel is printed by wp_welcome_panel() on the welcome_panel action.
// Core adds that action in wp-admin/includes/admin-filters.php, so remove it on admin_init.
add_action('admin_init', function () {
    remove_action('welcome_panel', 'wp_welcome_panel');
});

#3.2 Adding custom dashboard widgets

Replace default widgets with useful client information using wp_add_dashboard_widget():

function wppoland_add_custom_dashboard_widget() {
    wp_add_dashboard_widget(
        'wppoland_client_widget',
        'Welcome to Your Website',
        'wppoland_client_widget_content'
    );
}
add_action('wp_dashboard_setup', 'wppoland_add_custom_dashboard_widget');

function wppoland_client_widget_content() {
    echo '<p>Welcome! Need help? Contact support at [email protected]</p>';
    echo '<p>Documentation: <a href="https://docs.example.com">View Guides</a></p>';
}

#3.3 How to add a custom admin color scheme

WordPress 7.1 registers nine admin color schemes in register_admin_color_schemes(). Users pick one under Users > Profile:

  • Default
  • Fresh
  • Light
  • Blue
  • Midnight
  • Sunrise
  • Ectoplasm
  • Ocean
  • Coffee

Custom Color Scheme via Code with wp_admin_css_color():

function wppoland_custom_admin_colors() {
    wp_admin_css_color(
        'wppoland',
        'WPPoland Brand',
        get_stylesheet_directory_uri() . '/admin-colors.css',
        ['#1e1e1e', '#ff6b6b', '#4ecdc4', '#ffe66d']
    );
}
add_action('admin_init', 'wppoland_custom_admin_colors');

#4. Hide WordPress admin menu items by user role

Different user roles see different dashboard sections. Understanding this is crucial for client sites.

#4.1 Which admin menus each user role sees

Core decides this in wp-admin/menu.php by capability, not by role name. With the default roles and capabilities:

Administrator: Full access to all menu items Editor: Dashboard, Posts, Media, Pages, Comments, Profile, Tools Author: Dashboard, Posts, Media, Comments, Profile, Tools Contributor: Dashboard, Posts (add/edit own, but not publish), Comments, Profile, Tools Subscriber: Dashboard, Profile

Tools shows up for every role with edit_posts, because the top-level item requires exactly that capability. What sits inside it (Import, Export, Site Health) has its own, stricter checks.

#4.2 How to hide admin menu items from non-admins

If your client isn’t supposed to touch “Tools” or “Settings,” hide them. While you can use plugins like Admin Menu Editor, a simple snippet is safer and lighter:

add_action('admin_menu', function() {
    if (!current_user_can('manage_options')) {
        remove_menu_page('tools.php');
        remove_menu_page('options-general.php');
    }
});

Hiding is not access control. remove_menu_page() only unsets the entry from the global $menu array, as its source in the reference shows. The screen’s own capability check is unchanged, so a user who has the capability can still open it by URL. If a role must not reach a screen, remove the capability from the role.

#4.3 Hiding specific submenu items

function wppoland_hide_submenu_items() {
    if (!current_user_can('manage_options')) {
        remove_submenu_page('themes.php', 'themes.php');    // Theme selection
        remove_submenu_page('themes.php', 'customize.php'); // Customizer
    }
}
add_action('admin_menu', 'wppoland_hide_submenu_items', 999);

The file editors are better switched off with a constant, see section 7.1.

#5. How to add and remove WordPress metaboxes

#5.1 What are metaboxes in WordPress

Metaboxes are the content boxes in post/page editors:

  • Publish: Save, preview, schedule, visibility
  • Format: Post format selection
  • Categories: Taxonomy assignment
  • Tags: Tag management
  • Featured Image: Post thumbnail
  • Excerpt: Manual excerpt entry

#5.2 How to reorder metaboxes

Users can drag and drop metaboxes to customize their workflow. WordPress remembers these positions per user, in user meta keyed by screen (meta-box-order_post, closedpostboxes_post, metaboxhidden_post).

#5.3 Programmatically removing metaboxes

function wppoland_remove_post_metaboxes() {
    remove_meta_box('postcustom', 'post', 'normal');       // Custom fields
    remove_meta_box('trackbacksdiv', 'post', 'normal');    // Trackbacks
    remove_meta_box('commentstatusdiv', 'post', 'normal'); // Discussion
    remove_meta_box('commentsdiv', 'post', 'normal');      // Comments
    remove_meta_box('slugdiv', 'post', 'normal');          // Slug
    remove_meta_box('authordiv', 'post', 'normal');        // Author
}
add_action('add_meta_boxes', 'wppoland_remove_post_metaboxes', 99);

These IDs belong to the classic editor screen. In the block editor, most of the same settings live in the sidebar panels, and plugin metaboxes appear below the content area.

#5.4 Adding custom metaboxes

function wppoland_add_custom_metabox() {
    add_meta_box(
        'wppoland_custom_metabox',
        'Additional Information',
        'wppoland_render_custom_metabox',
        'post',
        'side',
        'default'
    );
}
add_action('add_meta_boxes', 'wppoland_add_custom_metabox');

function wppoland_render_custom_metabox($post) {
    wp_nonce_field('wppoland_save_metabox', 'wppoland_metabox_nonce');
    $value = get_post_meta($post->ID, '_wppoland_custom_field', true);
    echo '<label for="wppoland_custom_field">Custom Field:</label>';
    echo '<input type="text" id="wppoland_custom_field" name="wppoland_custom_field" value="' . esc_attr($value) . '" style="width:100%">';
}

function wppoland_save_custom_metabox($post_id) {
    if (!isset($_POST['wppoland_metabox_nonce'])
        || !wp_verify_nonce($_POST['wppoland_metabox_nonce'], 'wppoland_save_metabox')
        || !current_user_can('edit_post', $post_id)) {
        return;
    }
    if (isset($_POST['wppoland_custom_field'])) {
        update_post_meta($post_id, '_wppoland_custom_field', sanitize_text_field(wp_unslash($_POST['wppoland_custom_field'])));
    }
}
add_action('save_post', 'wppoland_save_custom_metabox');

The nonce printed in the metabox is only useful if the save handler checks it, together with the user’s right to edit that post.

#6. Reorder and rename WordPress admin menu items

#6.1 Reordering menu items

function wppoland_custom_menu_order($menu_order) {
    if (!$menu_order) return true;

    return [
        'index.php', // Dashboard
        'edit.php', // Posts
        'edit.php?post_type=page', // Pages
        'upload.php', // Media
        'separator1',
        'themes.php', // Appearance
        'plugins.php', // Plugins
        'users.php', // Users
        'tools.php', // Tools
        'options-general.php', // Settings
    ];
}
add_filter('custom_menu_order', '__return_true');
add_filter('menu_order', 'wppoland_custom_menu_order');

#6.2 Renaming menu items

function wppoland_rename_menus() {
    global $menu;

    $menu[5][0] = 'Articles'; // Rename Posts to Articles
    $menu[10][0] = 'Files'; // Rename Media to Files
}
add_action('admin_menu', 'wppoland_rename_menus', 999);

Positions 5 (Posts) and 10 (Media) are the slots core assigns in wp-admin/menu.php. A plugin that registers its own menu at the same position can shift them, so check the result after each plugin install.

#6.3 Adding custom menu items

function wppoland_add_custom_menu() {
    add_menu_page(
        'Client Documentation',
        'Documentation',
        'read',
        'client-docs',
        'wppoland_render_docs_page',
        'dashicons-book',
        3
    );
}
add_action('admin_menu', 'wppoland_add_custom_menu');

function wppoland_render_docs_page() {
    echo '<div class="wrap"><h1>Client Documentation</h1>';
    echo '<p>Welcome to your website documentation...</p></div>';
}

#6.4 Custom icons for menu items

WordPress includes Dashicons by default. Use them or custom SVGs:

// Using Dashicons
add_menu_page('Custom Page', 'Custom', 'read', 'custom-page', 'callback', 'dashicons-star-filled');

// Using custom SVG
function wppoland_custom_admin_icon() {
    echo '<style>
        #toplevel_page_custom-page .wp-menu-image:before {
            content: "";
            background-image: url("' . esc_url(get_stylesheet_directory_uri() . '/icon.svg') . '");
            background-size: contain;
            background-repeat: no-repeat;
            width: 20px;
            height: 20px;
            display: inline-block;
        }
    </style>';
}
add_action('admin_head', 'wppoland_custom_admin_icon');

add_menu_page() also accepts a base64-encoded SVG data URI as the icon argument, which avoids the extra CSS.

#7. How to restrict the WordPress dashboard for clients

#7.1 How to hide the theme and plugin editors from clients

Unhooking the editor menu entries does not work from admin_init, because admin_menu has already fired by then. The documented switch is a constant in wp-config.php, described in the wp-config.php reference:

// wp-config.php
define('DISALLOW_FILE_EDIT', true);   // removes the theme and plugin file editors for everyone

// Stricter: also blocks installing, updating and deleting plugins and themes from the admin
// define('DISALLOW_FILE_MODS', true);

DISALLOW_FILE_EDIT maps the edit_themes, edit_plugins and edit_files capabilities to do_not_allow, so even administrators lose the editors. DISALLOW_FILE_MODS goes further and switches off updates from the dashboard too, which only makes sense when updates ship through deployments or WP-CLI.

To hide the core update notice from non-admins, unhook it from admin_notices, where core adds it at priority 3:

add_action('admin_init', function () {
    if (!current_user_can('update_core')) {
        remove_action('admin_notices', 'update_nag', 3);
    }
});

#7.2 Custom login redirect

Redirect clients to a specific page after login:

function wppoland_login_redirect($redirect_to, $request, $user) {
    if (isset($user->roles) && is_array($user->roles)) {
        if (in_array('editor', $user->roles)) {
            return admin_url('edit.php');
        } elseif (in_array('author', $user->roles)) {
            return admin_url('post-new.php');
        }
    }
    return $redirect_to;
}
add_filter('login_redirect', 'wppoland_login_redirect', 10, 3);

Replace “Thank you for creating with WordPress” with your branding. admin_footer_text is a filter, so the callback returns the string instead of printing it:

function wppoland_custom_admin_footer($text) {
    return '<span id="footer-thankyou">Need help? Contact us at [email protected]</span>';
}
add_filter('admin_footer_text', 'wppoland_custom_admin_footer');
function wppoland_remove_wp_version() {
    remove_filter('update_footer', 'core_update_footer');
}
add_action('admin_menu', 'wppoland_remove_wp_version');

#8. Disable or customize the Gutenberg block editor

#8.1 The Appearance menu in block themes (FSE)

In block themes, the Appearance menu changes significantly. In WordPress 7.1 it shows:

  • Themes: Theme selection
  • Editor: The Site Editor, where navigation, styles, pages, templates and reusable block patterns are edited
  • Fonts: The Font Library

The Customizer link only appears in a block theme when a plugin or the theme hooks into customize_register. Classic themes that support editor styles get a Design item instead of Editor, and the rest get Patterns.

#8.2 Disabling Block Editor for specific post types

function wppoland_disable_gutenberg($use_block_editor, $post_type) {
    if ($post_type === 'page') {
        return false; // Use classic editor for pages
    }
    return $use_block_editor;
}
add_filter('use_block_editor_for_post_type', 'wppoland_disable_gutenberg', 10, 2);

#8.3 How to load custom scripts in the block editor

function wppoland_enqueue_block_assets() {
    wp_enqueue_script(
        'wppoland-block-editor',
        get_stylesheet_directory_uri() . '/block-editor.js',
        ['wp-blocks', 'wp-dom-ready', 'wp-edit-post'],
        filemtime(get_stylesheet_directory() . '/block-editor.js')
    );
}
add_action('enqueue_block_editor_assets', 'wppoland_enqueue_block_assets');

#9. How to fix common WordPress dashboard problems

#9.1 White screen of death in wp-admin

  • Deactivate all plugins via FTP (rename /plugins folder)
  • Switch to default theme
  • Check PHP error logs
  • Increase memory limit

#9.2 Why menu items are missing in wp-admin

  • Check user role capabilities
  • Plugin conflicts
  • Custom code removing menus

#9.3 Why is the WordPress dashboard slow

  • No persistent object cache
  • Too many dashboard widgets that call external services
  • Plugin overhead
  • Database bloat

#9.4 Why screen options are not saving

Screen Options are stored per user in user meta: manage{screen}columnshidden for list columns, metaboxhidden_{screen} and closedpostboxes_{screen} for boxes. When they stop saving, check:

  • A plugin or cache layer interfering with the admin-ajax request that saves them
  • Object cache serving stale user meta
  • Plugin conflicts

#10. Advanced security hardening for the admin dashboard

Securing the WordPress admin dashboard is crucial for protecting your entire website. These measures sit on top of the basic hardening techniques.

#10.1 Two-factor authentication (2FA) for wp-admin

Two-factor authentication adds a second check after the password. WordPress core does not ship 2FA. The narrowest option is the Two Factor plugin, published under the WordPress.org account and listed in the plugin directory at version 0.17.0 (requires WordPress 7.0, tested up to 7.1.3 at the time of writing). It adds 2FA and nothing else, which fits a setup that avoids all-in-one security suites.

What it offers, according to its directory page:

  • Authenticator app (TOTP): codes from apps such as Google Authenticator, Authy or 1Password
  • Backup codes: ten one-time codes for emergencies
  • Email codes: one-time codes sent to the account email

Each user turns it on in their own profile, in the Two-Factor Options section. Administrators can configure it for other users and disable providers site-wide under Settings > Two-Factor. Ask every client user to generate backup codes on day one, because a lost phone otherwise means a support ticket. For the wider picture, see the WordPress multi-factor authentication guide.

#10.2 Restricting admin access by IP address

Limiting admin access to specific IP addresses prevents unauthorized access from unknown locations. A PHP guard has to skip AJAX requests, because front-end features call admin-ajax.php, which also counts as admin:

// Restrict wp-admin by IP
function wppoland_restrict_admin_by_ip() {
    if (wp_doing_ajax()) {
        return;
    }
    $allowed_ips = ['192.0.2.10', '203.0.113.50'];
    $user_ip     = $_SERVER['REMOTE_ADDR'] ?? '';

    if (!in_array($user_ip, $allowed_ips, true)) {
        wp_die(
            __('Access denied. Your IP address is not authorized.', 'wppoland'),
            __('Access Denied', 'wppoland'),
            ['response' => 403]
        );
    }
}
add_action('admin_init', 'wppoland_restrict_admin_by_ip');

Behind a proxy or CDN, REMOTE_ADDR holds the proxy’s address, so the check has to read the address the proxy forwards, and only from proxies you trust.

Using .htaccess for IP Restrictions (Apache 2.4 syntax, see the Apache access control guide):

# Restrict wp-login.php by IP
<Files wp-login.php>
    Require ip 192.0.2.10 203.0.113.50
</Files>

The older Order Deny,Allow directives belong to Apache 2.2 and only work in 2.4 through the compatibility module.

#10.3 How to change the WordPress login URL

Core has no setting for a custom login URL. The login_url filter changes the links WordPress prints, but wp-login.php still answers. Snippets that add a rewrite rule and call flush_rewrite_rules() on every init are a bad trade: the function reference calls flushing an expensive operation that should only run when necessary. Rate-limit wp-login.php at the server and add 2FA instead; that protects the login without hiding it.

#10.4 Security headers for wp-admin

Core already sends three headers on every admin request: X-Frame-Options: SAMEORIGIN and Content-Security-Policy: frame-ancestors 'self' from send_frame_options_header(), and Referrer-Policy: strict-origin-when-cross-origin from wp_admin_headers(). What is left to add is small:

function wppoland_admin_security_headers() {
    if (!headers_sent()) {
        header('X-Content-Type-Options: nosniff');
    }
}
add_action('admin_init', 'wppoland_admin_security_headers');

Skip X-XSS-Protection: MDN marks it as non-standard and warns that it can create XSS vulnerabilities in otherwise safe sites. A full Content Security Policy for wp-admin needs unsafe-inline, because core prints inline scripts, so it adds little there.

#11. Performance optimization for the admin dashboard

A slow admin dashboard affects productivity and user experience. These changes target the usual causes.

#11.1 How to defer heavy dashboard widgets

Dashboard widgets that call external services slow down the first screen after login. WordPress Events and News fetches from WordPress.org; plugin widgets often query their own APIs. Removing them is the fix:

function wppoland_optimize_dashboard_widgets() {
    // Remove WordPress Events and News (makes an external request)
    remove_meta_box('dashboard_primary', 'dashboard', 'side');

    // Remove Quick Draft (unnecessary for most clients)
    remove_meta_box('dashboard_quick_press', 'dashboard', 'side');

    // Only load Activity widget for users who need it
    if (!current_user_can('edit_posts')) {
        remove_meta_box('dashboard_activity', 'dashboard', 'normal');
    }
}
add_action('wp_dashboard_setup', 'wppoland_optimize_dashboard_widgets');

#11.2 Reducing database queries in admin

Do not change the main query of admin list screens: forcing fields => ids or no_found_rows breaks the posts table and its pagination. The safe lever is the number of rows per screen. Users set it in Screen Options; a site-wide cap uses the edit_posts_per_page filter:

add_filter('edit_posts_per_page', function ($per_page, $post_type) {
    return min($per_page, 50);
}, 10, 2);

#11.3 Object caching in the WordPress admin

define('WP_CACHE', true) does not enable object caching. It tells WordPress to load the advanced-cache.php page-cache drop-in. A persistent object cache is a different drop-in, wp-content/object-cache.php, provided by a Redis or Memcached backend; without it, WP_Object_Cache only lives for one request. Since WordPress 6.1, Tools > Site Health suggests a persistent object cache when the site looks large enough to benefit.

#11.4 How to dequeue unneeded admin scripts and styles

Since WordPress 6.4, emoji styles in the admin load through wp_enqueue_emoji_styles on admin_enqueue_scripts. If the site does not need emoji support in the admin:

// Core adds these in wp-admin/includes/admin-filters.php, so remove them on admin_init
add_action('admin_init', function () {
    remove_action('admin_print_scripts', 'print_emoji_detection_script');
    remove_action('admin_enqueue_scripts', 'wp_enqueue_emoji_styles');
});

Do not deregister core handles such as dashboard, media-editor or media-views on every admin screen. They power widget dragging and the media modal, and other screens depend on them.

#12. How to make the WordPress admin accessible

Creating an accessible admin interface ensures all users can manage their website effectively, regardless of physical abilities.

#12.1 Keyboard navigation in the WordPress admin

Core already prints two skip links at the top of every admin screen, “Skip to main content” and “Skip to toolbar”, so there is no need to add your own. Each user can also turn on Keyboard Shortcuts in their profile, which enables shortcuts for comment moderation. Custom admin pages should keep the visible focus outline core provides rather than removing it in their CSS.

#12.2 Screen reader support in the WordPress admin

Screen readers announce the page title first, so a clear <title> helps on every screen. The admin_title filter receives the full title and the screen title:

// Add descriptive titles to pages
function wppoland_admin_title($admin_title, $title) {
    return sprintf('%s | %s', $title, esc_html(get_bloginfo('name')));
}
add_filter('admin_title', 'wppoland_admin_title', 10, 2);

On custom admin pages, use real <label> elements for form fields and a single <h1> per screen, as core screens do.

#12.3 High contrast mode in the WordPress admin

Ensure the dashboard works with high contrast modes:

// Support forced colors mode
function wppoland_forced_colors_support() {
    echo '<style>
        @media (forced-colors: active) {
            .button, .button-primary, .button-secondary {
                border: 2px solid ButtonText;
            }
            .wp-core-ui .button-primary {
                background-color: Mark;
            }
            .metabox-holder .postbox {
                border: 1px solid CanvasText;
            }
        }

        /* Reduced motion preferences */
        @media (prefers-reduced-motion: reduce) {
            * {
                animation-duration: 0.01ms !important;
                animation-iteration-count: 1 !important;
                transition-duration: 0.01ms !important;
            }
        }
    </style>';
}
add_action('admin_head', 'wppoland_forced_colors_support');

#13. WordPress multisite network admin dashboard

WordPress Multisite introduces additional complexity to dashboard navigation and management.

#13.1 Difference between network admin and site admin

In Multisite installations, super admins get a separate Network Admin with its own menu:

Network Admin Menu Items:

  • Dashboard: Network-wide overview, with Updates as a submenu
  • Sites: Manage all sites in the network
  • Users: Network-wide user management
  • Themes: Network-wide theme activation
  • Plugins: Network-wide plugin management
  • Settings: Network configuration options

Site-Specific Admin: Individual site administrators only see their site’s dashboard with standard menu items. They cannot install plugins or themes; those capabilities stay with super admins.

#13.2 How to add items to the multisite network admin menu

Network Admin screens have their own hook, network_admin_menu, and the manage_network capability limits the page to super admins:

// Add custom network admin menu item
function wppoland_multisite_network_menu() {
    add_menu_page(
        __('Network Analytics', 'wppoland'),
        __('Analytics', 'wppoland'),
        'manage_network',
        'network-analytics',
        'wppoland_network_analytics_page',
        'dashicons-chart-bar',
        3
    );
}
add_action('network_admin_menu', 'wppoland_multisite_network_menu');

Super admins already reach the Network Admin from the “My Sites” menu in the toolbar, so there is no need to add a link to each site’s menu.

#13.3 Site-specific dashboard widgets in multisite

Create site-specific dashboard widgets in Multisite:

// Add site-specific dashboard widget
function wppoland_multisite_site_widget() {
    wp_add_dashboard_widget(
        'site_info_widget',
        sprintf(__('%s Site Information', 'wppoland'), esc_html(get_bloginfo('name'))),
        'wppoland_site_widget_content'
    );
}
add_action('wp_dashboard_setup', 'wppoland_multisite_site_widget');

function wppoland_site_widget_content() {
    $blog_details = get_blog_details(get_current_blog_id());
    echo '<table class="widefat striped">';
    echo '<tr><th>' . esc_html__('Domain', 'wppoland') . '</th><td>' . esc_html($blog_details->domain . $blog_details->path) . '</td></tr>';
    echo '<tr><th>' . esc_html__('Registered', 'wppoland') . '</th><td>' . esc_html($blog_details->registered) . '</td></tr>';
    echo '<tr><th>' . esc_html__('Last Updated', 'wppoland') . '</th><td>' . esc_html($blog_details->last_updated) . '</td></tr>';
    echo '</table>';
}

The domain field holds a host name without a scheme, so it is escaped as text, not as a URL.

#14. Organizing and documenting admin customization code

Dashboard code spread across a theme’s functions.php disappears the day the client switches themes. Keep it somewhere that survives.

#14.1 Where to keep dashboard customization code

Keep all dashboard customizations in a must-use plugin. Must-use plugins load automatically and cannot be deactivated from the Plugins screen, which is what you want for client-proofing code. WordPress only loads PHP files placed directly in mu-plugins, so one loader file includes the rest:

<?php
/**
 * Plugin Name: WPPoland Dashboard Customizer
 * Description: Dashboard customization for client sites
 * Version: 1.0.0
 * Author: WPPoland
 * Text Domain: wppoland
 */
// File: wp-content/mu-plugins/wppoland-dashboard-customizer.php

// Prevent direct access
if (!defined('ABSPATH')) exit;

define('WPPOLAND_DASHBOARD_VERSION', '1.0.0');
define('WPPOLAND_DASHBOARD_PATH', __DIR__ . '/wppoland-dashboard/');

// Include customization modules
require_once WPPOLAND_DASHBOARD_PATH . 'cleanup.php';
require_once WPPOLAND_DASHBOARD_PATH . 'customization.php';
require_once WPPOLAND_DASHBOARD_PATH . 'security.php';
require_once WPPOLAND_DASHBOARD_PATH . 'performance.php';

#14.2 Versioning dashboard customizations

Track all dashboard changes and provide update mechanisms:

// Dashboard customization version tracking
function wppoland_get_dashboard_version() {
    return get_option('wppoland_dashboard_version', '1.0.0');
}

function wppoland_update_dashboard_settings() {
    $current_version = wppoland_get_dashboard_version();
    $plugin_version  = WPPOLAND_DASHBOARD_VERSION;

    if (version_compare($current_version, $plugin_version, '<')) {
        // Run your own update routine here, then store the new version
        update_option('wppoland_dashboard_version', $plugin_version);
    }
}
add_action('plugins_loaded', 'wppoland_update_dashboard_settings');

Keep the mu-plugin in the same Git repository as the rest of the site code, so every change to the client’s admin has a commit and a reason.

#14.3 How to add a help tab for clients in the dashboard

Every admin screen has a Help tab next to Screen Options. WP_Screen::add_help_tab() adds your own content to it. Hooking into load-index.php limits the tab to the Dashboard screen:

// Add help tab to the Dashboard screen
function wppoland_add_dashboard_help_tab() {
    $screen = get_current_screen();

    $screen->add_help_tab([
        'id'      => 'wppoland_dashboard_help',
        'title'   => __('Dashboard Guide', 'wppoland'),
        'content' => '<h3>' . __('How to Use Your Dashboard', 'wppoland') . '</h3>' .
                     '<p>' . __('This guide will help you navigate and manage your WordPress site.', 'wppoland') . '</p>' .
                     '<ul>' .
                     '<li><a href="edit.php">' . __('Manage Posts', 'wppoland') . '</a></li>' .
                     '<li><a href="edit.php?post_type=page">' . __('Manage Pages', 'wppoland') . '</a></li>' .
                     '<li><a href="upload.php">' . __('Media Library', 'wppoland') . '</a></li>' .
                     '</ul>'
    ]);
}
add_action('load-index.php', 'wppoland_add_dashboard_help_tab');

#15. WordPress dashboard FAQ for developers

How do I reset the dashboard to default for one user Screen Options, box order and collapsed boxes live in that user’s meta, under the keys listed in section 9.4. Delete them and the screens fall back to defaults. With WP-CLI, wp user meta list <user> shows the keys and wp user meta delete <user> <key> removes one. Site-wide changes made in code come back only when you remove that code.

Can I create completely custom admin pages Yes. add_menu_page() and add_submenu_page() register a screen with your own callback, as in section 6.3. Set the capability argument to the lowest capability that should see the page.

How do I hide the admin bar for certain users Each user can switch off “Show Toolbar when viewing site” in their profile. For a whole role, return false from the show_admin_bar filter when current_user_can() fails your check. This only affects the front end; the toolbar inside wp-admin stays.

Can clients break the site from the dashboard An administrator account can: it can edit theme files, install plugins and change permalinks. Give clients the Editor role where possible, set DISALLOW_FILE_EDIT (section 7.1), and keep administrator accounts for the people who maintain the site.

What is the difference between Editor and Author An Author publishes and manages their own posts and uploads media. An Editor manages everyone’s posts and pages, moderates comments and manages categories. Section 4.1 lists which menus each role sees.

How do I restore accidentally deleted content Deleted posts and pages go to the Trash first. WordPress empties it after 30 days by default, controlled by the EMPTY_TRASH_DAYS constant. After that, the content only comes back from a backup.

Why is my dashboard loading slowly The usual causes are dashboard widgets that call external services, a missing persistent object cache and plugin overhead. Sections 11.1 and 11.3 cover the first two.

How do I prevent clients from installing their own plugins Do not give them the Administrator role; on a single site only administrators have install_plugins. If an administrator account is unavoidable, DISALLOW_FILE_MODS blocks installs and updates from the dashboard for everyone (section 7.1).

How do I add help tabs to admin pages Call get_current_screen()->add_help_tab() on the load- hook of the screen you want, as in section 14.3.

Can I customize the dashboard per user Yes. Users control their own Screen Options, box order, color scheme and toolbar visibility. Code can branch on get_current_user_id() or, better, on a capability, so the setup follows the role and not one person.

How do I enable automatic plugin updates for clients Since WordPress 5.5 the Plugins screen has an “Enable auto-updates” link per plugin. In code, the auto_update_plugin filter returns true to update all plugins or decides per plugin. Note that DISALLOW_FILE_MODS switches automatic updates off.

Can I export dashboard settings to use on other sites Not through a core screen. The reliable way is to keep the customizations in the must-use plugin from section 14.1 and copy that plugin to each site.

How do I handle dashboard issues when switching themes Code in the theme’s functions.php disappears with the theme, so the dashboard returns to defaults after a switch. That is the main reason to keep admin code in a must-use plugin.

#Summary

A generic dashboard says “I installed a theme.” A curated dashboard says “I built a platform for your business.” Invest the time to clean it up.

Key Takeaways:

  • Use Screen Options to declutter
  • Customize by user role, and remove capabilities where hiding is not enough
  • Switch off the file editors with DISALLOW_FILE_EDIT
  • Add helpful custom widgets
  • Maintain consistent branding
  • Keep admin code in a must-use plugin under version control
  • Add 2FA and server-level limits to the login
  • Fix slow dashboards at the cause: widgets, object cache, rows per page
  • Consider accessibility
  • Plan for multisite if needed

Last updated: October 16, 2026, checked against WordPress 7.1.3

Explore my professional WordPress development to take your project further.

For the delivery side of this topic I keep the work under GEO and LLMO.

Next step

Turn the article into an actual implementation

This block strengthens internal linking and gives readers the most relevant next move instead of leaving them at a dead end.

Want this implemented on your site?

If visibility in Google and AI systems matters, I can build the content architecture, FAQ, schema, and internal linking needed for SEO, GEO, and AEO.

Explore other WordPress services and knowledge base

Strengthen your business with professional technical support in key areas of the WordPress ecosystem.

Frequently asked questions

Practical answers to apply the topic in real execution.

How do I customize the WordPress dashboard for clients?#
Use the Screen Options tab to hide unnecessary widgets, remove menu items with remove_menu_page() on the admin_menu hook, and configure user roles with minimal required capabilities. Set DISALLOW_FILE_EDIT in wp-config.php so nobody can edit theme or plugin files from the admin.
What are the default WordPress user roles and permissions?#
WordPress has five default roles: Administrator (full access), Editor (manage all content), Author (publish own posts), Contributor (write but not publish), and Subscriber (read-only). Each role is a set of capabilities, and core shows or hides admin menus by checking them.
Can I hide specific menu items from certain users?#
Yes. remove_menu_page() and remove_submenu_page() on the admin_menu hook hide items for users who fail a capability check. Hiding does not block the URL, so remove the capability from the role when access must be denied.
How do I reset the WordPress dashboard to default settings?#
Screen Options and box positions are stored per user in user meta (keys such as metaboxhidden_dashboard and manageedit-postcolumnshidden). Deleting those keys, for example with wp user meta delete, restores the defaults for that user. Changes made in code return only when the code is removed.
Is WP-CLI a replacement for the WordPress dashboard?#
WP-CLI complements but doesn't fully replace the dashboard. It's ideal for bulk operations, automation scripts, and server environments without GUI access. For content editing, media management, and visual customization, the admin dashboard remains essential.

Need an FAQ tailored to your industry and market? I can build one aligned with your business goals.

Let’s discuss

Related Articles