Rimuovere il menu dei Custom Post Type per utenti non amministratori

19 gen 2011, 23:06:13
Visualizzazioni: 18.7K
Voti: 2

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.

0
Tutte le risposte alla domanda 3
2
14

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

20 gen 2011 15:27:19
Commenti

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 numediaweb
21 lug 2014 00:07:57

@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)

Douglas.Sesar Douglas.Sesar
8 dic 2014 16:44:39
1

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.

20 gen 2011 12:57:36
Commenti

Attenzione a questo aspetto quando si utilizza il plugin Woocommerce, poiché sovrascrive l'opzione per filtrare il menu! L'ho risolto aggiungendo add_filter( 'custom_menu_order' , '__return_true', 999);

numediaweb numediaweb
21 lug 2014 00:41:40
2

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.

20 gen 2011 01:10:53
Commenti

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

jetDL jetDL
20 gen 2011 12:33:14

@Bainternet Anche io uso solitamente Admin Menu Editor, ma a volte non riconosce correttamente i limiti di capacità che imposto.

User User
5 gen 2012 18:39:48