Customize the WordPress admin menu based on user roles


WordPress can be a powerful content management system but if you have multiple users often some can end up with permissions that you really wish they didn’t have. There are plenty of plugins that will let you customize user permissions but it’s not that hard to do ourselves by removing certain links from the admin menu for those specific user roles.

Note that this method doesn’t actually remove user permissions but just the admin menu links that would get them there.

Basic example

Add the following to functions.php (or create your own plugin) to remove the “Tools” menu from any user with a role lower than Author.

add_action( 'admin_init', 'my_remove_menu_pages' );

function my_remove_menu_pages() {
	// If the user does not have access to publish posts
	if(!current_user_can('publish_posts')) {
		// Remove the "Tools" menu
		remove_menu_page('tools.php');
	}
}

Removing the Tools menu

You can choose a variety of user levels rather than publish_posts for example edit_users, delete_pages, etc. View a complete list of WordPress roles and capabilities.

The function remove_menu_page() removes a menu item based off of the menu slug you pass it. To figure out that the menu slug was named tools.php I used used Chrome’s developer tools and right clicked on the Tools menu and selected Inspect element. This showed me that the tools menu was linked as <a href="tools.php" tabindex="1">Tools</a>.

To save you the hassle of figuring out each menu slug I listed them below.

Removing sub-menu items

add_action( 'admin_init', 'my_remove_menu_pages' );

function my_remove_menu_pages() {
	// If the user does not have access to add new users
	if(!current_user_can('add_users')) {
		// Remove the "Link Categories" menu under "Links"
		remove_submenu_page( 'link-manager.php', 'edit-tags.php?taxonomy=link_category' );
	}
}

Removing the Tools menu

The function remove_submenu_page() is similar but takes two arguments, the parent menu’s slug and the sub-menu’s slug. Once again you can find the slugs by inspecting each menu link or view the complete list below.

Mixed example

add_action( 'admin_init', 'my_remove_menu_pages' );

function my_remove_menu_pages() {
	if(!current_user_can('add_users')) {
		remove_menu_page('options-general.php'); // Settings
		remove_menu_page('tools.php'); // Tools
		remove_menu_page('upload.php'); // Media

		remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=category' ); // Post categories
		remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=post_tag' ); // Post tags
	}
}

WordPress admin menu slugs

Dashboard remove_menu_page(‘index.php’);
Dashboard remove_submenu_page( ‘index.php’, ‘index.php’ );
Updates remove_submenu_page( ‘index.php’, ‘update-core.php’ );

Posts remove_menu_page(‘edit.php’);
Posts remove_submenu_page( ‘edit.php’, ‘edit.php’ );
Add New remove_submenu_page( ‘edit.php’, ‘post-new.php’ );
Categories remove_submenu_page( ‘edit.php’, ‘edit-tags.php?taxonomy=category’ );
Post Tags remove_submenu_page( ‘edit.php’, ‘edit-tags.php?taxonomy=post_tag’ );
Media remove_menu_page(‘upload.php’);
Library remove_submenu_page( ‘upload.php’, ‘upload.php’ );
Add New remove_submenu_page( ‘upload.php’, ‘media-new.php’ );
Links remove_menu_page(‘link-manager.php’);
Links remove_submenu_page( ‘link-manager.php’, ‘link-manager.php’ );
Add New remove_submenu_page( ‘link-manager.php’, ‘link-add.php’ );
Link Categories remove_submenu_page( ‘link-manager.php’, ‘edit-tags.php?taxonomy=link_category’ );
Pages remove_menu_page(‘edit.php?post_type=page’);
Pages remove_submenu_page( ‘edit.php?post_type=page’, ‘edit.php?post_type=page’ );
Add New remove_submenu_page( ‘edit.php?post_type=page’, ‘post-new.php?post_type=page’ );
Comments remove_menu_page(‘edit-comments.php’);

Appearance remove_menu_page(‘themes.php’);
Themes remove_submenu_page( ‘themes.php’, ‘themes.php’ );
Widgets remove_submenu_page( ‘themes.php’, ‘widgets.php’ );
Menus remove_submenu_page( ‘themes.php’, ‘nav-menus.php’ );
Editor remove_submenu_page( ‘themes.php’, ‘theme-editor.php’ );
Plugins remove_menu_page(‘plugins.php’);
Plugins remove_submenu_page( ‘plugins.php’, ‘plugins.php’ );
Add New remove_submenu_page( ‘plugins.php’, ‘plugin-install.php’ );
Editor remove_submenu_page( ‘plugins.php’, ‘plugin-editor.php’ );
Users remove_menu_page(‘users.php’);
Users remove_submenu_page( ‘users.php’, ‘users.php’ );
Add New remove_submenu_page( ‘users.php’, ‘user-new.php’ );
Your Profile remove_submenu_page( ‘users.php’, ‘profile.php’ );
Tools remove_menu_page(‘tools.php’);
Tools remove_submenu_page( ‘tools.php’, ‘tools.php’ );
Import remove_submenu_page( ‘tools.php’, ‘import.php’ );
Export remove_submenu_page( ‘tools.php’, ‘export.php’ );
Settings remove_menu_page(‘options-general.php’);
General remove_submenu_page( ‘options-general.php’, ‘options-general.php’ );
Writing remove_submenu_page( ‘options-general.php’, ‘options-writing.php’ );
Reading remove_submenu_page( ‘options-general.php’, ‘options-reading.php’ );
Discussion remove_submenu_page( ‘options-general.php’, ‘options-discussion.php’ );
Media remove_submenu_page( ‘options-general.php’, ‘options-media.php’ );
Privacy remove_submenu_page( ‘options-general.php’, ‘options-privacy.php’ );
Permalinks remove_submenu_page( ‘options-general.php’, ‘options-permalink.php’ );

40 Comments

  1. hey thanks, i really need this,why you dont make plugin for this function,..


  2. Thanks a lot!!!
    Really usefull stuff


  3. Thanks a lot!!!
    Really useful stuff


  4. Great work on this! Just the plugin I was looking for to customize the WordPress admin area. Thanks!


  5. Awesome list, glad you posted it! Do you know if there’s a way to query WP for a list of the menu and submenu slugs, and also plugin menu slugs? I’m worried about hard-coding the slugs in your list, then WP changing them in a few months. So obviously I’d like something future-proof, if that’s possible? Otherwise I’m’a work from your list for now…


  6. Thanks for this info.
    How to I remove submenu for custom post_types?
    For example I want to retain the post tags meta box in the admin page but want to remove the ‘Post Tags’ link from the submenu


  7. OMG ! Realy need this, Great tutorial !


  8. And what if somebody goes with direct url? I think we need some .htaccess to redirect them.


    • Yes this method doesn’t actually remove the user permissions. For that you might try a plugin like Role Scoper.


      Seth Stevenson -
  9. Nice collection of functions here. I might use these for future WordPress sites :)


  10. Hi and thanks for this – works great!

    Any idea why

    remove_submenu_page( ‘edit.php’, ‘post-new.php?post_type=listing’ );

    doesn’t remove “add new” from my custom post type menu “listing”?

    Cheers,
    Thomas.


    • got it: it has to be

      remove_submenu_page( ‘edit.php?post_type=listing’, ‘post-new.php?post_type=listing’ );


  11. Very strange i cant seem to remove the users menu .. any idea?


  12. Pingback:
  13. Thanks, man! Very useful!


  14. I would like to remove themes.php ? I can remove the sub-menu, but it can still be accessed via clicking ‘appearance’ menu.


  15. Does anyone know a plugin that would do that? I assume you have to repeat this after each upgrade


  16. Does anyone knows how to use these with an array without having to retype the same lines over an over?
    I tried using the following:

    remove_menu_page (array(‘tools.php’,’upload.php’,’themes.php’));

    without success.


  17. Pingback:
  18. any individual have any info?


    podiatry898 -
  19. hi, i want to remove the sub-item poll-options from poll plugin… any idea?


    • Which poll plugin are you using?


      • I think he is using WP-Polls. I have the same query. How can I get rid of some of the submenus? The link is /wp-admin/admin.php?page=wp-polls/polls-options.php. I’ve tried remove_submenu_page(‘wp-polls’, ‘polls-options.php’); and remove_submenu_page(‘admin.php?page=wp-polls’, ‘polls-options.php’); but neither worked.


  20. Why does a slider show up at the bottom of the page ‘http://sethstevenson.net/customize-the-wordpress-admin-menu-based-on-user-roles/’ in firefox 17.0.1?


  21. You sir.. Are Awesome! Thanks for the detailed tutorial.


  22. Thanks for a great post on this topic, I have two questions:

    1 – How can I remove these pages and sub_pages appearing on the menu_bar (the links I can see on the front end of the site)? They still appear here even though they removed in the backend.

    2 – How can I remove the Header and Background sub_pages from Appearance?

    I’m hoping an answer to these two questions will be helpful to others also.


  23. Thank you for this contribution.


  24. Very very useful. Thanks a lot Seth.


  25. Thanks for the great contribution.The one i was looking for.


  26. thank you very much


    kalpesh -
  27. Hi, Seth, great script, i have request, can u provide the code to hide the “publish” button for user roles, ex. hide it for editors, so they can only save as draft.


  28. Hey it was really helpfull.
    Thanks so much.


  29. Hi, sadly didn’t work for me. WordPress 3.7.1 I tried to hide Menu “Your Profile” for everyone accept Admin, but didn’t work out. Any ideas why?

    function my_remove_menu_pages() {
    if(!current_user_can(‘activate_plugins’)) {
    remove_submenu_page( ‘users.php’, ‘profile.php’ );


  30. Pingback:
  31. Thanks, very useful.
    I am only question, any wordpress plugin for get this customization?


Speak up!