È Possibile Aggiungere il Menu di un Custom Post Type Come Sottomenu di un Altro Custom Post Type
Sto attualmente sviluppando un plugin WordPress che utilizza due custom post type. Quello che vorrei sapere è: è possibile aggiungere il menu di un custom post type come sottomenu di un altro custom post type?
Sì. Quando registri il tuo post type devi impostare show_in_menu
alla pagina in cui desideri che venga visualizzato.
Aggiungere un custom post type come sotto-menu di Articoli
Qui impostiamo il post type "movies" per essere incluso nel sotto-menu sotto Articoli.
register_post_type( 'movies',
array(
'labels' => array(
'name' => __( 'Movies' ),
'singular_name' => __( 'Movie' )
),
'public' => true,
'has_archive' => true,
'show_in_menu' => 'edit.php'
)
);
Se hai una tassonomia registrata per il custom post type, dovrà essere aggiunta anche alla pagina.
In add_submenu_page()
il primo argomento è la pagina a cui assegnarlo e l'ultimo è lo slug del menu.
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');
}
Aggiungere un custom post type come sotto-menu di un altro custom post type
Per aggiungere le pagine a un altro custom post type, includi il parametro query string del post type insieme ai nomi delle pagine.
Per aggiungere il CPT Movies e la sua tassonomia Genre sotto il post type Entertainment, modifica il codice in questo modo.
edit.php
diventa edit.php?post_type=entertainment
edit-tags.php
diventa 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');
}

Ho aggiornato la mia risposta con un modo per includere le tassonomie.

Ciao, grazie mille! Avevo già trovato il modo per farlo! Ma forse il tuo darà un risultato migliore!

Scusate la ripetizione. Affinché il sottomenu e il menu padre rimangano evidenziati, dovete fornire a WP qualche informazione in più. Ok, il parametro 'show_in_menu' fa sì che il sottomenu sia corrente/evidenziato quando 'my_post_type' è sullo schermo. Ora, dobbiamo aggiungere anche un'altra azione, che evidenzierà il menu padre. Potete provare questo: 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'; // il nome dell'hook del sottomenu } return $parent_file; }

Il nostro tipo di post personalizzato:
$args['show_in_menu'] = false;
register_post_type('custom_plugin_post_type', $args);
Aggiungerlo a un Custom Post Type esistente (ad esempio "product"):
$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, 'Titolo Sottomenu', 'Titolo Sottomenu', 'manage_options', $link_our_new_CPT);
Oppure aggiungerlo al menu del nostro plugin personalizzato:
// Creazione menu del plugin
add_menu_page('MioPlugin', 'MioPlugin', 'manage_options', 'myPluginSlug', 'callback_render_plugin_menu');
// Creazione sottomenu con link alla vista custom_plugin_post_type
$link_our_new_CPT = 'edit.php?post_type=custom_plugin_post_type';
add_submenu_page('myPluginSlug', 'Titolo Sottomenu', 'Titolo Sottomenu', 'manage_options', $link_our_new_CPT);

Questo è ciò che ha funzionato per me
add_action('admin_menu', 'vrodos_plugin_menu');
function vrodos_plugin_menu(){
add_menu_page( 'Pagina Plugin VRodos',
'VRodos',
'manage_options',
'vrodos-plugin',
'vrodos_plugin_main_page');
add_submenu_page('vrodos-plugin',
'Giochi',
'Giochi',
'manage_options',
'edit.php?post_type=vrodos_game'
);
}
Quando registro il custom post type 'vrodos_game' imposto
'show_ui' => true,
'show_in_menu' => false,
