web-dev-qa-db-fra.com

Supprimez le menu Type de message personnalisé pour les utilisateurs non administrateurs.

J'ai fait des recherches à ce sujet toute la journée et je n'ai pas obtenu beaucoup de résultats.

Je souhaite limiter le nombre de personnes pouvant voir mes types de publication personnalisés par niveau d'utilisateur (ou d'une autre manière). Par conséquent, si la personne connectée n’est pas un "administrateur", les types de publication personnalisés ajoutés ne lui sont pas visibles.

Voici une partie d'un type de message personnalisé que j'ai:

add_action('init', 'portfolio_register');

function portfolio_register() {

    $labels = array(
        'name' => _x('Case Studies', 'post type general name'),
        'singular_name' => _x('Case Study Item', 'post type singular name'),
        'add_new' => _x('Add New', 'portfolio item'),
        'add_new_item' => __('Add New Case Study Item'),
        'edit_item' => __('Edit Case Study Item'),
        'new_item' => __('New Case Study Item'),
        'view_item' => __('View Case Study Item'),
        'search_items' => __('Search Case Studies'),
        'not_found' =>  __('Nothing found'),
        'not_found_in_trash' => __('Nothing found in Trash'),
        '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 );
}

Et voici les solutions potentielles que j'ai trouvées qui ne fonctionnent pas pour la suppression du menu Custom Post Type:

function remove_menus()
{
    global $menu;
    global $current_user;
    get_currentuserinfo();

    if($current_user->user_login != 'admin')
    {
        $restricted = array(__('Posts'),
                            __('Media'),
                            __('Links'),
                            __('Pages'),
                            __('Comments'),
                            __('Appearance'),
                            __('Plugins'),
                            __('Users'),
                            __('Tools'),
                            __('Settings')
        );
        end ($menu);
        while (prev($menu)){
            $value = explode(' ',$menu[key($menu)][0]);
            if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
        }// end while

    }// end if
}
add_action('admin_menu', 'remove_menus');

Ce qui précède fonctionne pour supprimer les éléments de menu par défaut, mais je ne pouvais pas le faire pour supprimer un menu Type de message personnalisé. De plus, il est spécifique à un nom d'utilisateur, ce qui est correct si je peux y ajouter plus d'un utilisateur.

global $user_login;
get_currentuserinfo();
   if (!current_user_can('update_plugins')) {
      .......
   }

Ce qui précède n'a pas fonctionné du tout.

Merci.

2
jetDL

Codex - Type de registre

Voir les arguments capability_type et capabilities pour register_post_type. Vous pouvez transmettre à l'argument capabilities un tableau de fonctionnalités à mapper sur les majuscules nécessaires. Voici un exemple du tableau args avec des fonctionnalités personnalisées.

$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')
); 

Vous voudriez bien sûr remplacer ADD_CAP_HERE par une capacité. Si vous souhaitez limiter ce type de publication aux administrateurs, utilisez simplement une fonctionnalité réservée aux administrateurs, telle que manage_options.

Tableau des rôles et leurs plafonds (pour référence rapide).
http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table

14
t31os

Ok, après avoir fait un peu plus de recherches sur Google, j'ai finalement trouvé une réponse et je l'ai combinée avec l'un des scripts ci-dessus pour créer ce que je cherche à faire. Voici ce que j'ai fait au cas où quelqu'un voudrait en faire autant:

global $user_login;
get_currentuserinfo();
if (!current_user_can('update_plugins')) {
    .....
}

Le code ci-dessus obtiendra le niveau actuel des utilisateurs. S'ils ont l'autorisation de mettre à jour/éditer des plugins, ils ont accès aux fonctions incluses.

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' );

Ce qui précède vous permet réellement de supprimer les types de publication personnalisés du système de menus admin. Vous ajoutez simplement autant de $key que nécessaire. Au lieu d’entrer dans les détails sur ce que cela signifie, vous pouvez lire le original ici .

4
jetDL

je ne sais pas ce qui ne va pas avec le code, mais chaque fois que je dois limiter les éléments de menu aux utilisateurs que j'utilise: Editeur de menu Admin un plugin qui fait exactement cela pour vous.

0
Bainternet