Contenu principal

Un mini plugin pour créer un rôle utilisateur

Yop.

Dans la série des articles courts… Créer un rôle utilisateur « Propriétaire » pour mes clients : en somme, un Éditeur avec des super-pouvoirs.

J’avais fait, il y a fort longtemps et dans une contrée lointaine, un article ayant ce même but. Cette fois, le code est mis au gout du jour, et empaqueté dans un plugin. Comme ça, plus de problèmes.
Encore un petit truc que j’aurais dû faire depuis longtemps : mettre tout ceci au propre dans un petit plugin prêt à l’emploi.

En bref, voilà le code du plugin.

01020304050607080910111213141516171819202122232425262728293031323334

/* !---------------------------------------------------------------------------------*/
/* !	I18N										 */
/*-----------------------------------------------------------------------------------*/

add_action( 'plugins_loaded', 'sfor_lang_init' );
function sfor_lang_init() {
	load_plugin_textdomain( 'default', false, basename( dirname( __FILE__ ) ) . '/languages' );
}


/* !---------------------------------------------------------------------------------*/
/* !	CREATE THE NEW ROLE								 */
/*-----------------------------------------------------------------------------------*/

register_activation_hook( __FILE__, 'sfor_create_role' );

function sfor_create_role() {
	// Creates a Owner User Role (editor level, with super-powers)
	if ( $editor = get_role('editor') ) {
		remove_role( 'owner' );
		add_role( 'owner', 'Owner', $editor->capabilities );

		$owner = get_role('owner');
		// Can manipulate users
		$owner->add_cap( 'list_users' );
		$owner->add_cap( 'create_users' );
		$owner->add_cap( 'edit_users' );
		$owner->add_cap( 'promote_users' );
		$owner->add_cap( 'delete_users' );
		$owner->add_cap( 'remove_users' );
		// Can edit theme options and menus
		$owner->add_cap( 'edit_theme_options' );
	}
}

Le plugin ne fait que deux choses :

  1. Charger la traduction du nom du rôle.
  2. Créer le rôle à l’activation du plugin, s’il n’existe pas déjà.

Créer le rôle utilisateur

Avec la condition if je récupère déjà le rôle « editor », ce rôle me servira de base (en gros, je vérifie que le rôle existe bien).
En fait, ce nouveau rôle « Propriétaire » est un Éditeur auquel on va ajouter la possibilité de lister et éditer les utilisateurs, ainsi que de pouvoir éditer les options du thème et modifier les menus.
Noter l’utilisation de add_role() :

20

add_role('owner', 'Owner', $editor->capabilities);

'owner' : l’identifiant du rôle, au même titre que « editor » pour un éditeur.
'Owner' : le nom du rôle. Un détail important ici, on ne met pas directement 'Propriétaire' ni même __('Owner'). Le nom doit être ici en anglais, non traduit. C’est la condition pour avoir un nom de rôle qui sera traduit correctement plus tard par WordPress. J’y reviendrais plus tard.
$editor->capabilities : le rôle créé est tout d’abord identique à un éditeur, on lui donne les même capacités.

Ensuite, on récupère le rôle ‘owner’ nouvellement créé puis on lui ajoute les capacités désirées.
Et c’est tout. Cette partie du code n’est utilisée qu’une seule fois, le nouveau rôle est alors enregistré en base de donnée.

Internationalisation

Cette partie a été un long parcours semé de pièges pour trouver la bonne façon de faire.
Il y a 3 points importants à respecter pour que tout fonctionne bien.

  1. On a déjà le premier, au niveau add_role() : ne pas traduire directement le nom du rôle.
  2. Au moment d’utiliser load_plugin_textdomain(), il faut se servir du domaine « default », qui est le domaine qu’utilise WordPress.
  3. Dans le fichier le langage .po il faut utiliser le contexte « User role », ce qui va donner :
    msgctxt "User role"
    msgid "Owner"
    msgstr "Propriétaire"

Hop, terminé. Finalement l’article n’est pas aussi court que prévu ^^.

See ya!

Edith : l’idée de Rahe dans les commentaires étant tout à fait pertinente, le rôle est supprimé puis recréé à chaque activation du plugin.