Gestion des roles et capabilities WordPress

<?php
/*
Plugin Name: Test WordPress roles and capabilities
Description: Basic use of WordPress roles and capabilities management API
Version: 1.0
*/

if( !class_exists('wp_test_roles_and_capabilities') ){
class wp_test_roles_and_capabilities{
	
	public static function hooks(){
		
		//Création des roles dans "admin_init" uniquement pour le débug :
		//utiliser le hook d'activation de plugin lors de l'utilisation finale,
		//comme expliqué ici : http://codex.wordpress.org/Function_Reference/add_role
		add_action('admin_init',array(__CLASS__,'create_role'));
		
		//To add / remove menu panels :
		add_action('admin_menu', array(__CLASS__,'adjust_wp_menu'), 999);
	}	
	
	public static function create_role(){
		
		//Pour le détail des roles et capabilities, voir :
		//http://codex.wordpress.org/Roles_and_Capabilities
		
		//Récupération des capabilities d'un role existant :
		//$author_role = get_role('author');
		//$author_role['capabilities']; 

		//Ajouter/supprimer une capability à un role existant :
		//$author_role->add_cap('edit_others_posts');
		//$author_role->remove_cap('edit_others_posts');
		
		//Création d'un nouveau role "Contributeur spécial" pour tester les capabilities :
		remove_role( 'special_contributor' );
		$new_role = add_role(
				'special_contributor',
				'Contributeur spécial',
				array(
						
					//Default WP "Author" role capabilities :
					'read' => true,
					'edit_posts' => true,
					'delete_posts' => true,
					'publish_posts' => true,
					'delete_published_posts' => true,
					'edit_published_posts' => true,
					'upload_files' => true,

					//Additional roles :
		
					//Droits de création de nouvelles catégories (ou hierachical custom taxonomies). 
					//Permet de masquer le lien "Add new category" et la gestion de catégorie dans l'onglet "Posts" du BO.
					//N'agit pas sur la création de tags.
					'manage_categories' => false, 
						
					//Widgets :
					//'edit_theme_options' ajoute le menu "Appearance"
					//Voir ci-dessous self::adjust_wp_menu() pour le masquage des éléments du menu "Appearance" non souhaités
					'edit_theme_options' => true, 
					
				)
		);
		
		if( $new_role == null ){
			echo 'Erreur à la création du role "Contributeur spécial"';
		}

	}
	
	public static function adjust_wp_menu(){
		global $current_user;
		
		//Pour voir les identifiants des éléments de menu et sous menu : 
		//global $menu,$submenu;
		//var_dump($menu,$submenu);
		
		//On ne laisse que le sous menu widgets du menu "Appearance" pour les utilisateurs ayant le role "Contributeur spécial" :
		if( $current_user && in_array('special_contributor', $current_user->roles) ){
			remove_submenu_page( 'themes.php', 'themes.php' );
			remove_submenu_page( 'themes.php', 'customize.php' );
			//remove_submenu_page( 'themes.php', 'widgets.php' );
			remove_submenu_page( 'themes.php', 'nav-menus.php' );
			remove_submenu_page( 'themes.php', 'custom-header' );
			remove_submenu_page( 'themes.php', 'custom-background' );
			remove_submenu_page( 'themes.php', 'theme-editor.php' );
		}
	}
}
wp_test_roles_and_capabilities::hooks();
}

Voir http://codex.wordpress.org/Roles_and_Capabilities pour le détail des roles et capabilities WordPress.

Création d’un role
Utilisation la fonction add_role() pour créer un nouveau role avec des capabilities personnalisées.

Permissions de création de catégories :
Utiliser la capability « manage_categories » pour gérer la permission d’ajout de catégorie (voir create_role() dans le plugin ci-dessus).
Elle fonctionne pour les custom taxonomies hiérarchiques (mais pas pour les taxonomies non hiérarchiques, comme les tags, pour lesquelles on peut toujours ajouter un terme depuis l’édition d’article).

Permissions de création de tags :
Dans l’édition d’articles, permettre à un utilisateur d’assigner des tags sans pouvoir en créer n’est pas possible avec l’interface par défaut de la gestion de tags wp.
> il faut remplacer la métabox de tag par une autre customisée qui ne permet pas l’ajout de tag, via un plugin.

Test et ajout de capabilities :

  • la fonction permettant de savoir si un utilisateur a une capability est current_user_can(‘capability_a_tester’) qui retourne vraie si l’utilisateur a bien la capability dans son role.
  • on peut « inventer » des capabilities : pas de fonction spécifique pour créer une capability, juste tester if(current_user_can(‘notre_capability’)) pour afficher des métabox / panels de menus / widgets seulement pour les utilisateurs ayant un role incluant la capability « notre_capability ».

Affichage/masquage d’une métabox suivant l’utilisateur :

  • si c’est une métabox créée par un plugin à nous, c’est simple : on peut créer une capability (ou utiliser une capability existante) et la tester pour voir si on affiche ou non la métabox.
  • si c’est une métabox d’un autre plugin ou métabox par défaut wp, on peut soit faire un remove_meta_box, soit faire un hack CSS si pas d’autre moyen.

Affichage/masquage d’un panel ou sous panel BO (Comme « Posts », « Settings », « Tools » …) :

  • si c’est un panel créé par un plugin à nous, c’est simple : on peut créer une capability (ou utiliser une capability existante) et la tester pour voir si on affiche ou non le panel.
  • si c’est un panel d’un autre plugin ou panel par défaut wp on utilise remove_menu_page() ou remove_submenu_page()

Affichage/masquage des widgets :
Pour maîtriser l’apparition du panel « Widgets » dans le menu : utilisation de la capability « edit_theme_options » et du masquage de sous menus (voir adjust_wp_menu() dans la classe ci-dessus)
Pour masquer des widgets spécifiques :

  • Si c’est un widget d’un plugin à nous, même principe que pour les métaboxes et panels
  • Sinon, utilisation de la fonction unregister_widget()