Add a Custom Post Type Submenu To An Existing Custom Post Type Menu
Custom Post Types are on of the most powerful features of WordPress, especially if you’re in the business of creating custom solutions for clients beyond normal blogging functionality.
Introducing a new menu in the WordPress dashboard is really easy when using the custom post type API; however, what about the case when you have a custom post type and is a child of another custom post type?
Specifically, what about the case when you want to add a custom post type submenu to an existing custom post type menu?
First, let’s introduce a Portfolio custom post type. This will be a top-level menu in the WordPress dashboard.
/**
* Define the 'Portfolio' post type. This is used to represent galleries
* of photos.
*
* This will be our top-level custom post type menu.
*/
$args = array(
'labels' => array(
'all_items' => 'Gallery',
'menu_name' => 'Portfolio',
'singular_name' => 'Gallery',
'edit_item' => 'Edit Gallery',
'new_item' => 'New Gallery',
'view_item' => 'View Gallery',
'items_archive' => 'Gallery Archive',
'search_items' => 'Search Portfolio',
'not_found' => 'No galleries found',
'not_found_in_trash' => 'No galleries found in trash'
),
'supports' => array( 'title', 'editor', 'author', 'revisions' ),
'menu_position' => 5,
'public' => true
);
register_post_type( 'portfolio', $args );
Now, we can introduce a second post type, say, Locations that will be used to represent all of the locations that we’ve used throughout the portfolio.
/**
* Next, we'll define a second custom post type called 'Locations' where we could
* potentially display a list of locations that are used as part of our portfolio.
*
* This custom post type will be added as a submenu to the 'Portfolio' menu
*/
$args = array(
'labels' => array(
'all_items' => 'Locations',
'menu_name' => 'Locations',
'singular_name' => 'Location',
'edit_item' => 'Edit Location',
'new_item' => 'New Location',
'view_item' => 'View Location',
'items_archive' => 'Location Archive',
'search_items' => 'Search Locations',
'not_found' => 'No locations found.',
'not_found_in_trash' => 'No locations found in trash.'
),
'supports' => array( 'title', 'editor', 'revisions' ),
'show_in_menu' => 'edit.php?post_type=portfolio',
'public' => true
);
register_post_type( 'location', $args );
Note that the following line is key in adding the menu as a submenu:
'show_in_menu' => 'edit.php?post_type=portfolio',
And that’s it! Easy enough, right?