You can use add_menu_page()
to add the link yourself. Simply use #
as menu slug. You can then use add_submenu_page()
to add the other menu items yourself.
Another option would be to to fiddle with the global $menu
array. Take this answer as base.
Edit: As per the comments, there needs to a top & sub menu entry
The following demo (mu-)plugin shows how you can add and remove and therefore custom rebuild your menu entries. The “magic” is using the global submenu
, which gets looped through inside _wp_menu_output()
in ~/wp-admin/menu-header.php
. The filter that runs right before this function is the parent_file
filter. Use it to intercept and alter the global. Doing so, you can safely remove the first menu entry by using remove_submenu_page()
, while still having the default core behavior of a submenu items being visible when the main menu item is clicked.
(Note: A custom menu_icon
can be set during post type registration.)
<?php
/** Plugin Name: (#170620) Menu Pages tests */
// Rebuild the Menu
add_action( 'admin_menu', function()
{
$slug = 'edit.php?post_type=members';
remove_submenu_page( $slug, $slug );
} );
// Set the Main menu items anchor back to the list page
add_filter( 'parent_file', function( $parent_file )
{
$slug = 'edit.php?post_type=members';
$GLOBALS['submenu'][ $slug ][10][2] = $slug;
return $parent_file;
} );
// Register the "members" post type
add_action( 'wp_loaded', function()
{
register_post_type( 'members', [
'public' => true,
'menu_icon' => 'dashicons-universal-access',
'labels' => [
'name' => 'Members',
'singular_name' => 'Member',
'add_new' => 'Add New',
'add_new_item' => 'Add New Member',
'edit_item' => 'Edit Member',
'new_item' => 'New Member',
'view_item' => 'View Member',
'search_items' => 'Search Members',
'not_found' => 'No members found.',
'not_found_in_trash' => 'No members found in Trash.',
'parent_item_colon' => null,
'all_items' => 'All Members',
],
] );
} );