Skip to content

Tout pour WordPress, le développement web — et plus encore

🚀 Connexion automatique à WordPress en PHP : extrait pour accès démo

🚀 Connexion automatique à WordPress en PHP : extrait pour accès démo

L’accès démo au panneau d’administration WordPress est une approche classique pour vendre des plugins et des thèmes. Un acheteur potentiel visite le site, voit l’identifiant et le mot de passe, les copie, va sur wp-login.php, les colle… Trop d’étapes. Chaque clic supplémentaire filtre une partie de l’audience.

La connexion automatique par lien résout ce problème de manière radicale: un seul lien, et l’utilisateur est déjà dans le panneau d’administration, sous le compte requis. Pas de copier-coller, pas de confusion avec les identifiants.

Voici un extrait de code PHP prêt à l’emploi qui ajoute ce mécanisme à n’importe quel site WordPress. Vingt lignes de code, la personnalisation prend 2 minutes. L’extrait ne dépend pas du thème, n’intègre pas de dépendances externes et s’active comme un plugin classique.

💡 Aperçu rapide:

  • Vous ajoutez un paramètre d’URL à l’adresse de connexion (par exemple ?autologin=demo), et wp_signon() authentifie l’utilisateur sous le compte spécifié avec une redirection vers la section souhaitée
  • L’extrait est présenté sous forme de plugin WordPress séparé: activez-le et il fonctionne immédiatement, désactivez-le et il est inactif, le thème n’y est pas lié
  • La version de base gère un seul compte, la version étendue prend en charge un nombre illimité de comptes avec différents rôles et points de destination
  • Personnalisation pour votre projet: modifiez trois valeurs dans le code (identifiant, mot de passe, clé d’URL), téléversez le plugin sur le site et obtenez la connexion par lien

Comment fonctionne la connexion automatique: mécanique de wp_signon

Le cœur de toute la structure est la fonction wp_signon(). Elle accepte les identifiants: identifiant, mot de passe et indicateur de mémorisation, puis authentifie l’utilisateur exactement comme le formulaire standard sur wp-login.php. La différence est que l’appel se fait de manière programmatique, sans intervention humaine. L’utilisateur suit simplement le lien et se retrouve à l’intérieur.

Le hook after_setup_theme se déclenche avant l’envoi des en-têtes, ce qui est critique car wp_signon() définit un cookie d’authentification, et les cookies doivent être envoyés avant toute sortie vers le navigateur. Si vous placez l’appel sur init ou un hook ultérieur, la connexion peut ne pas fonctionner. C’est précisément pourquoi l’extrait est conçu comme un plugin séparé plutôt qu’inséré dans le functions.php du thème: le plugin se charge aux toutes premières étapes du cycle de vie de WordPress, garantissant que le hook s’exécutera à temps.

Code complet pour extension WordPress de connexion automatique

Voici le plugin minimal fonctionnel:

1<?php
2/*
3Plugin Name: Auto Login
4Plugin URI: https://techblog.sdstudio.top/
5Version: 1.0.0
6Author: Harri Bell-Thomas
7*/
8
9function autologin() {
10 if ( $_GET['autologin'] !== 'demo' ) {
11 return;
12 }
13
14 $creds = array(
15 'user_login' => 'demo',
16 'user_password' => 'demo',
17 'remember' => true,
18 );
19
20 $user = wp_signon( $creds, false );
21
22 if ( ! is_wp_error( $user ) ) {
23 wp_redirect( admin_url() );
24 exit;
25 }
26}
27add_action( 'after_setup_theme', 'autologin' );

Détaillons-le ligne par ligne. La condition $_GET['autologin'] === 'demo' vérifie que le paramètre requis est passé dans l’URL: wp-login.php?autologin=demo. Le tableau $creds contient l’identifiant, le mot de passe et l’indicateur «se souvenir de moi». wp_signon() avec le paramètre false signifie: ne pas utiliser de cookie sécurisé (adapté au développement local et aux sites de staging sans HTTPS). En cas de succès, wp_redirect( admin_url() ) redirige l’utilisateur vers le panneau d’administration. En cas d’erreur (mot de passe incorrect, utilisateur inexistant), WordPress affiche le formulaire de connexion standard sans révéler qu’une tentative de connexion automatique a eu lieu.

Personnalisation pour votre projet

Pour adapter l’extrait, il suffit de modifier trois valeurs: le paramètre d’URL, l’identifiant et le mot de passe. Dans le bloc suivant, elles sont déplacées au début de la fonction pour plus de commodité:

1function autologin() {
2 $param = 'autologin';
3 $user = 'dummy';
4 $pass = 'pa55word';
5
6 if ( $_GET[ $param ] !== $user ) {
7 return;
8 }
9
10 $creds = array(
11 'user_login' => $user,
12 'user_password' => $pass,
13 'remember' => true,
14 );
15
16 $login = wp_signon( $creds, false );
17
18 if ( ! is_wp_error( $login ) ) {
19 wp_redirect( admin_url() );
20 exit;
21 }
22}

Trois règles lors de la personnalisation qui vous feront gagner des heures de débogage.

Premièrement: la valeur du paramètre $user ne doit pas correspondre aux clés réservées de WordPress. Quatre clés sont réservées: loggedout pour la déconnexion, action pour la réinitialisation du mot de passe, redirect_to pour les redirections après connexion, et wp_lang pour le changement de locale. Si vous utilisez l’un de ces mots, la connexion automatique ne fonctionnera pas ou cassera le comportement standard du cœur.

Deuxièmement: le mot de passe est stocké en clair dans le code du plugin, donc n’utilisez jamais cet extrait pour des comptes administrateur ou éditeur sur un site en production. Un utilisateur démo avec le rôle Abonné ou, au maximum, Éditeur, est acceptable. Un administrateur avec connexion automatique par lien est une brèche qu’un attaquant trouvera en une seconde.

Troisièmement: si le site fonctionne en HTTPS, remplacez false par true dans le deuxième argument de wp_signon(). Cela activera le cookie sécurisé et empêchera l’interception du jeton d’authentification pendant la transmission réseau.

L’adresse de connexion ressemblera à ceci: https://your-site.com/wp-login.php?autologin=dummy. En la suivant, l’utilisateur arrive instantanément dans le panneau d’administration. Pas d’écrans intermédiaires, pas de copier-coller d’identifiants.

Multi-comptes: un lien, différents comptes

Que faire si le site de démonstration présente le produit sous différents rôles? L’administrateur voit le panneau des réglages, l’éditeur voit l’interface de publication, l’abonné voit son espace personnel. Pour ce scénario, nous étendons l’extrait pour prendre en charge plusieurs comptes:

1<?php
2/*
3Plugin Name: Auto Login
4Plugin URI: https://techblog.sdstudio.top/
5Description: Automatic login for demo accounts. Configure accounts in the array below.
6Version: 1.0.0
7Author: Harri Bell-Thomas
8*/
9
10$autologin_param = 'autologin';
11
12$autologin_accounts = array(
13 array(
14 'user' => 'demo',
15 'pass' => 'demo',
16 'location' => 'wp-admin',
17 ),
18 array(
19 'user' => 'editor_demo',
20 'pass' => 'demo',
21 'location' => 'wp-admin/post-new.php',
22 ),
23);
24
25function autologin() {
26 global $autologin_param, $autologin_accounts;
27
28 foreach ( $autologin_accounts as $account ) {
29 if ( $_GET[ $autologin_param ] === $account['user'] ) {
30 $creds = array(
31 'user_login' => $account['user'],
32 'user_password' => $account['pass'],
33 'remember' => true,
34 );
35
36 $user = wp_signon( $creds, false );
37
38 if ( ! is_wp_error( $user ) ) {
39 wp_redirect( admin_url( $account['location'] ) );
40 exit;
41 }
42 }
43 }
44}
45add_action( 'after_setup_theme', 'autologin' );

La mécanique est la même, mais le tableau $autologin_accounts stocke les identifiants de tous les utilisateurs démo, et foreach les parcourt à la recherche d’une correspondance par valeur de paramètre d’URL. Ajouter un nouveau compte revient à copier le bloc du tableau avec de nouvelles valeurs pour user, pass et location.

Le paramètre location accepte tout chemin relatif à l’intérieur de /wp-admin/: par exemple, options-general.php pour la page des réglages, edit.php pour la liste des articles, ou post-new.php pour créer un nouvel article. Vous pouvez également spécifier une URL complète pour rediriger vers le frontend, mais remplacez alors admin_url( $account['location'] ) par $account['location'] dans le code.

Le point d’entrée est le même: https://your-site.com/wp-login.php?autologin=editor_demo, et l’utilisateur atterrit sur la page de création d’article plutôt que sur la racine de l’administration. Pour le propriétaire du site de démonstration, cela signifie un contrôle total sur la première impression: chaque type d’utilisateur voit exactement la partie du produit qui correspond à ses intérêts.

⁉️🤔 Foire aux questions

Est-il sûr de stocker des mots de passe dans le code du plugin?

Non, ce n’est pas sûr. L’extrait a été conçu pour des sites de démonstration où les comptes sont intentionnellement publics et n’ont pas de privilèges réels. Sur un site de production avec de vrais utilisateurs, cette approche est inacceptable: le mot de passe en clair peut fuiter lors de tout audit de code. Pour les scénarios de production, envisagez un mécanisme de jeton à usage unique ou une authentification unique (SSO) via l’API REST avec vérification de nonce.

Pourquoi ne pas utiliser l’action wp_login, mais directement wp_signon?

Le hook wp_login se déclenche après une connexion réussie, il n’effectue pas l’authentification lui-même. wp_signon() est la fonction qui authentifie l’utilisateur: elle vérifie le mot de passe via wp_authenticate(), définit le cookie et déclenche wp_login en conséquence. Si vous avez besoin d’autoriser un utilisateur de manière programmatique uniquement, wp_signon est votre outil.

Puis-je insérer l’extrait dans functions.php au lieu d’un plugin séparé?

Oui, le code fonctionnera aussi dans le functions.php du thème. Mais un plugin est plus pratique: la connexion automatique n’est pas liée au thème et ne cassera pas lors du changement de thème. De plus, le plugin peut être désactivé en un clic sans modifier les fichiers sur le serveur.

Que faire si après la connexion, l’utilisateur n’est pas reconnu par is_user_logged_in?

C’est une particularité connue de wp_signon() lorsqu’il est appelé avant le hook init: le cookie est défini, mais la variable globale $current_user n’est pas encore mise à jour. La solution est d’appeler de force wp_set_current_user( $user->ID ) immédiatement après un wp_signon() réussi. Dans notre extrait, ce n’est pas critique car une redirection suit immédiatement, mais dans les scénarios sans redirection, la ligne est obligatoire.

L’extrait fonctionne-t-il sur multisite?

Oui, mais avec une réserve. wp_signon() authentifie l’utilisateur au sein du site actuel du réseau. Si le compte n’existe que sur l’un des sous-sites, la connexion automatique ne fonctionnera pas sur les autres. Pour une authentification croisée sur l’ensemble du réseau, utilisez une combinaison de wp_signon() et wp_set_auth_cookie() avec une installation forcée du cookie pour le domaine principal.

Extrait de connexion automatique: en résumé

Quinze lignes de PHP éliminent le principal point de friction dans l’entonnoir du site de démonstration: copier l’identifiant et le mot de passe. Un seul lien, et le visiteur est à l’intérieur du produit, avec le rôle et dans la section que vous avez choisis.

La version de base couvre le scénario «un utilisateur démo», la version étendue couvre un nombre illimité de rôles avec différents points de redirection. Les deux ne dépendent pas du thème, ne nécessitent pas de plugins tiers et s’activent en une minute.

La règle de sécurité principale est de ne pas élever les privilèges. Un utilisateur démo avec le rôle Abonné ou, au maximum, Éditeur est acceptable. Un administrateur avec connexion automatique par lien est une brèche qu’un attaquant trouvera en une seconde.

Si l’accès démo est un canal de vente pour vous, la connexion automatique cesse d’être un «plus appréciable» pour devenir un élément de conversion obligatoire. Un lien au lieu d’un identifiant et d’un mot de passe, c’est la différence entre «j’essaierai plus tard» et «j’essaie maintenant».