È possibile nascondere l'interfaccia/menu dei Custom Post Type per ruoli utente specifici?
Quello che sto cercando di fare è nascondere completamente l'interfaccia UI per un custom post type da specifici ruoli utente... In precedenza ho trovato molte risorse su come disabilitare l'accesso all'utilizzo di questi CPT, ma nulla che permetta di nascondere completamente l'interfaccia UI dei CPT in base all'utente che ha effettuato l'accesso al pannello di amministrazione.
Questo è importante poiché ho bisogno che i clienti stiano completamente fuori dai custom post type del negozio, e se possono ancora vedere l'interfaccia UI del CPT del negozio nel pannello di amministrazione non fa differenza se le loro capacità sono limitate, dato che continueranno a chiedere come possono aggiungere prodotti in autonomia.
Preferirei non utilizzare un plugin per ottenere questo risultato, tuttavia se esistesse qualcosa che possa fare il lavoro in modo non appesantito andrebbe bene lo stesso.
Grazie per l'aiuto, SB

Come nascondere una voce di menu di un post type agli utenti non amministratori:
function wpse28782_remove_menu_items() {
if( !current_user_can( 'administrator' ) ):
remove_menu_page( 'edit.php?post_type=your_post_type' );
endif;
}
add_action( 'admin_menu', 'wpse28782_remove_menu_items' );
your_post_type
dovrebbe essere il nome del tuo effettivo post type.
MODIFICA -
Altre pagine di menu che puoi rimuovere:
remove_menu_page('edit.php'); // Articoli
remove_menu_page('upload.php'); // Media
remove_menu_page('link-manager.php'); // Collegamenti
remove_menu_page('edit-comments.php'); // Commenti
remove_menu_page('edit.php?post_type=page'); // Pagine
remove_menu_page('plugins.php'); // Plugin
remove_menu_page('themes.php'); // Aspetto
remove_menu_page('users.php'); // Utenti
remove_menu_page('tools.php'); // Strumenti
remove_menu_page('options-general.php'); // Impostazioni
MODIFICA 2 -
Rimozione delle voci di menu dei plugin.
Per i plugin, sembra che ti serva solo il parametro page=
nella query. L'altra cosa da notare è la priorità, che è il terzo argomento di add_action
per admin_menu
. Deve essere impostata abbastanza bassa (più alto è il numero, più bassa è la priorità) in modo che i plugin abbiano già aggiunto se stessi al menu.
function wpse28782_remove_plugin_admin_menu() {
if( !current_user_can( 'administrator' ) ):
remove_menu_page('cart66_admin');
endif;
}
add_action( 'admin_menu', 'wpse28782_remove_plugin_admin_menu', 9999 );

Curioso, wpse28782_remove_menu_items
è un nome di funzione scelto a caso o è specifico per WP? Inoltre, come potrei espandere questa idea per includere altri CPT o altri menu nativi di WP? Grazie ancora per l'aiuto!

@Mr.Brown - il nome della funzione si basa sull'id della tua domanda (controlla l'url), è semplicemente qualcosa che garantisce l'unicità, puoi chiamarla come preferisci purché non sia una funzione già esistente. Puoi anche aggiungere ulteriori chiamate remove_menu_page
per rimuovere altri CPT, così come altri voci di menu, vedi la mia modifica.

Solo un'ultima cosa - come posso trovare il nome del template utilizzato per i menu aggiuntivi dei plugin attualmente installati? es. remove_menu_page('cart_plugin');

Ho provato a passare il mouse sopra la voce del menu e utilizzare il percorso che mi ha dato ma niente da fare, continua a comparire, anche se le altre voci del menu corrispondono esattamente quando ci passi sopra il mouse come nel tuo esempio...Sto usando il plugin cart66 e questo è il percorso che ho ottenuto quando ho passato il mouse sopra remove_menu_page( 'admin.php?page=cart66_admin' );
- ma non sembra funzionare.

Fantastico, sei stato estremamente utile. Quindi tutti i plugin hanno bisogno solo dell'ultima parte del percorso e non di page=
, giusto?

@Mr.Brown - Credo di sì, almeno quelli che ho visto. Come test, all'interno della tua funzione admin_menu
puoi aggiungere global $menu;
e poi print_r( $menu );
, che rivelerà l'array da cui è costruito il menu (visualizza il sorgente della pagina, o racchiudilo in un tag <pre>
per una migliore leggibilità). L'elemento con indice 2 in ogni sotto-array del menu è quello che vuoi usare con remove_menu_page

Milo - grazie mille amico!...questo forum è sempre fantastico, ma tu, signore, mi hai davvero aiutato a imparare qualcosa per una volta, quindi grazie per la tua pazienza e per aver dedicato del tempo a spiegare tutto per un principiante come me! Cordiali saluti, SB.

Nota che questa soluzione rimuove il menu, ma non impedisce all'utente di accedere a quelle pagine tramite URL.

@MZAweb - vero, ma se leggi la domanda, non era quello che veniva chiesto. La possibilità di accedere alle pagine era già gestita tramite le capacità.

Risposta eccellente, ha funzionato perfettamente... grazie per aver incluso anche come nascondere elementi diversi dai CPT.

E per rimuovere Nuovo > Articolo | Media | Pagina | CPT
? Basta usare l'hook admin_bar_menu
- https://wordpress.stackexchange.com/a/76647/84219

La risposta accettata può essere utilizzata per nascondere i tipi di post personalizzati (e altri elementi assortiti) come descritto. Ma se vuoi nascondere il menu stesso del plugin CPT UI, puoi anche rimuovere l'azione che lo aggiunge al menu in primo luogo.
if( !current_user_can( 'administrator' ) ) {
remove_action( 'admin_menu', 'cptui_plugin_menu' );
}

Puoi anche utilizzare il plugin Adminimize. Questo plugin offre opzioni per tutti i tipi di post, metabox e molto altro ancora da nascondere in base ai diversi ruoli. Nessuna codifica richiesta.

Se vuoi nascondere il menu del plugin chiamato "Custom Post Type UI" (noto anche come CPTUI), non è possibile combinando il primo link con remove_menu_page.
Tutto quello che devi fare è:
function wpse_28782_remove_menus() {
remove_menu_page('cptui_main_menu');
}
add_action('admin_init', 'wpse_28782_remove_menus');

Se vuoi disabilitare menu specifici per un determinato ruolo utente, utilizza questo codice:
function wp2024_remove_unnecessary_menus() {
$current_user = wp_get_current_user();
// Definisci i menu da rimuovere
$menus_to_remove = [
'elementor',
'themes.php',
'plugins.php',
];
if ( in_array( 'user_role_slug', $current_user->roles, true ) ) {
foreach ( $menus_to_remove as $menu_slug ) {
remove_menu_page( $menu_slug );
}
}
}
add_action( 'admin_menu', 'wp2024_remove_unnecessary_menus', 99 );

Per nascondere i sottomenu di Woocommerce sotto il menu principale "Prodotti" per tutti i ruoli utente Shop Manager (Wordpress 5.1.1):
function remove_menus_shopmgr(){
// Se l'utente corrente è un gestore del negozio
if ( current_user_can('shop_manager') ) {
//rimuove il sottomenu Prodotti > Categorie
remove_submenu_page( 'edit.php?post_type=product','edit-tags.php?taxonomy=product_cat&post_type=product' );
//rimuove il sottomenu Prodotti > Tag
remove_submenu_page( 'edit.php?post_type=product','edit-tags.php?taxonomy=product_tag&post_type=product' );
}
}
add_action( 'admin_menu', 'remove_menus_shopmgr', 999 );

Se remove_menu_page
non funziona per te (a me non ha funzionato) invece di rimuovere il menu, un'alternativa è dire a WordPress di non mostrare il menu per il tipo di post:
function wpse28782_hide_menu_items() {
if( !current_user_can( 'administrator' ) ) {
$post_type = get_post_type_object( 'your_post_type');
if ($post_type) {
$post_type->show_in_menu = false;
}
}
}
add_action( 'admin_menu', 'wpse28782_hide_menu_items', 99 );
