WordPress intègre par défaut six rôles Administrateur, éditeur, Contributeur, auteur, abonné et un sixième rôle en multisite : super Admin.
Nous allons voir comment créer un nouveau rôle pour vos abonnés et comment afficher le contenu en fonction du nouveau rôle attribué.
À quoi peu nous servir de créer un nouveau rôle ?
Je pourrais vous donner pas mal de raison pour créer un nouveau rôle pour les abonnés ici dans le cadre de se tutoriel je voudrais conserver le rôle abonné par défaut et je voudrais créer un abonnement premium pour monétiser mon blog.
Pour créer ce nouveau rôle (abonnement premium) dans WordPress je vais ajouter le code suivant dans mon fichier function.php de mon thème :
// Ajuoter un rôle add_role('premium_user', 'Abonnement Premium', array( 'read' => true, // true : aurtorise la lecture des page et article 'edit_posts' => false, // false : Interdit d'ajouter des articles ou des pages 'delete_posts' => false, // false : Interdit de supprimer des articles ou des pages ));
Add_role : premium_user sera l’identifiant de mon nouveau rôle et Abonnement Premium sera le nom du rôle que je vais attribuer à mes futurs abonnés qui voudront cet abonnement.
IMPORTANT : Dans l’identifiant et le nom du nouveau rôle vous ne devez pas avoir d’accents ni de caractères spéciaux au risque d’avoir un message d’erreur qui peut-être résolu quant intervenant sur la base de données.
Read : true ici j’autorise la lecture
Edit_post : false je n’autorise pas la possibilité d’ajouter un article
Delete_post : false je n’autorise pas la possibilité supprimer un article
Vous pouvez voir sur le codex les différentes permissions que vous pouvez attribuer.
Une fois que créer le nouveau rôle , il me faudrait maintenant définir quel contenu qui va être affiché pour cet abonnement pour ça je vais créer une page template que je vais appelé Premium pour mon exemple :
<?php /** * Template Name: Premium * * Ma page pour l'abonnement premium */ get_header(); ?> <div id="container"> <div id="content" role="main"> </div><!-- #content --> </div><!-- #container --> <?php get_sidebar(); ?> <?php get_footer(); ?>
Puis ont va ajouter la fonction current_user
avec l’identifiant du nouveau rôle premium_user et celui de l’administrateur administrator qui va permettre d’autoriser seulement les utilisateurs qui ont l’abonnement premium et l’administrateur à pouvoir accéder au contenu de cette page :
<?php global $current_user; if ($current_user->roles[0] == 'premium_user' || $current_user->roles[0] == 'administrator' ) { echo 'je suis en Abonnement Premium'; // le contenu a affiché pour les membres premium } else { echo 'je suis pas en Abonnement Premium'; }?>
Pour supprimer un rôle dans WordPress il vous suffit d’ajouter la ligne suivante dans votre fichier function.php de votre thème en indiquant son identifiant :
remove_role( 'author' );
Pour l’ajout de rôle on peut aussi ce basé sur un rôle existant et lui ajouter des capacités.
function nouveau_role_abonne_premium() {
//Copier du Rôle ABONNE et des Capacités
/*
Dans le cas de l'abonné il a qu'une capacité définit 'read' voir <a href="http://codex.wordpress.org/Roles_and_Capabilities" rel="nofollow ugc">http://codex.wordpress.org/Roles_and_Capabilities</a>
Rôle par défaut de wordpress : 'administrator' 'editor' 'author' 'contributor' 'subscriber'
*/
$abonne_role = get_role('subscriber');
$caps_abonne_role = $abonne_role->capabilities;
//Ajouter les Capacitées au nouveau Rôle "Abonnement Premium"
add_role('premium_user', 'Abonnement Premium', $caps_abonne_role);
//Modifier le nouveau Rôle "Abonnement Premium"
$abonne_premium_role = get_role('premium_user');
//Enlever des Capacitées
// $abonne_premium_role -> remove_cap('CAPACITE_SUPPRIMER');
//Ajouter des Capacitées
// $abonne_premium_role -> add_cap('CAPACITE_AJOUTER');
}
add_action('init','nouveau_role_abonne_premium');
Pour ma part ce qui me pose problème c’est lorsque l’on créer un Custom Post Type avec des capacités spécifiques me permettant d’attribuer uniquement ces capacités à un nouveau rôle. (Le rôle à accès comme un auteur a l’édition de poste mais n’a pas accès à l’édition d’articles voir code ci-dessous).
function nouveau_role_membre() {
//Copier du Rôle AUTEUR et des Capacités
$auteur_role = get_role('author');
$caps_auteur_role = $auteur_role-&gt;capabilities;
//Ajouter les Capacités au nouveau Rôle "Membre" (identifiant unique, nom d'affichage &amp; ces droits)
add_role('auteur_membre', 'Membre', $caps_auteur_role);
//Modifier le nouveau Rôle "Membre"
$auteur_membre_role = get_role('membre_hem');
//Enlever des Capacités
$auteur_membre_role => remove_cap('edit_published_posts');
$auteur_membre_role => remove_cap('publish_posts');
$auteur_membre_role => remove_cap('delete_published_posts');
$auteur_membre_role => remove_cap('edit_posts');
$auteur_membre_role => remove_cap('delete_posts');
//On conserve la capacité de 'upload_files', 'read'
//Ajouter des Capacités pour l'exemple le custom post type permet la publication des recettes
$auteur_membre_role => add_cap('edit_published_recettes');
$auteur_membre_role => add_cap('publish_recettes');
$auteur_membre_role => add_cap('delete_published_recettes');
$auteur_membre_role => add_cap('edit_recettes');
$auteur_membre_role => add_cap('delete_recettes');
}
add_action('init','nouveau_role_membre');
Mais là où je n’arrive pas à donner ces capacités nativement c’est pour les rôles ‘administrator’ ‘editor’ ‘author’ ‘contributor’ avec les mêmes droits qu’un article. J’ai lu de la doc sur le filtre map_meta_cap peut être une solution mais je bloque dessus.
Peut-être avez-vous une piste à me suggérer.
Bonjour Céline,
La solution effectivement ic’est d’ utiliser map_meta_cap , il faut le déclarer en true dans votre post type et ensuite modifier les capacités.
Important si vous changer les capacités, il faut les remettre par défaut et ensuite en attribuer de nouvelles pour quelles soit prises en compte, car cela implique des modifications dans la base de données du blog.
<?php
function recettes_type() {
$args = array(
'label' => __('Recettes'),
'singular_label' => __('Recettes'),
'public' => true,
'_edit_link' => 'post.php?post=%d',
'capability_type' => 'post',
'map_meta_cap' => true, // <—— ont autorise l'attribution des capacités
'supports' => array('title', 'editor', 'thumbnail')
);
register_post_type( 'recettes' , $args );
register_taxonomy_for_object_type('post_tag', 'recettes','show_tagcloud=1&hierarchical=true');
// Création d'un nouveau rôle
if ( !get_role('nouveau_role') )
{
global $wp_roles;
if ( !isset( $wp_roles ) ) $wp_roles = new WP_Roles();
$caps = $wp_roles->get_role('editor')->capabilities; // <—— on lui attribu les capacité du role éditeur
$caps = array_merge( $caps, array( 'edit_recettes' => true, 'publish_recettes' => true ) ); // <—— on autorise les capacité du role Chef recettes
$wp_roles->add_role( 'nouveau_role', 'Chef recettes', $caps );
}
}
add_action('init', 'recettes_type');
?>
Le problème c’est que ce nouveau rôle ne doit pas avoir accès aux articles.
Dans ce cas, vous pouvez restreindre le rôle de cette façon :
# Ici on ajoute le role #
$edit_editor = get_role('editor');
# Ici on donne les droits a l'éditeur #
$edit_editor->add_cap('upload_files');
# L'éditeur ne peu plus avoir acces a l'édition aux articles et catégories #
# <a href="http://codex.wordpress.org/Roles_and_Capabilities" rel="nofollow ugc">http://codex.wordpress.org/Roles_and_Capabilities</a> #
$edit_editor->remove_cap('edit_others_posts');
$edit_editor->remove_cap('manage_categories');
Même si le nouveau rôle il est basé sur un rôle existant
Bonjour, tout d’abord je tiens à vous remercier pour ce tuto qui m’a été très bénéfique. Cependant pour m’en servir pleinement j’aimerais que lors de l’inscription au site, selon des éléments à choisir l’utilisateur est un role spécifique. Savez comment je peux faire? Si un plugin pouvait m’aider?
Merci de votre réponse.
Bonsoir Jules,
Désoler de ne pas vous avoir répondu plutôt il y a un plugin qui pourrait vous aider :
WP Roles at Registration
Super ! Merci beaucoup c’est exactement ce dont j’avais besoin !!
Hello, merci pour ce partage ! J’ai juste une question. J’ai créé un custom post type pour des produits et un autre pour des utilisateurs.
J’ai changé d’avis en me disant qu’utiliser le rôle abonné de wordpress m’avancerai car je n’aurais plus à créer le custom post utilisateur.
Tout ca pour dire que ton post tombe à point mais comment faire pour aficher une page prope à chaque membre qu’il peut consulter et pas seulement un template accessible que par eux. Une sorte de mini espace membre ou j’affiche leurs profil (en front ) .
Je ne sais pas si j’ai été clair.
merci en tout cas
Bonjour onto,
Pour restreindre l’accès a une page template il suffi d’ajouter le code ci-dessous en remplaçant premium_role par le rôle que vous voulez, pour donner accès au contenu de la page.
<?php
// On verifie que l'utilisateur a bien le role premium
if( !current_user_can( 'premium_role' ) ) {
// et si l'utilisateur na pas le rôle premium il est rediriger ver la page d'accueil
wp_redirect( home_url() );
die();
}
?>
Merci fred !
BOnjour, j’utilise Ajax Event Calendar. Mais je n’arrive pas à permettre à un utilisateur de se créer ses propres évènements. Quand je vais dans progfil des utilisateurs et que je mets calenders. rien à faire ca ne fonctionne pas ça m’emmène sur un autre lien qui n’a rien à voir avec la création d’un évènement.
Merci
Bonjour Franck,
Je viens de tester le plugin Ajax Event Calendar sur wordpress 3.6 et il fonctionne bien cela peu venir d’un autres plugin essayer de les désactiver un par un et de tester Ajax Event Calendar.
Bonjour Franck,
je souhaite créer un rôle avec un accès restreint au backend qui se limiterait à la consultation du profil et à la consultation des données contenues dans le plugin ‘Flamingo’. Crois-tu que cela sois possible ?
Aurais-tu une piste à me suggérer ?
J’ai essayé avec le plugin ‘User Role Editor’ mais cela ne semble pas fonctionner comme je le souhaite…
Merci par avance pour ta réponse
Bonjour Charly,
Pour créer un nouveau rôle tu dois ajouter le code (comme exemple) suivant et définir les permissions :
add_role('nouveau_role', 'Nouveau role', array(
'edit_files' => false,
'edit_plugins' => false,
'edit_theme_options' => false,
'edit_themes' => false,
'install_plugins' => false,
'install_themes' => false,
'switch_themes' => false,
'update_plugins' => false,
'update_themes' => false,
'read' => false,
'edit_users' => false
));
Pour les permissions : Codex WordPress
Bonjour,
Merci pour ce tuto facile à appréhender avec un léger niveau.
Seulement j’ai un petit soucis, j’ai fait une petite erreur lors de la création d’un nouveau role et depuis il reste affiché dans la liste des roles présents alors qu’il n’est plus dans le functions.php
Merci de bien m’aider à trouver comment les supprimer, je n’arrive pas à les trouver :/ Même dans la BDD…
Bonne journée.
Bonjour,
ajouter le code suivant dans le fichier function.php avec l’id du rôle a supprimer :
remove_role( 'id_du_role' );
Puis supprimer la ligne 😉
Merci beaucoup !!!!
Ca me sauve que d’avoir 2 fois le même rôle sans savoir lequel est quoi >.<
Merci d'avoir répondu vite aussi !
Bonne journée !
Une petite question supplémentaire, j’ai suivit pour créer un post type, mais pour associer un role juste a ce post type et pas un autre. C’est a dire qu’il puisse publier que ce type là et pas avoir accès a la publications des posts normaux. Et qu’il puisse gérer les commentaires de ce même type de post avec.
Actuellement mon code est ainsi :
function stream_type() {
$args = array(
'label' => __('Stream'),
'singular_label' => __('Stream'),
'public' => true,
'_edit_link' => 'post.php?post=%d',
'capability_type' => 'post',
'map_meta_cap' => true, // <—— ont autorise l'attribution des capacités
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'stream' ),
'has_archive' => true,
'hierarchical' => false,
'menu_position' => null,
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
);
register_post_type( 'stream' , $args );
register_taxonomy_for_object_type('genres', 'stream');
if ( !get_role('stream_user') ){
global $wp_roles;
if ( !isset( $wp_roles ) ) $wp_roles = new WP_Roles();
//$caps = $wp_roles->get_role('author')->capabilities; // <—— on lui attribu les capacité du role éditeur
$caps = array_merge( $caps, array( 'edit_stream' => true, 'publish_stream' => true ) ); // <—— on autorise les capacité du role Chef recettes
$wp_roles->add_role( 'stream_user', 'Streamer', $caps );
}
}
add_action('init', 'stream_type');
Salut !
Je revenais pour le même problème depuis le temps.
Je n’ai pas eu de problèmes vraiment jusque maintenant, mais ce qui m’embête c’est que les “Streamers” peuvent acceder aussi aux messages normaux =<
j'ai séparé en 2 posts :
function stream_type() {
$args = array(
'label' => __('Streams'),
'singular_label' => __('Stream'),
'public' => true,
'_edit_link' => 'post.php?post=%d',
'capability_type' => 'post',
'map_meta_cap' => true, // true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'stream' ),
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ),
'menu_icon' => 'dashicons-video-alt3',
);
register_post_type( 'stream' , $args );
register_taxonomy_for_object_type('genres', 'stream');
}
et
add_role('stream_user', 'Streamer', array(
'delete_posts' => true,
'delete_published_posts' => true,
'edit_posts' => true,
'edit_published_posts' => true,
'publish_posts' => true,
'read' => true,
'upload_files' => true,
'delete_pages' => true,
'delete_published_pages' => true,
'edit_pages' => true, // true : aurtorise la lecture des page et article
'edit_published_pages' => true,
));
Merci de bien vouloir m’aider.
Bonne journée.
Petit up ? >.<
Bonjour,
Merci pour ces éléments.
Je voulais savoir s’il était possible de créer un rôle avec un droit spécifique.
Ce droit et de pouvoir créer/modifier/supprimer seulement certaines pages. Ces pages spécifiques pourrait être catégorisé d’une certaine manière si besoin