Mostrare una Tassonomia Personalizzata all'Interno di un Menu Personalizzato
Ho un menu personalizzato che utilizza add_menu_page
:
add_menu_page('Il mio menu' , 'Qualche testo', 'read', 'nwcm');
Sotto di esso, mostro un elemento di menu per un tipo di post personalizzato;
// Crea il tipo di post personalizzato news
register_post_type('nwcm_news', array(
'labels' => array(
'name' => __('Notizie per clienti', NWCM_TEXT_DOMAIN) ,
'singular_name' => __('Notizia', NWCM_TEXT_DOMAIN)
) ,
'public' => true,
'has_archive' => true,
'public' => true,
'show_ui' => true,
'show_in_menu' => 'nwcm',
'taxonomies' => array(
'nwcm_news_category'
) ,
));
Poi aggiungo una tassonomia personalizzata collegata a quel tipo di post "nwcm_news":
// registra la tassonomia news
register_taxonomy('nwcm_news_category', 'nwcm_news', array(
'label' => __('Categorie notizie') ,
'menu_name' => __('Categorie notizie') ,
'rewrite' => array(
'slug' => 'nwcm_news_category'
) ,
'hierarchical' => true
));
Il menu principale e il tipo di post personalizzato si mostrano correttamente... ma il menu della tassonomia non viene visualizzato :(
Come posso risolvere questo problema? Ho controllato questa soluzione ma la risposta non fornisce l'esempio di codice completo..
Hai del codice piuttosto confuso.
Ho riformattato il tuo codice in modo che funzioni correttamente.
La seguente soluzione ti permette di dare al menu del tuo Custom Post Type un nome qualsiasi desideri. Basta modificare l'etichetta "menu_name".
TIPO DI POST
// Crea il custom post type per le news
register_post_type('nwcm_news', array(
'labels' => array(
'name' => __('News per clienti', 'NWCM'),
'singular_name' => __('News', 'NWCM'),
'menu_name' => __('NWCM', 'NWCM'),
'all_items' => __('Visualizza Articoli', 'NWCM'),
),
'public' => true,
'has_archive' => true,
'show_ui' => true,
'show_in_menu' => true,
'taxonomies' => array(
'nwcm_news_category'
)
));
TASSONOMIA
// Registra la tassonomia per le news
register_taxonomy('nwcm_news_category', 'nwcm_news', array(
'label' => 'Categorie News',
'labels' => array(
'menu_name' => __('Categorie News', 'NWCM')
),
'rewrite' => array(
'slug' => 'nwcm-news-category'
),
'hierarchical' => true
));
Non sono sicuro al 100% se vuoi creare un menu admin personalizzato per aggiungere i tuoi contenuti o se vuoi semplicemente cambiare il nome del menu del custom post type.
Ho aggiunto il menu_name
con valore "NWCM" alle labels
del tuo custom post type.
Ti consiglio vivamente di leggere e comprendere appieno i parametri e gli argomenti per la registrazione di custom post type e tassonomie.
MODIFICA: 09/05/2014
Se volessi aggiungere completamente un tuo menu admin personalizzato, e includere i tuoi Custom Post Type, Custom Taxonomies e qualsiasi altra pagina admin personalizzata... La seguente soluzione funziona. Nota che è solo un punto di partenza e non devi seguirlo alla lettera. È solo un esempio... Ti consiglio di modificarlo in modo che sia comprensibile e gestibile da te o dal tuo sviluppatore.
Agganciati a init
e registra i Custom Post Types e le Custom Taxonomies.
if ( ! function_exists( 'mbe_init' ) ) {
function mbe_init() {
# Crea il custom post type per le news
register_post_type( 'nwcm_news', array(
'labels' => array(
'name' => __( 'News per clienti', 'NWCM' ),
'singular_name' => __( 'News', 'NWCM' ),
),
'public' => true,
'has_archive' => true,
'show_ui' => true,
'show_in_menu' => false,// aggiungeremo manualmente al menu personalizzato
'taxonomies' => array(
'nwcm_news_category'
)
) );
# Crea la tassonomia personalizzata per le categorie news
register_taxonomy( 'nwcm_news_category', 'nwcm_news', array(
'label' => 'Categorie News',
'labels' => array(
'menu_name' => __( 'Categorie News', 'NWCM' )
),
'rewrite' => array(
'slug' => 'nwcm-news-category'
),
'hierarchical' => true
) );
}
add_action( 'init', 'mbe_init' );
}
Agganciati a admin_menu
per creare un menu admin parent personalizzato, e aggiungi pagine admin di sottomenu personalizzate, pagine di Custom Post Type e pagine di Custom Taxonomy tutte al menu admin parent personalizzato.
if ( ! function_exists( 'mbe_add_admin_menu' ) && ! function_exists( 'mbe_display_admin_page' ) ) {
function mbe_add_admin_menus() {
# Impostazioni per il menu admin personalizzato
$page_title = 'News per clienti';
$menu_title = 'NWCM';
$capability = 'post';
$menu_slug = 'nwcm';
$function = 'mbe_display_admin_page';// Funzione di callback che mostra il contenuto della pagina.
$icon_url = 'dashicons-admin-page';
$position = 0;
# Aggiungi il menu admin personalizzato
add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position );
$submenu_pages = array(
# Evita pagine duplicate. Aggiungi una pagina di sottomenu con lo stesso slug del parent.
array(
'parent_slug' => 'nwcm',
'page_title' => 'Riepilogo News',
'menu_title' => 'Riepilogo',
'capability' => 'read',
'menu_slug' => 'nwcm',
'function' => 'mbe_display_admin_page',// Usa la stessa funzione di callback del menu parent.
),
# Post Type :: Visualizza tutti i post
array(
'parent_slug' => 'nwcm',
'page_title' => '',
'menu_title' => 'Visualizza News',
'capability' => '',
'menu_slug' => 'edit.php?post_type=nwcm_news',
'function' => null,// Non serve una funzione di callback.
),
# Post Type :: Aggiungi nuovo post
array(
'parent_slug' => 'nwcm',
'page_title' => '',
'menu_title' => 'Aggiungi News',
'capability' => '',
'menu_slug' => 'post-new.php?post_type=nwcm_news',
'function' => null,// Non serve una funzione di callback.
),
# Taxonomy :: Gestisci categorie news
array(
'parent_slug' => 'nwcm',
'page_title' => '',
'menu_title' => 'Categorie News',
'capability' => '',
'menu_slug' => 'edit-tags.php?taxonomy=nwcm_news_category&post_type=nwcm_news',
'function' => null,// Non serve una funzione di callback.
),
);
# Aggiungi ogni elemento del sottomenu al menu admin personalizzato.
foreach ( $submenu_pages as $submenu ) {
add_submenu_page(
$submenu['parent_slug'],
$submenu['page_title'],
$submenu['menu_title'],
$submenu['capability'],
$submenu['menu_slug'],
$submenu['function']
);
}
}
add_action( 'admin_menu', 'mbe_add_admin_menus', 1 );
/* Se aggiungi pagine di sottomenu personalizzate extra che non sono Custom Post Type o Custom Taxonomy, dovrai
* creare una funzione di callback per ognuna delle voci di sottomenu personalizzate create sopra.
*/
# Pagina Admin di default per il Menu Admin Personalizzato
function mbe_display_admin_page() {
# Mostra il contenuto della pagina admin personalizzata dal nuovo menu admin personalizzato.
echo '<div class="wrap">' . PHP_EOL;
echo '<h2>Titolo della mia pagina admin personalizzata</h2>' . PHP_EOL;
echo '<p>Questa è la pagina admin personalizzata creata dal menu admin personalizzato.</p>' . PHP_EOL;
echo '</div><!-- end .wrap -->' . PHP_EOL;
echo '<div class="clear"></div>' . PHP_EOL;
}
}
Agganciati a parent_file
per evidenziare correttamente le voci di sottomenu dei tuoi Custom Post Type e Custom Taxonomy con la tua pagina/menu parent personalizzato.
if ( ! function_exists( 'mbe_set_current_menu' ) ) {
function mbe_set_current_menu( $parent_file ) {
global $submenu_file, $current_screen, $pagenow;
# Imposta il sottomenu come attivo/corrente mentre sei nel tuo Custom Post Type (nwcm_news)
if ( $current_screen->post_type == 'nwcm_news' ) {
if ( $pagenow == 'post.php' ) {
$submenu_file = 'edit.php?post_type=' . $current_screen->post_type;
}
if ( $pagenow == 'edit-tags.php' ) {
$submenu_file = 'edit-tags.php?taxonomy=nwcm_news_category&post_type=' . $current_screen->post_type;
}
$parent_file = 'nwcm';
}
return $parent_file;
}
add_filter( 'parent_file', 'mbe_set_current_menu' );
}
Se hai bisogno di chiarimenti su come funziona tutto questo, leggi le seguenti pagine dall'inizio alla fine.
- Aggiungere Menu Admin Parent Personalizzati
- Aggiungere Menu Admin Child Personalizzati
- Ruoli e Capacità in WordPress
- Registrare Custom Post Types
- Registrare Custom Taxonomies
- WordPress Plugin API :: Riferimento Azioni
- WordPress Plugin API :: Riferimento Azioni ::
init
- WordPress Plugin API :: Riferimento Azioni ::
admin_menu
- WordPress Plugin API :: Riferimento Filtri
- Lista di tutti gli Hook WordPress (inclusi azioni e filtri)

Sfortunatamente non è ciò di cui ho bisogno :( Ho già controllato il codex e non parla del mio caso; Aggiungere un menu di tassonomia personalizzato a un menu creato con "add_menu_page". L'esempio che hai fornito sopra non utilizza "add_menu_page" ma crea semplicemente un nuovo menu di primo livello.. Questo è il motivo per cui ho usato 'show_in_menu' => 'nwcm'
; Ho bisogno che il mio custom post type + tassonomia associata siano visualizzati sotto il menu creato usando add_menu_page
.. È un po' complesso e non sono sicuro che sia possibile ottenere questo risultato.

@numediaweb Ho provato a lungo a passare una stringa all'argomento show_in_menu
per register_post_type();
come admin.php?page=nwcm
... Ma semplicemente non funzionava. Tuttavia, con la mia soluzione, si ottiene un po' più di flessibilità e libertà nello sviluppo dell'amministrazione di WordPress. Puoi mescolare pagine di amministrazione personalizzate, pagine di Post Type personalizzati e pagine di Tassonomia personalizzata. Dai un'occhiata alla modifica alla mia risposta. :)

Grazie Michael per il tempo dedicato alla risposta :) Beh, sebbene la soluzione che hai fornito funzioni, ha uno svantaggio; perdi il "gancio" di WordPress o il collegamento tra il custom post type e il menu generato. Ciò significa che quando clicchi ad esempio su "Aggiungi News" verrai portato alla pagina corretta ma il menu a sinistra non sarà evidenziato perché WordPress non conosce la connessione tra il custom post type "nwcm_news" e la voce "submenu_page".. Penso che ciò che sto cercando di ottenere sia impossibile.. cambierò approccio! grazie

@numediaweb L'altra opzione che hai è registrare il tuo Custom Post Type e la tua tassonomia personalizzata. Associandoli automaticamente sotto lo stesso menu. Poi, puoi aggiungere e personalizzare pagine di amministrazione come voci di sottomenu sotto il menu del tuo Custom Post Type. Quindi, fondamentalmente, operando con una logica inversa rispetto a ciò che desideri fare. Questo permetterebbe alle voci del tuo sottomenu di evidenziarsi correttamente.

@numediaweb Ho aggiunto una correzione per evidenziare correttamente le voci del sottomenu del tuo Custom Post Type e della tassonomia personalizzata con la tua pagina/menu genitore personalizzato di amministrazione.

Ecco come ho realizzato questo: all'interno dell'azione admin_menu, ho aggiunto una voce di sottomenu al menu principale ('nwcm') con il parametro menu_slug impostato sull'URL della pagina di modifica della tassonomia.
add_submenu_page('nwcm', 'Categorie news', 'Categorie news', 'edit_posts', 'edit-tags.php?taxonomy=nwcm_news&post_type=nwcm_news',false );

Molto illustrativo che puoi usare la variabile $menu_slug
per puntare dove vuoi. Mi sono registrato qui solo per poter votare la tua risposta.

Fantastico! Esattamente quello che stavo cercando! L'unico svantaggio è che non mantiene quel sottomenu espanso quando sei su quella pagina. Non è un grosso problema nel mio caso.

Questo è quello che funziona! Solo una nota: quando registri la tua tassonomia normalmente agganci a 'init', per modificare la funzione add_submenu_page dovresti agganciare alla funzione 'admin_menu' - qualcosa come add_action('admin_menu', function(){ add_submenu_page() } );

C'è il filtro parent_file che può essere utilizzato per risolvere il problema dell'espansione del menu.
