Rimuovere il menu dei Custom Post Type per utenti non amministratori
Ho cercato tutto il giorno senza trovare molte soluzioni.
Voglio limitare chi può vedere i miei Custom Post Type in base al livello utente (o in altro modo). Quindi se l'utente loggato non è un 'amministratore', i Custom Post Type aggiunti non saranno visibili.
Ecco parte di un Custom Post Type che ho creato:
add_action('init', 'portfolio_register');
function portfolio_register() {
$labels = array(
'name' => _x('Case Studies', 'nome generale del post type'),
'singular_name' => _x('Elemento Case Study', 'nome singolare del post type'),
'add_new' => _x('Aggiungi nuovo', 'elemento portfolio'),
'add_new_item' => __('Aggiungi nuovo elemento Case Study'),
'edit_item' => __('Modifica elemento Case Study'),
'new_item' => __('Nuovo elemento Case Study'),
'view_item' => __('Visualizza elemento Case Study'),
'search_items' => __('Cerca Case Studies'),
'not_found' => __('Nessun risultato trovato'),
'not_found_in_trash' => __('Nessun risultato nel cestino'),
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
/*'menu_icon' => get_stylesheet_directory_uri() . '/article16.png',*/
'rewrite' => true,
'capability_type' => 'post',
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title','editor','thumbnail')
);
register_post_type( 'portfolio' , $args );
}
Ecco le potenziali soluzioni che ho trovato ma che non funzionano per rimuovere il menu dei Custom Post Type:
function remove_menus()
{
global $menu;
global $current_user;
get_currentuserinfo();
if($current_user->user_login != 'admin')
{
$restricted = array(__('Articoli'),
__('Media'),
__('Link'),
__('Pagine'),
__('Commenti'),
__('Aspetto'),
__('Plugin'),
__('Utenti'),
__('Strumenti'),
__('Impostazioni')
);
end ($menu);
while (prev($menu)){
$value = explode(' ',$menu[key($menu)][0]);
if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
}// fine while
}// fine if
}
add_action('admin_menu', 'remove_menus');
Questo codice funziona per rimuovere i menu predefiniti ma non sono riuscito a farlo funzionare per i menu dei Custom Post Type. Inoltre è specifico per username, il che andrebbe bene se potessi aggiungere più utenti.
global $user_login;
get_currentuserinfo();
if (!current_user_can('update_plugins')) {
.......
}
Questo invece non ha funzionato affatto.
Grazie.
Codex - Registrare un Tipo di Post
Vedi gli argomenti capability_type
e capabilities
per register_post_type
.
Puoi passare all'argomento capabilities
un array di capacità da mappare ai cap necessari, ecco un esempio dell'array degli argomenti con capacità personalizzate.
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'rewrite' => true,
'capabilities' => array(
'publish_posts' => 'ADD_CAP_HERE',
'edit_posts' => 'ADD_CAP_HERE',
'edit_others_posts' => 'ADD_CAP_HERE',
'delete_posts' => 'ADD_CAP_HERE',
'delete_others_posts' => 'ADD_CAP_HERE',
'read_private_posts' => 'ADD_CAP_HERE',
'edit_post' => 'ADD_CAP_HERE',
'delete_post' => 'ADD_CAP_HERE',
'read_post' => 'ADD_CAP_HERE',
),
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title','editor','thumbnail')
);
Ovviamente dovrai sostituire ADD_CAP_HERE
con una capacità. Se vuoi limitare questo tipo di post agli amministratori, usa semplicemente una capacità che solo gli amministratori hanno, come manage_options
.
Tabella dei ruoli e delle loro capacità (per riferimento rapido).
http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table

Potresti spiegarmi ADD_CAP_HERE
? Ho bisogno di nascondere il menu del mio custom post type agli editor; Il tuo codice non ha aiutato a nascondere la voce del menu :(

@numediaweb -- Da http://codex.wordpress.org/Roles_and_Capabilities , puoi vedere un elenco di capacità per 'Editor' e superiori come 'edit_dashboard' (che funzionerà bene nel tuo caso)

Ok, dopo aver fatto ulteriori ricerche su Google ho finalmente trovato una risposta e l'ho combinata con uno degli script sopra per creare quello che volevo fare. Di seguito è riportato ciò che ho fatto nel caso qualcun altro stia cercando di fare lo stesso:
global $user_login;
get_currentuserinfo();
if (!current_user_can('update_plugins')) {
.....
}
Il codice sopra ottiene il livello dell'utente corrente e se ha i permessi per aggiornare/modificare i plugin, allora avrà accesso alle funzioni racchiuse.
add_filter( 'custom_menu_order', 'toggle_custom_menu_order' );
function remove_those_menu_items( $menu_order ){
global $menu;
foreach ( $menu as $mkey => $m ) {
$key = array_search( 'edit.php?post_type=portfolio', $m );
$keyB = array_search( 'edit.php?post_type=bio', $m );
$keyC = array_search( 'edit.php?post_type=philo', $m );
if ( $key || $keyB || $keyC )
unset( $menu[$mkey] );
}
return $menu_order;
}
add_filter( 'menu_order', 'remove_those_menu_items' );
Il codice sopra è ciò che effettivamente ti permette di rimuovere i tipi di post personalizzati dal menu di amministrazione. Puoi aggiungere tutte le variabili $key
di cui hai bisogno. Invece di entrare nei dettagli su cosa significa il codice sopra, puoi leggere l'originale qui.

Non so cosa non vada nel codice, ma ogni volta che devo limitare le voci di menu agli utenti uso: Editor Menu Amministratore un plugin che fa esattamente questo per te.

Grazie per la risposta ma non è esattamente quello che mi serve fare. Permette di spostare le voci di menu e tutto il resto ma non di nascondere le voci di menu agli utenti non amministratori. Inoltre preferirei non usare un plugin per questo. Grazie
