Diije

Créer une metabox d’information sur l’auteur dans l’administration WordPress

Si vous administrez un site multi-utilisateurs, comme un blog communautaire ou un site de Communiqués de Presse SEO par exemple, vous êtes sûrement confrontés à la problématique de la modération des utilisateurs. Il est parfois nécessaire d’accéder à la page d’édition du profil d’un utilisateur, le plus souvent pour modifier son rôle sur le site.

Aujourd’hui, je vous propose de rajouter une metabox sur la page d’ajout et d’édition d’articles, qui ne s’affichera qu’aux administrateurs du site, et leur permettra de pouvoir aller directement sur le profil de l’auteur de l’article, sans passer par la liste de tous les utilisateurs, sans effectuer une recherche parmi les utilisateurs, sans passer par la case départ et malheureusement sans toucher 20 000F.

Pour les pressés, je vous propose d’aller voir directement le code complet. Pour les autres, voyons les choses un peu plus en détail.

Commençons par la création d’une metabox. Les metaboxes sont tous les blocs visibles sur les pages d’édition de l’interface d’administration de WordPress :

La metabox "format" pour choisir le format d'un post dans WordPress

Vous pouvez très facilement les réduire, les déplacer, les cacher ou afficher davantage de boites en cliquant sur « Options de l’écran » en haut à droite de la page. Et il est très facile d’en ajouter de nouvelles grâce à la fonction <a href="http://codex.wordpress.org/Function_Reference/add_meta_box">add_meta_box()</a> :

//création de la metabox (id css, titre, fonction contenu, type de page, contexte, priorité)
function dfr_author_metabox() {
	add_meta_box( 'dfr_author_metabox', 'Auteur', 'dfr_author_metabox_callback', 'post', 'side', 'high');
}
//affichage de la metabox
if (current_user_can('manage_options')) {
	add_action('admin_init', 'dfr_author_metabox', 1);
}

On indique à la fonction add_meta_box l’id css de notre nouvelle metabox (doit être unique, sinon attendez-vous à des problèmes 😉 ), le titre du bloc, la fonction de callback, c’est à dire celle qui gèrera l’affichage du contenu, le type de post sur lequel on veut ajouter la metabox (post, page ou type personnalisé), le contexte (au centre, sur la colonne de droite …) et la priorité (l’ordre d’affichage en quelque sorte, plus la metabox est prioritaire, plus son emplacement sera proche du haut de la page).

Ensuite on s’assure de n’afficher notre metabox qu’aux utilisateurs qui peuvent gérer les options (if (current_user_can('manage_options'))), c’est à dire aux administrateurs. Si vous souhaitez permettre également aux éditeurs de voir la metabox, il faudra utiliser une capacité de niveau moins élevé pour ce test.

Enfin, si notre utilisateur est effectivement administrateur du site, on ajoute la metabox (avec une priorité 1 ici pour qu’elle soit vraiment très haut dans la page).

Reste à savoir ce que notre boîte va afficher :

//contenu de la metabox
function dfr_author_metabox_callback() {
	global $wpdb;
		
	$author_ID = get_post($post->ID)->post_author;
	$role = $wpdb->get_var("SELECT meta_value FROM {$wpdb->usermeta} WHERE meta_key = '{$wpdb->prefix}capabilities' AND user_id = {$author_ID}");
	$rarr = unserialize($role);
	$roles = is_array($rarr) ? array_keys($rarr) : array('non-user');

	?><ul>
	<li><?php the_author_meta('nickname',$author_ID); ?> (<?php echo $roles[0]; ?>)</li>
	<li><a href="<?php echo get_author_posts_url($author_ID); ?>"><?php the_author_posts(); ?> article(s) publié(s)</a></li>
	<?php
	if( function_exists( 'get_compteur' )) {
		?><li><?php echo get_compteur($author_ID); ?> article(s) refusé(s)</li><?php
	}
	?>
	<li><a href="<?php echo get_bloginfo('url'); ?>/wp-admin/user-edit.php?user_id=<?php echo $author_ID; ?>">Editer le profil</a></li>
	</ul><?php
}

On commence par récupérer l’ID de l’auteur, ce qui nous permettra de récupérer plus facilement les informations dont on a besoin.
Ensuite on récupère le rôle de l’auteur de l’article. Ce rôle est enregistré dans la base de données, sous la forme d’une variable sérialisée, qu’on va donc convertir avec <a href="http://php.net/manual/fr/function.unserialize.php">unserialize()</a>. On obtient un tableau contenant les rôles éventuels de l’auteur. Si on n’en trouve aucun, on lui attribue le « rôle » non-user.

Passons ensuite à l’affichage proprement dit. J’ai choisi d’afficher l’identifiant (nickname) de l’auteur, son rôle, un lien vers ses articles déjà publiés (avec un compteur du nombre d’articles publiés), et si mon magnifique plugin wp-compteur est installé, le nombre d’articles refusés pour cet auteur.
Enfin, j’ai ajouté un lien permettant d’aller modifier le profil de l’utilisateur si besoin était.

Rien ne vous empêche d’ajouter d’autres informations si vous le souhaitez.

Le code complet :

if (is_admin()) {
	//création de la metabox (id css, titre, fonction contenu, type de page, contexte, priorité)
	function dfr_author_metabox() {
		add_meta_box( 'dfr_author_metabox', 'Auteur', 'dfr_author_metabox_callback', 'post', 'side', 'high');
	}
	//affichage de la metabox
	if (current_user_can('manage_options')) {
		add_action('admin_init', 'dfr_author_metabox', 1);
	}
	//contenu de la metabox (html)
	function dfr_author_metabox_callback() {
		global $wpdb;
		
		$author_ID = get_post($post->ID)->post_author;
		$role = $wpdb->get_var("SELECT meta_value FROM {$wpdb->usermeta} WHERE meta_key = '{$wpdb->prefix}capabilities' AND user_id = {$author_ID}");
		$rarr = unserialize($role);
		$roles = is_array($rarr) ? array_keys($rarr) : array('non-user');
		
		?><ul>
		<li><?php the_author_meta('nickname',$author_ID); ?> (<?php echo $roles[0]; ?>)</li>
		<li><a href="<?php echo get_author_posts_url($author_ID); ?>"><?php the_author_posts(); ?> article(s) publié(s)</a></li>
		<?php
		if( function_exists( 'get_compteur' )) {
			?><li><?php echo get_compteur($author_ID); ?> article(s) refusé(s)</li><?php
		}
		?>
		<li><a href="<?php echo get_bloginfo('url'); ?>/wp-admin/user-edit.php?user_id=<?php echo $author_ID; ?>">Editer le profil</a></li>
		</ul><?php
	}
}

J’espère que ce petit hack vous sera utile pour gérer vos sites communautaires 🙂