On m’a demandé il y a quelques jours de créer un système qui interdirait à un utilisateur WordPress d’effectuer une installation. J’ai donc créé un plugin simple et je voulais partager avec vous les bases de ce plugin. Dans ce tutoriel, nous couvrirons les filtres WordPress, les actions, la gestion des colonnes des utilisateurs et d’autres bonnes choses.
Étape 1 : Créer le plugin
Encore une fois, là c’est très compliqué, il suffit de créer un nouveau dossier avec « wp-content/plugins » appelé « ban-users ». Dans ce dossier, créez un nouveau fichier appelé « ban-users.php », ouvrez-le et collez ce code :
<?php
/*
Plugin Name: Ban Users
Plugin URI: http://www.remicorson.com
Description: Allows you to ban users
Author: Remi Corson
Version: 1.0
Author URI: http://www.remicorson.com
*/
Étape 2 : Ajouter une case à cocher sur la page de profil des utilisateurs
La première chose que nous devons faire est d’ajouter une case à cocher sur chaque page d’édition de profil utilisateur. Lorsque vous cochez cette case, une méta-option utilisateur sera stockée qui indiquera que l’utilisateur n’est plus autorisé à se connecter à votre site Web.
Voici le code :
/**
* Admin init
*
* @access public
* @since 1.0
* @return void
*/
function rc_admin_init(){
// Edit user profile
add_action( 'edit_user_profile', 'rc_edit_user_profile' );
add_action( 'edit_user_profile_update', 'rc_edit_user_profile_update' );
}
add_action('admin_init', 'rc_admin_init' );
Ce code crée simplement un appel à une fonction que nous devons créer maintenant. Cette fonction ajoutera une case à cocher à la page de profil des utilisateurs.
/**
* Adds custom checkbox to user edition page
*
* @access public
* @since 1.0
* @return void
*/
function rc_edit_user_profile() {
if ( !current_user_can( 'edit_users' ) ) {
return;
}
global $user_id;
// User cannot disable itself
$current_user = wp_get_current_user();
$current_user_id = $current_user->ID;
if ( $current_user_id == $user_id ) {
return;
}
// Check if enabled
$checked = checked( get_user_option( 'rc_banned', $user_id, false ) );
// Display checkbox
echo '<table class="form-table">
<tr>
<th scope="row">Ban User</th>
<td>
<label for="rc_ban">
<input name="rc_ban" type="checkbox" id="rc_ban" '. $checked .' />Ban this user</label>
</td>
</tr>
</table>';
}
Il nous faut maintenant la fonction qui va enregistrer dans la base de données la valeur de la case à cocher :
/**
* Save custom checkbox
*
* @access public
* @since 1.0
* @return void
*/
function rc_edit_user_profile_update() {
if ( !current_user_can( 'edit_users' ) ) {
return;
}
global $user_id;
// User cannot disable itself
$current_user = wp_get_current_user();
$current_user_id = $current_user->ID;
if ( $current_user_id == $user_id ) {
return;
}
// Lock
if( isset( $_POST['rc_ban'] ) && $_POST['rc_ban'] = 'on' ) {
rc_ban_user( $user_id );
} else { // Unlock
rc_unban_user( $user_id );
}
}
Comme vous pouvez le voir, cette nouvelle fonction utilise deux autres fonctions : rc_ban_users() et rc_unban_users(). Leurs noms sont assez explicites, le premier stockera dans la base de données le fait qu’un utilisateur est banni, le second débloquera des utilisateurs.
Étape 3 : bannir les utilisateurs
Il est maintenant temps de créer la fonction rc_ban_users(). Dans cette fonction, nous devons vérifier si une valeur est déjà stockée, et sinon nous devons stocker la valeur. C’est la raison pour laquelle j’appelle une fonction que je décrirai plus tard : rc_is_user_banned() :
/**
* Ban user
*
* @access public
* @since 1.0
* @return void
*/
function rc_ban_user( $user_id ) {
$old_status = rc_is_user_banned( $user_id );
// Update status
if ( !$old_status ) {
update_user_option( $user_id, 'rc_banned', true, false );
}
}
Étape 4 : Annuler l’interdiction d’utilisateurs
La fonction suivante est à l’opposé de celle que nous venons de créer : nous devons donner la possibilité de « dé-interdire » les utilisateurs :
/**
* Un-ban user
*
* @access public
* @since 1.0
* @return void
*/
function rc_unban_user( $user_id ) {
$old_status = rc_is_user_banned( $user_id );
// Update status
if ( $old_status ) {
update_user_option( $user_id, 'rc_banned', false, false );
}
}
Étape 5 : L’utilisateur est-il interdit ?
Nous avons vu dans rc_ban_users() et rc_unban_users() que nous utilisons une fonction appelée rc_is_user_banned() pour vérifier si un utilisateur est banni ou non. Créons-le :
/**
* Checks if a user is already banned
*
* @access public
* @since 1.0
* @return void
*/
function rc_is_user_banned( $user_id ) {
return get_user_option( 'rc_banned', $user_id, false );
}
Fondamentalement, cette fonction renvoie simplement la valeur de l’option enregistrée dans rc_ban_users().
À l’heure actuelle, nous avons une nouvelle case à cocher sur la page d’édition utilisateur qui devrait ressembler à ceci :
La dernière étape consiste à accrocher une fonction au formulaire de connexion pour éviter aux utilisateurs interdits de se connecter.
Étape 5 : évitez aux utilisateurs interdits de se connecter
Pour ce faire, nous devons utiliser un filtre par défaut WordPress appelé « wp_authenticate_user ». À ce filtre, nous allons accrocher une fonction appelée « rc_authenticate_user() ». Cette fonction utilisera le Classe WP_Error.
/**
* Check if user is locked while login process
*
* @access public
* @since 1.0
* @return void
*/
function rc_authenticate_user( $user ) {
if ( is_wp_error( $user ) ) {
return $user;
}
// Return error if user account is banned
$banned = get_user_option( 'rc_banned', $user->ID, false );
if ( $banned ) {
return new WP_Error( 'rc_banned', __('<strong>ERROR</strong>: This user account is disabled.', 'rc') );
}
return $user;
}
Maintenant, il ne nous reste plus qu’à ajouter le filtre :
add_filter( 'wp_authenticate_user', 'rc_authenticate_user', 1 );
Nous avons créé un plugin qui ajoute une case à cocher à la page d’édition du profil utilisateur. Nous avons utilisé une deuxième fonction pour stocker la valeur sur la case à cocher et nous créons une fonction pour interdire un utilisateur WordPress et une autre pour déverrouiller un utilisateur. Nous avons également créé une petite fonction pour vérifier si un utilisateur est banni ou non. Et nous avons finalement accroché une fonction au filtre « wp_authenticate_user » en utilisant la classe par défaut WP_Error WordPress.
Télécharger le code complet sur Github