Remove Metabox from Menus screen

Been digging into WP files for a bit and think I just might be missing something. The end-goal is to remove the Theme Locations metabox from the Menus screen if someone doesn’t have a certain capability manage_options. I know, a little odd for usability, but there’s only one menu and we’re trying to make this harder to screw up 😉

Looking at /wp-admin/nav-menu.php around line 383 I see wp_nav_menu_setup() so I tried to add the following as a filter, but with no luck so far:

Read More
function roots_remove_nav_menu_metaboxes() {
// Remove Theme Locations from users without the 'manage_options' capability
    if (current_user_can('manage_options') == false) {
        remove_meta_box('wp_nav_menu_locations_meta_box', 'nav-menus', 'side');     // theme locations
    }
}
add_action('wp_nav_menu_setup', 'roots_remove_nav_menu_metaboxes',9999);

Any help would be really appreciated. Thanks!

Related posts

Leave a Reply

4 comments

  1. The box gets added in wp_nav_menu_setup(), so you’ll have to remove it sometime after that and before it’s being output later in nav-menus.php. There don’t seem to be any action hooks you can use there, but admin-header.php has a few. You could try this:

    add_action( 'admin_head-nav-menus.php', 'roots_remove_nav_menu_metaboxes' );
    

    I’ve never tried removing metaboxes from the menu screen, though, and it’s untested, so no idea if it works.

  2. I don’t think that’s a hook. In fact there doesn’t seem to be an appropriate one at all. But inside wp_nav_menu_setup(), the manage_nav-menus_columns is called shortly after the metaboxes are added. You can hook into that and remove it:

    add_action( 'manage_nav-menus_columns', 'my_remove_meta_locations_box' );
    function my_remove_meta_locations_box($columns) {
         if ( ! current_user_can('manage_options') )          
              remove_meta_box('nav-menu-theme-locations', 'nav-menus', 'side');
    
        return $columns;
    }
    
  3. Instead of removing the metabox, you could hide it with CSS, e.g.:

    #nav-menu-theme-locations {
        display: none;
    }
    

    Your issue with removing the box itself is most likely an issue with ordering, either trying to remove the box before it has been added, or removing it after it has already been sent to the user