web-dev-qa-db-fra.com

Restreindre l'affichage de type d'article personnalisé par rôle d'utilisateur

J'ai créé un type de publication personnalisé et deux ou trois rôles d'utilisateur personnalisés. Je souhaite pouvoir restreindre l'affichage du type de publication en fonction de rôles spécifiques.

Existe-t-il un moyen simple de limiter cela?

2
Brob

Chaque rôle a des capacités.

Voici un simple contributeur à notre entreprise: (il écrit et édite)

add_role('contributor', 'Contributor', array(
    'read' => true,
    'edit_posts' => true,
    'delete_posts' => false,
));

Maintenant, il a une nouvelle capacité (il peut éditer des posts d'autres peuples)

function add_capability()
{
    $role = get_role('contributor');
    $role->add_cap('edit_others_posts');
}
add_action('admin_init', 'add_capability');

Maintenant, ajoutons ses nouvelles fonctionnalités pour notre nouveau type de publication. Commençons par créer le type de message:

function create_myposttype()
{
    register_post_type(
        'myposttype',
        array(
            'public' => true,
            'capability_type' => 'myposttype',
            'capabilities' => array(
                'publish_posts' => 'publish_myposttypes',
                'edit_posts' => 'edit_myposttypes',
                'edit_others_posts' => 'edit_others_myposttypes',
                'read_private_posts' => 'read_private_myposttypes',
                'edit_post' => 'edit_myposttype',
                'delete_post' => 'delete_myposttype',
                'read_post' => 'read_myposttype',
            ),
        )
    );
}
add_action('init', 'create_myposttype');

Le type de publication est créé mais le contributeur n'a aucun pouvoir dessus. Permet de lui donner un peu de jus:

function add_capability()
{
    $role = get_role('contributor');
    $role->add_cap('read_myposttype');
    $role->add_cap('edit_myposttypes');
    $role->add_cap('delete_myposttype', false); // to be sure
}
add_action('admin_init', 'add_capability');

Les fonctions read_post et read_ * garantissent que l'utilisateur ayant le rôle attribué ne pourra pas voir et accéder à cette zone actuelle. Il obtiendra cette erreur générique Wordpress:

Vous ne disposez pas des autorisations suffisantes pour accéder à cette page

Et faisons en sorte que nos auteurs (ce rôle par défaut) ne puissent pas voir le myposttype posts:

function remove_author_capability()
{
    $role = get_role('author');
    $role->add_cap('read_myposttype', false);
}
add_action('admin_init', 'remove_author_capability');

N'oubliez pas de nettoyer:

function add_roles_on_activation() // add roles on activation
{
    add_role('contributor', 'Contributor', array(
        'read' => true,
        'edit_posts' => true,
        'delete_posts' => false,
    ));
}
register_activation_hook(__FILE__, 'add_roles_on_activation');

function add_roles_removal()  // we clean up after ourselves
{
    remove_role('contributor');
}
register_deactivatin_hook(__FILE__, 'add_roles_removal');

Maintenant, si vous voulez juste supprimer des éléments du menu (en les rendant accessibles par URL de toute façon), voici comment:

À partir de la barre d’administration (ce petit menu en survol):

function my_edit_adminbar($wp_admin_bar)
{
    if(current_user_can('read_myposttype'))
        $wp_admin_bar->remove_node('new-myposttype');
}
add_action('admin_bar_menu', 'my_edit_adminbar');

Au menu:

function my_edit_menu()
{
    if(current_user_can('read_myposttype'))
    {
        $slug = 'edit.php?post_type=myposttype';
        remove_menu_page($slug);
    }
}
add_action('admin_menu', 'my_edit_menu');
3
aifrim

Tout d’abord, voici comment nous pouvons obtenir le rôle d’utilisateur actuel.

<?php 

// Get the current user id
$user_id = get_current_user_id(); 

// Get the user data based on this id
// returned in an arryay
$user_data = new WP_User( $user_id );


// We could echo out the first role item 
// in the array like this...   
echo $user->roles[0];


// Or we could print the full
// array like this 
print_r($user->roles);

?> 

Nous pouvons maintenant utiliser les données ci-dessus pour construire une instruction if simple dans les modèles. Cela dépendra de ce que vous essayez d’atteindre mais ...

<?php 

$user_roll = $user->roles[0];
if($user_roll =="administrator") {

    // Code here will only be run if current
    // user is an admin
}
?> 

Vous en avez le blues;)

0
Edd Smith

Bien .. Je ne vois pas de code ... donc je ne sais pas si vous avez créé le type de message personnalisé vous-même ou utilisé un plugin. Je suppose que vous avez créé le type de publication personnalisé dans functions.php. Vous pouvez y avoir une instruction if pour vérifier si l'utilisateur dispose de certaines fonctionnalités.

<?php current_user_can( $capability, $args ); ?>

Cela aiderait vraiment si vous pouviez poster du code, afin que je puisse donner un exemple spécifique sur la façon de procéder.

http://codex.wordpress.org/Function_Reference/current_user_can

0
gdaniel