46

I currently developing a wordpress plugin that is using two custom post types. What I want to know here: is it possible to add a custom post type menu as another custom post type's sub menu?

3 Answers 3

94

Yes. When you register your post type you need to set show_in_menu to the page you would like it displayed on.

Adding a custom post type as a sub-menu of Posts

Here we set the "movies" post type to be included in the sub-menu under Posts.

register_post_type( 'movies',
    array(
            'labels' => array(
                    'name' => __( 'Movies' ),
                    'singular_name' => __( 'Movie' )
            ),
    'public' => true,
    'has_archive' => true,
    'show_in_menu' => 'edit.php'
    )
);

If you have a taxonomy registered to the custom post type it will need to be added to the page as well.

In add_submenu_page() the first argument is the page to assign it to and the last is the menu slug.

add_action('admin_menu', 'my_admin_menu'); 
function my_admin_menu() { 
    add_submenu_page('edit.php', 'Genre', 'Genre', 'manage_options', 'edit-tags.php?taxonomy=genre'); 
}  

Adding a custom post type as a sub-menu of another custom post type

To add the pages to another custom post type include the post type's query string parameter along with the page names.

To add the CPT Movies and its taxonomy Genre under the post type Entertainment adjust the code like this.

edit.php becomes edit.php?post_type=entertainment

edit-tags.php becomes edit-tags.php?taxonomy=genre&post_type=entertainment

register_post_type( 'movies',
    array(
            'labels' => array(
                    'name' => __( 'Movies' ),
                    'singular_name' => __( 'Movie' )
            ),
    'public' => true,
    'has_archive' => true,
    'show_in_menu' => 'edit.php?post_type=entertainment'
    )
);

add_action('admin_menu', 'my_admin_menu'); 
function my_admin_menu() { 
    add_submenu_page('edit.php?post_type=entertainment', 'Genre', 'Genre', 'manage_options', 'edit-tags.php?taxonomy=genre&post_type=entertainment'); 
}
6
  • 2
    Hi, thanks. It works. But the sub menu cpt lost its submenu.
    – Ari
    Commented Aug 18, 2013 at 18:00
  • I've update my answer with a way to include taxonomies.
    – epilektric
    Commented Aug 21, 2013 at 11:58
  • Hi thanks you! I had found the way to do it! But may be yours will give a better result!
    – Ari
    Commented Aug 21, 2013 at 12:57
  • the show_in_menu attribute, didn't worked for me. Commented Feb 26, 2015 at 22:08
  • Sorry for repeating. In order for the submenu and paretn menu to stay highlighted you need to give WP some more information. Ok, the 'show_in_menu' parameter makes the submenu to be current/highlighted when 'my_post_type' is on the screen. Now, we need also to add another action, that will highlight the parent menu. You could try this: add_filter( 'parent_file', 'menu_highlight' )); function menu_highlight( $parent_file ){ global $plugin_page, $post_type; if ('my_post_type' == $post_type) { $plugin_page = 'edit.php?post_type=my_post_type'; // the submenu hook name } return $parent_file; }
    – TomeeNS
    Commented May 26, 2017 at 15:59
9

Our custom post type:

$args['show_in_menu'] = false;
register_post_type('custom_plugin_post_type', $args);

Add him for existing Custom Post Type ("product" for example):

$existing_CPT_menu = 'edit.php?post_type=product';
$link_our_new_CPT = 'edit.php?post_type=custom_plugin_post_type';
add_submenu_page($existign_CPT_menu, 'SubmenuTitle', 'SubmenuTitle', 'manage_options', $link_our_new_CPT);

Or add for our custom plugin menu:

// Create plugin menu
add_menu_page('MyPlugin', 'MyPlugin', 'manage_options', 'myPluginSlug', 'callback_render_plugin_menu');

// Create submenu with href to view custom_plugin_post_type
$link_our_new_CPT = 'edit.php?post_type=custom_plugin_post_type';
add_submenu_page('myPluginSlug', 'SubmenuTitle', 'SubmenuTitle', 'manage_options', $link_our_new_CPT);
1
  • Thanks! It's helpful for me.
    – NSukonny
    Commented Nov 27, 2019 at 11:39
1

This is what worked for me

enter image description here

add_action('admin_menu', 'vrodos_plugin_menu');

function vrodos_plugin_menu(){
    add_menu_page( 'VRodos Plugin Page',
                   'VRodos',
                    'manage_options',
                    'vrodos-plugin',
                    'vrodos_plugin_main_page');
    
    
    add_submenu_page('vrodos-plugin',
                     'Games',
                     'Games',
                     'manage_options',
                     'edit.php?post_type=vrodos_game'
                     );
}

When I register the cpt 'vrodos_game' I set

    'show_ui'               => true,
    'show_in_menu'          => false,

Not the answer you're looking for? Browse other questions tagged or ask your own question.