Un système de « User Switching » sans plugin !
Intro
Vous le savez, j’aime les plugins, j’en fais tout le temps, mais j’aime aussi créer des astuces et tutoriels que je poste souvent chez Geekpress.fr.
Et, même si un plugin existe, j’aime me lancer le défi de faire une chose dans le genre en plus léger.
Aujourd’hui j’ai eu envie d’ajouter un lien « Switch To » dans les utilisateurs afin de pouvoir me connecter à la place d’un autre membre sans connaitre son mot de passe, dans le but de faire des tests de ce que peux voir ou faire cette personne qui a un rang autre que administrateur par exemple.
Du code alors ?
Oui du code on en a environ 50 lignes (2.5ko), ce qui est très correct comparé au très connu plugin « User Switching » (16.8ko). Attention, je ne dis pas que je fais ce que fais ce plugin, ni que ce plugin n’est pas bien ou lourd. Juste que si vous avez un besoin simple de passer d’un user à l’autre, alors je le fais en 2.6ko 😉
A link to the past
Ajoutons d’abord un lien pour chaque utilisateurs, dans la page d’administration des utilisateurs et seulement pour les administrateurs. Je ne permets pas à un membre d’accéder à un rang administrateur et aussi, en toute logique, seul l’admin a besoin de faire ce genre de tests. Aussi, je ne mets pas le lien sur mon propre compte, inutile.
J’utilise le filtre user_row_actions pour ajouter un lien qui va contenir 2 nouvelles variables :
- un ID de user à switcher
- un token de sécurité (nonce)
Jusque là , rien d’exceptionnel. Voici la suite.
Le monstre (mais commenté)
BOUM, oui ça fait mal, mais ça fait le café. Je ne fais pas « juste » un switch, je gère un backswitch. Sans le backswitch le code est un peu plus court mais vous oblige à vous déconnecter du compte switché pour vous reconnecter sur le votre, j’ai donc préféré cette version.
Que se passe t-il dans tout ça !?
Et bien, dissecons un peu ce monstre:
- Je commence par vérifier que les valeurs soient bien envoyées et sont correctes.
- Ensuite j’essaie de faussement me connecter à la place de ce membre, je ne peux pas utiliser wp_signon() car je n’ai pas le mot de passe !
- Puis si c’est bien le nouveau membre qui a pris ma place, on redirige sur l’accueil et pas ailleurs, l’index, il a logiquement le droit. Si c’est toujours moi le membre connecté, j’affiche un message d’erreur bloquant (un wp_die()).
- Mais avant de le rediriger sur l’accueil, je vais créer une donnée transitoire valide 1 jour (modifiez le temps a souhait) afin de pouvoir stocker un message m’invitant à revenir sur mon compte. Seul moi (en tout cas, mon adresse IP) pourra voir ce message et cliquer dessus.
- Là si je clique sur ce lien, un paramètre « IP » est ajouté afin de comparer l’ID de l’IP envoyé de le véritable, si c’est bien le même, alors c’est une demande de backswitch, je supprime donc le transient.
- Ce n’est qu’en dernier et dans tous les cas que je vérifie si la donnée transitoire existe, dans ce cas je l’affiche. Ce qui signifie qu’elle devrait rester affichée pour vous (votre IP) pendant 24h maxi à moins que vous ne reveniez sur votre compte ou que vous ne vous déconnectiez de ce compte.
Justement, et la déconnection ?
Voilà , on y est, la dernière fonction à hooker et terminé. Il faut effectivement gérer la suppression du transient si vous vous déconnectiez de ce compte au lieu de revenir sur le votre, que ce soit d’une action désirée ou non, faisant résultat d’un test justement.
Cette fois, on recrée l’ID selon l’IP et on supprime le transient associé. Si il n’existe pas, pas de requête, n’ayez crainte 😉
Outro
Le code requiert peut-être un niveau un peu plus élevé que mes astuces, mais pour faire un user switch en 50 lignes, faut ce qu’il faut !
Et vous, l’utiliseriez-vous ?
Réagir à cet article