Possible to hide Custom Post Type UI/Menu from specific User Roles?

What I’m looking to do is completely hide the UI for a custom post type from specific user roles…Ive previously found many resources on how to disable access to using those CPTs but nothing that really allows you to completely hide the CPT UI all together based on what user is logged into the dashboard.

This is important since I need clients to completely stay out of custom post types for the store, and if they can see the store CPT UI in the dashboard still it doesn’t make a difference if their capabilities are restricted since their still going to inquire how they can go about adding product on their own as a result.

Read More

Id really prefer to not accomplish this with a plugin however if there is something that can do the trick in a non-bloated way that would still be great I suppose.

Thanks for your help,
SB

Related posts

Leave a Reply

6 comments

  1. To hide a post type menu item from non-admin users:

    function wpse28782_remove_menu_items() {
        if( !current_user_can( 'administrator' ) ):
            remove_menu_page( 'edit.php?post_type=your_post_type' );
        endif;
    }
    add_action( 'admin_menu', 'wpse28782_remove_menu_items' );
    

    your_post_type should be the name of your actual post type.

    EDIT-

    other menu pages you can remove:

    remove_menu_page('edit.php'); // Posts
    remove_menu_page('upload.php'); // Media
    remove_menu_page('link-manager.php'); // Links
    remove_menu_page('edit-comments.php'); // Comments
    remove_menu_page('edit.php?post_type=page'); // Pages
    remove_menu_page('plugins.php'); // Plugins
    remove_menu_page('themes.php'); // Appearance
    remove_menu_page('users.php'); // Users
    remove_menu_page('tools.php'); // Tools
    remove_menu_page('options-general.php'); // Settings
    

    EDIT 2 –

    Removing plugin menu items.

    For plugins, it seems you only need the page= query var. The other thing to note is the priority, which is the third argument to the admin_menu add_action. It has to be set low enough (the higher the number, the lower the priority) so that plugins have already added themselves to the menu.

    function wpse28782_remove_plugin_admin_menu() {
        if( !current_user_can( 'administrator' ) ):
            remove_menu_page('cart66_admin');
        endif;
    }
    add_action( 'admin_menu', 'wpse28782_remove_plugin_admin_menu', 9999 );
    
  2. The accepted answer can be used to hide custom post types (and other assorted items) as described. But if you want to hide the CPT UI plugin menu itself, you can also remove the action that adds it to the menu in the first place.

    if( !current_user_can( 'administrator' ) ) {
        remove_action( 'admin_menu', 'cptui_plugin_menu' );
    }
    
  3. If you want to hide that plugin’s menu which name is “Custom Post Type UI” a.k.a CPTUI, it is not possible with combining first link with remove_menu_page.

    All you have to do is ;

    function wpse_28782_remove_menus() {
        remove_menu_page('cptui_main_menu');
    }
    add_action('admin_init', 'wpse_28782_remove_menus');
    
  4. To hide Woocommerce submenus under the top-level menu “Products” for all Shop Manager user roles (WordPress 5.1.1):

    function remove_menus_shopmgr(){
    
    // If the current user is a shop manager
    if ( current_user_can('shop_manager') ) {
    
       //removes Products > Categories submenu 
        remove_submenu_page( 'edit.php?post_type=product','edit-tags.php?taxonomy=product_cat&post_type=product' );
    
       //removes Products > Tags submenu
        remove_submenu_page( 'edit.php?post_type=product','edit-tags.php?taxonomy=product_tag&post_type=product' ); 
    
        }
    }
    
    add_action( 'admin_menu', 'remove_menus_shopmgr', 999 );
    
  5. If remove_menu_page doesn’t work for you (it didn’t for me) then instead of removing the menu, an alternative is to tell WordPress not to show the menu for the post type:

    function wpse28782_hide_menu_items() {
        if( !current_user_can( 'administrator' ) ) {
            $post_type = get_post_type_object( 'your_post_type');
            if ($post_type) {
                $post_type->show_in_menu = false;
            }
        }
    }
    add_action( 'admin_menu', 'wpse28782_hide_menu_items', 99 );