How to Make WordPress Easier for Clients, Part 2: Hiding Menus

We teamed up with SiteGround
To bring you up to 65% off web hosting, plus free access to the entire SitePoint Premium library (worth $99). Get SiteGround + SitePoint Premium Now

In part 1 of this series, we discovered how easy it is to simplify the WordPress interface for clients.

In this article, I describe a technique for hiding unnecessary menus. Why would we want to do that? The fewer options your client has, the less you’ll need to explain, the less they’ll need to remember, and the less likely they’ll do something, er … unexpected.

Before you add any code, I’d recommend you check your WordPress user roles. I suspect most developers add their client as an editor (publish and manage all posts) or an author (publish and manage their own posts). Avoid adding anyone as as administrator unless they specifically request that level of control.

Easier WordPressI’d also suggest you log in as that user and remove any unnecessary items using the Screen Options drop-down. Your client may not need to use features such as tags, slugs, or custom fields.

Now make a note of the menus the client doesn’t need. Options such as Profile, Tools and Settings are obvious candidates. Perhaps the site doesn’t use links or comments? Or should your client be able to manage posts but not static pages?

OK, so let’s add a little code to your theme’s function.php file. Not sure what that is? Take a look at part 1. Ready? Here’s the code:


// remove unnecessary menus
function remove_admin_menus () {
	global $menu;

	// all users
	$restrict = explode(',', 'Links,Comments');
	
	// non-administrator users
	$restrict_user = explode(',', 'Media,Profile,Appearance,Plugins,Users,Tools,Settings');

	// WP localization
	$f = create_function('$v,$i', 'return __($v);');
	array_walk($restrict, $f);
	if (!current_user_can('activate_plugins')) {
		array_walk($restrict_user, $f);
		$restrict = array_merge($restrict, $restrict_user);
	}

	// remove menus
	end($menu);
	while (prev($menu)) {
		$k = key($menu);
		$v = explode(' ', $menu[$k][0]);
		if(in_array(is_null($v[0]) ? '' : $v[0] , $restrict)) unset($menu[$k]);
	}

}
add_action('admin_menu', 'remove_admin_menus');

There are two lines you should edit:

  • $restrict (line 5) contains a comma-delimited list of menu items which will not be shown to any users — including adminstrators. In the example above, we’re hiding Links and Comments, but your requirements may be different.
  • $restrict_user (line 8) contains a comma-delimited list of menu items which will not be shown to non-adminisrators. The example above disables everything expect for the Dashboard, Pages and Posts. (Note that non-administive users would not normally see Appearance and Plugins, but other plugins might change that functionality.)

I hope you and your clients find it useful. Do you have further tips for simplifying WordPress?