Il y a quelques temps, on m’a demandé d’ajouter une petite fonctionnalité à WordPress: un widget sur le tableau de bord pour voir les dates de connexion des utilisateurs.
Rien de bien méchant mais on y trouve des notions sympa pour modifier le backoffice de WordPress.
On peut facilement modifier le code pour ajouter d’autres informations ou traiter les infos différemment.
Je partage donc une version très simplifiée du code sous forme de mini plugin.
Création du plugin
La première chose à faire est de créer un dossier dans wp-content/plugins. Ce dossier doit avoir le même nom que le fichier du plugin. Dans notre exemple nous allons nommer le dossier « last-user-login ».
Ensuite nous allons créer un fichier » last-user-login.php » dans ce même dossier et y ajouter le code suivant:
<?php /* Plugin Name: Last user login Plugin URI: http://old.htmlcss.fr Description: Permet d'afficher les dates des dernières connexions des utilisateurs sur le tableau de bord. Author: François Riant Version: 0.1 Author URI: http://old.htmlcss.fr */
Rien qu’avec ce code, vous avez quelque chose qui apparaît dans les extensions de WordPress.
Enregistrer la date de connexion
Avant de pouvoir afficher une information, il faut l’avoir!
Nous allons donc commencer par stocker la date et l’heure de connexion pour chaque utilisateur dans une nouvelle variable.
Pour cela nous allons utiliser le hook « wp_login » pour mettre à jour la nouvelle variable; que nous allons nommer « lul_last_login« .
Voici la code à ajouter:
//Capture la date de connexion de l'utilisateur et l'enregistre au format timestamp dans une nouvelle donnée meta. add_action( 'wp_login', 'lul_savedate', 10, 2); function lul_savedate( $user_login, $user ) { update_user_meta( $user->ID, 'lul_last_login', time() ); }
Petite explication
Ici, la ligne suivante
add_action( 'wp_login', 'lul_savedate' );
Signifie que nous allons lancer la fonction « lul_savedate » Quand quelqu’un se connecte.
Maintenant la ligne
update_user_meta( $user->ID, 'lul_last_login', time() );
La fonction lancée par le hook ‘wp_login’ accepte deux paramètres. Le premier est le pseudo de l’utilisateur et le deuxième est un objet qui contient les informations de l’utilisateur, dont l’ID.
Nous allons utiliser cette ID pour mettre à jour les informations de l’utilisateur grâce à la fonction « update_user_meta » qui accepte plusieurs paramètres.
Nous lui donnons l’identifiant de l’utilisateur, l’ID, le nom de la variable à mettre à jour puis la valeur de cette même variable.
Il faut savoir que si la variable n’existe pas, elle est ajoutée.
Afficher le widget sur le tableau de bord
Ici nous allons utiliser le hook « wp_dashboard_setup » . Ce hook donne accès aux options de personnalisation liées au tableau de bord. Ce hook est notamment utilisé pour ajouter ou supprimer des widgets de tableau de bord de WordPress. Ça tombe bien et voici ce que ça donne:
add_action('wp_dashboard_setup', 'lul_add_widget'); function lul_add_widget() { wp_add_dashboard_widget('lul_widget_user_info', 'Dernière connexion des utilisateurs','lul_render_widget'); }
Comme précédemment, notre hook appelle une fonction « lul_add_widget ». Et cette fonction lance « wp_add_dashboard_widget » qui prends plusieurs paramètres qui sont:
- Un identifiant, ici j’ai choisi « lul_widget_user_info »
- Un titre
- Le nom de la fonction à lancer pour afficher le widget
Passons aux choses sérieuses
Le widget va contenir un tableau de la liste de tous les utilisateurs en affichant leur nom, leur rôle et la date de connexion. Dans un premier temps, il faut récupérer la liste des utilisateurs grâce à « get_users » que nous gardons dans la variable $user_list.
N’hésitez pas consulter la documentation si vous souhaitez modifier les argument passés à get_users.
function lul_render_widget() { $args = [ 'role__in' => ['administrator', 'editor', 'author', 'contributor', 'subscriber'], 'orderby' => 'login', 'order' => 'ASC', ]; $user_list = get_users($args); }
Maintenant nous allons ajouter la partie HTML et les résultats de notre requête conservé dans $user_list. Ici nous utiliserons un simple tableau HTML.
function lul_render_widget() { $args = [ 'role__in' => ['administrator', 'editor', 'author', 'contributor', 'subscriber'], 'orderby' => 'login', 'order' => 'ASC', ]; $user_list = get_users($args); ?> <table class="lul_user_table" cellspacing="0"> <thead> <tr> <td width="33.3333%"><strong>Utilisateur</strong></td> <td width="33.3333%"><strong>Rôle</strong></td> <td width="33.3333%"><strong>Dernière connexion</strong></td> </tr> <thead> <tbody> <?php foreach ($user_list as $key => $user) : $user_id = $user->data->ID; $user_name = $user->data->display_name; $user_role = $user->roles; $last_date = lul_get_user_last_login($user_id); ?> <tr> <td width="33.3333%"><?= $user_name ?></td> <td width="33.3333%"><?= $user_role[0] ?></td> <td width="33.3333%"><?= $last_date ?></td> </tr> <?php endforeach; ?> </tbody> </table> <?php }
Ici nous bouclons sur le résultât pour afficher les informations et nous appelons « lul_get_user_last_login » pour récupérer la nouvelle variable que nous avons créé précédemment. Voici le code de cette fonction:
function lul_get_user_last_login($user_id) { $last_login = get_user_meta($user_id, 'lul_last_login'); if (empty($last_login)) { return 'jamais'; } else { $the_login_date = strftime('Le %d %B %Y à %Hh%M', $last_login[0]); $time_in_utf8 = iconv(mb_detect_encoding($the_login_date, mb_detect_order(), true), "UTF-8", $the_login_date); return $time_in_utf8; } }
Petite explication
Nous commençons par récupérer la variable avec « get_user_meta« .
Puis si la variable n’est pas vide, nous traitons sa valeur pour avoir un affichage compréhensible sous la forme Jour mois année heure minute.
La variable est stockée via la fonction « time » de PHP.
Nous utiliserons donc les fonctions PHP suivantes pour traiter l’information
Dans certain il est nécessaire de définir le format de la local pour que PHP affiche la date en français. Cela peut être fait en ajoutant le code suivant. Mais méfiez-vous, WordPress gère déjà ce genre de paramètre, vérifiez à deux fois si vous l’ajoutez.
setlocale(LC_TIME, 'fr_FR.utf8','fra');