Clone the administrator user role.
Reorder the left WP admin menu.
Clone the administrator user role
When we need a new administrator user role. Create a new role by adding the following code to the child theme functions.php file or a code snippet plugin.
Even though the code is old it still seems to work.
/* https://www.kvcodes.com/2015/04/wordpress-clone-user-role-to-create-new-role/
https://nazmulahsan.me/clone-or-add-new-user-roles/ Duplicate the admin user role. */
add_action('init', 'cloneUserRole');
function cloneUserRole()
{
global $wp_roles;
if (!isset($wp_roles))
$wp_roles = new WP_Roles();
$adm = $wp_roles->get_role('administrator');
// Adding a new role with all admin caps.
$wp_roles->add_role('client', 'Client', $adm->capabilities);
}
The result is seen when going to Users -> Add New. Click the Role drop down and notice the new Client admin user role.
Modify the WordPress admin for the newly cloned user role.
Remove all top level links except Posts.
Remove submenu links such as Dashboard – Updates, Post tags, Appearance – Editor and Plugins – Editor.
/* https://www.wpmayor.com/how-to-remove-menu-items-in-admin-depending-on-user-role/ */
add_action( 'admin_init', 'my_remove_menu_pages' );
function my_remove_menu_pages() {
global $user_ID;
if ( current_user_can( 'client' ) ) {
// Remove top level links.
// remove_menu_page( 'edit.php' ); // Posts
remove_menu_page( 'upload.php' ); // Media
remove_menu_page( 'edit.php?post_type=page' ); // Pages
remove_menu_page( 'edit-comments.php' ); // Comments
remove_menu_page( 'themes.php' ); // Appearance
remove_menu_page( 'plugins.php' ); // Plugins
remove_menu_page( 'users.php' ); // Users
remove_menu_page( 'tools.php' ); // Tools
remove_menu_page( 'options-general.php' ); // Settings
// Remove submenu links.
remove_submenu_page( 'index.php', 'update-core.php' ); // Dashboard - Updates
remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=post_tag' ); // Posts - Tags
remove_submenu_page( 'themes.php', 'theme-editor.php' ); // Appearance - Editor
remove_submenu_page( 'plugins.php', 'plugin-editor.php' ); // Plugins - Editor
}
}
The result of using the above code.
All top level items are hidden except Posts. Dashboard Home is also seen.
Reorder the left admin menu
/*********************
* re-order left admin menu
**********************/
function reorder_admin_menu( $__return_true ) {
return array(
'index.php', // Dashboard
'edit.php?post_type=page', // Pages
'edit.php', // Posts
'upload.php', // Media
'themes.php', // Appearance
'separator1', // --Space--
'edit-comments.php', // Comments
'users.php', // Users
'separator2', // --Space--
'plugins.php', // Plugins
'tools.php', // Tools
'options-general.php', // Settings
);
}
add_filter( 'custom_menu_order', 'reorder_admin_menu' );
add_filter( 'menu_order', 'reorder_admin_menu' );
Removing all top level and all submenu items.
/* Remove top level admin menus. */
function remove_admin_menus() {
remove_menu_page( 'index.php' ); // Dashboard
remove_menu_page( 'edit.php' ); // Posts
remove_menu_page( 'upload.php' ); // Media
remove_menu_page( 'edit.php?post_type=page' ); // Pages
remove_menu_page( 'edit-comments.php' ); // Comments
remove_menu_page( 'themes.php' ); // Appearance
remove_menu_page( 'plugins.php' ); // Plugins
remove_menu_page( 'users.php' ); // Users
remove_menu_page( 'tools.php' ); // Tools
remove_menu_page( 'options-general.php' ); // Settings
}
add_action( 'admin_menu', 'remove_admin_menus' );
/* Remove sub level admin menus. */
function remove_admin_submenus() {
remove_submenu_page( 'index.php', 'update-core.php' ); // Dashboard - Updates
// Posts
remove_submenu_page( 'edit.php', 'post-new.php' ); // Posts - Add New Post
remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=category' ); // Posts - Categories
remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=post_tag' ); // Posts - Tags
remove_submenu_page( 'edit.php?post_type=page', 'post-new.php?post_type=page' ); // Pages - Add New Page
remove_submenu_page ( 'upload.php', 'media-new.php'); // Media - Add New
// Appearance
remove_submenu_page( 'themes.php', 'themes.php' ); // Appearance - Themes
remove_submenu_page( 'themes.php', 'theme-editor.php' ); // Appearance - Editor
remove_submenu_page( 'themes.php', 'widgets.php' ); // Appearance - Widgets
remove_submenu_page( 'themes.php', 'nav-menus.php' ); // Appearance - Menus
// Plugins
remove_submenu_page( 'plugins.php', 'plugin-install.php' ); // Plugins - Add New Plugins
remove_submenu_page( 'plugins.php', 'plugins.php' ); // Plugins - Installed Plugins
remove_submenu_page( 'plugins.php', 'plugin-editor.php' ); // Plugins - Editor
// Users
remove_submenu_page( 'users.php', 'user-new.php' ); //Users - Add New User
remove_submenu_page( 'users.php', 'profile.php' ); //Users - Your Profile
// Tools submenu links can also be removed. Hover over a link and notice the status bar link in the bottom left. Add the name similar to the other options seen in this code.
// Settings
remove_submenu_page( 'options-general.php', 'options-general.php' ); // Settings - General
remove_submenu_page( 'options-general.php', 'options-writing.php' ); // Settings - Writing
remove_submenu_page( 'options-general.php', 'options-reading.php' ); // Settings - Reading
remove_submenu_page( 'options-general.php', 'options-discussion.php' ); // Settings - Discussion
remove_submenu_page( 'options-general.php', 'options-media.php' ); // Settings - Media
remove_submenu_page( 'options-general.php', 'options-permalink.php' ); // Settings - Permalink
// Not working. Uses other code. See further below.
remove_submenu_page( 'themes.php', 'customize.php' ); // Appearance - Customize
}
add_action( 'admin_init', 'remove_admin_submenus' );
RemovingAppearance -> Customize also requires a new function.
I found the code here: https://wordpress.org/support/topic/remove-customize-from-admin-menu?replies=5
/* Removes customize menu link. */
function remove_customize_page(){
global $submenu;
unset($submenu['themes.php'][6]); // remove customize link
}
add_action( 'admin_menu', 'remove_customize_page');
Add a submenu to another submenu.
The following is code to add a submenu to another submenu. If it uses an existing submenu it will still open in its original location.
/* Add submenu item to another submenu - The moved submenu link will open in the original location. I used upload.php as an example on adding the media library. Check above in the remove_submenu_page for other options. */
function add_submenu_item() {
// Resource page: https://clivern.com/adding-menus-and-submenus-for-wordpress-plugins/
// add_options_page($page_title, $menu_title, $capability, $menu_slug, $function);
add_dashboard_page('page-title', 'submenu title', 'manage_options', 'upload.php');
add_posts_page('page-title', 'submenu title', 'manage_options', 'upload.php');
add_media_page('page-title', 'submenu title', 'manage_options', 'upload.php');
add_pages_page('page-title', 'submenu title', 'manage_options', 'upload.php');
add_comments_page('page-title', 'submenu title', 'manage_options', 'upload.php');
add_theme_page('page-title', 'submenu title', 'manage_options', 'upload.php');
add_plugins_page('page-title', 'submenu title', 'manage_options', 'upload.php');
add_users_page('page-title', 'submenu title', 'manage_options', 'upload.php');
//Tools
add_management_page('page-title', 'submenu title', 'manage_options', 'upload.php');
//Settings
add_options_page('page-title', 'submenu title', 'manage_options', 'upload.php');
}
add_action( 'admin_init', 'add_submenu_item' );
Add submenu link to a top level menu.
/* submenu item to top level menu
Example: add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position );
https://gist.github.com/hofmannsven/8269251 */
add_action( 'admin_menu', 'register_my_custom_menu_page' );
function register_my_custom_menu_page() {
add_menu_page( 'Custom Menu Page Title', 'Custom Menu Page', 'manage_options', 'custom.php', '', 'dashicons-awards', 90 );
}
The above code links to a new custom.php page which currently does not exist.
// Submenu to new submenu - It will still open in the original area.
Example: add_submenu_page($parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function);
add_submenu_page('widgets.php', 'page-title', 'menu-title2', 'manage_options', 'upload.php');
}
add_action( 'admin_init', 'new_menu' );
Resources used:
https://www.kvcodes.com/2015/04/wordpress-clone-user-role-to-create-new-role/
https://nazmulahsan.me/clone-or-add-new-user-roles/
https://www.wpmayor.com/how-to-remove-menu-items-in-admin-depending-on-user-role/
https://clivern.com/adding-menus-and-submenus-for-wordpress-plugins
https://gist.github.com/hofmannsven/8269251
Additional resources:
https://www.paulund.co.uk/add-menu-item-to-wordpress-admin
https://tommcfarlin.com/add-a-separator-to-the-wordpress-menu/
https://markwilkinson.me/2014/11/altering-wordpress-admin-menus/
https://codex.wordpress.org/Function_Reference/remove_menu_page
https://wordpress.stackexchange.com/questions/52099/how-to-remove-entire-admin-menu
Plugins:
https://wordpress.org/plugins/codepress-admin-columns/
https://wordpress.org/plugins/admin-menu-editor/
History: I filled out three trac tickets. One for admin_menu not removing the theme editor 32784 the other for lack of consistency in removing submenu items 32785. The third when removing submenu item and then adding it to another existing top level menu clicking the moved submenu item will open it in the original location 32788.
This tutorial was originally created 22 June 2015.