Skip to content

Todo para WordPress, el desarrollo web — y mucho más

🚀 Inicio de sesión automático en WordPress en PHP: fragmento para acceso de demostración

🚀 Inicio de sesión automático en WordPress en PHP: fragmento para acceso de demostración

El acceso de demostración al panel de administración de WordPress es un enfoque estándar para vender plugins y temas. Un comprador potencial visita el sitio, ve el usuario y la contraseña, los copia, va a wp-login.php, los pega... Demasiados pasos. Cada clic extra filtra a una parte de la audiencia.

El inicio de sesión automático mediante enlace resuelve este problema de forma radical: un enlace, y el usuario ya está en el panel de administración, bajo la cuenta requerida. Sin copiar y pegar, sin confusiones con las credenciales.

A continuación encontrará un fragmento de PHP listo para usar que añade este mecanismo a cualquier sitio WordPress. Veinte líneas de código, la personalización toma 2 minutos. El fragmento no depende del tema, no incorpora dependencias externas y se activa como un plugin normal.

💡 Resumen rápido:

  • Usted añade un parámetro URL a la dirección de inicio de sesión (por ejemplo ?autologin=demo), y wp_signon() autoriza al usuario bajo la cuenta especificada con una redirección a la sección requerida
  • El fragmento está formateado como un plugin de WordPress independiente: actívelo y funciona de inmediato, desactívelo y se deshabilita, el tema no está vinculado a él
  • La versión básica sirve a una cuenta, la versión extendida admite cualquier número de cuentas con diferentes roles y puntos de destino
  • Personalización para su proyecto: cambie tres valores en el código (usuario, contraseña, clave URL), suba el plugin al sitio y obtenga inicio de sesión mediante enlace

Cómo funciona el inicio de sesión automático: mecánica de wp_signon

El núcleo de toda la estructura es la función wp_signon(). Acepta credenciales: usuario, contraseña y bandera de recordar, luego autoriza al usuario exactamente como el formulario estándar en wp-login.php. La diferencia es que la llamada ocurre de forma programática, sin participación humana. El usuario simplemente sigue el enlace y termina dentro.

El hook after_setup_theme se dispara antes de que se envíen las cabeceras, lo cual es crítico porque wp_signon() establece una cookie de autenticación, y las cookies deben enviarse antes de cualquier salida al navegador. Si usted cuelga la llamada en init o un hook posterior, el inicio de sesión podría no funcionar. Esa es precisamente la razón por la que el fragmento está formateado como un plugin separado en lugar de insertarse en el functions.php del tema: el plugin se carga en las etapas muy tempranas del ciclo de vida de WordPress, garantizando que el hook se ejecutará a tiempo.

Código completo para plugin de inicio de sesión automático en WordPress

Aquí está el plugin mínimo funcional:

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' );

Analicémoslo línea por línea. La condición $_GET['autologin'] === 'demo' verifica que el parámetro requerido se pase en la URL: wp-login.php?autologin=demo. El array $creds contiene el usuario, la contraseña y la bandera "recordar". wp_signon() con el parámetro false significa: no usar cookie segura (adecuado para desarrollo local y sitios de prueba sin HTTPS). En caso de éxito, wp_redirect( admin_url() ) redirige al usuario al panel de administración. En caso de error (contraseña incorrecta, usuario inexistente), WordPress muestra el formulario de inicio de sesión estándar sin revelar que hubo un intento de inicio de sesión automático.

Personalización para su proyecto

Para adaptar el fragmento, basta con cambiar tres valores: el parámetro URL, el usuario y la contraseña. En el siguiente bloque se han movido al inicio de la función por conveniencia:

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}

Tres reglas al personalizar que le ahorrarán horas de depuración.

Primera: el valor del parámetro $user no debe coincidir con las claves reservadas de WordPress. Cuatro claves están reservadas: loggedout para cerrar sesión, action para restablecer contraseña, redirect_to para redirecciones tras el inicio de sesión, y wp_lang para cambiar la configuración regional. Si usted toma cualquiera de estas palabras, el inicio de sesión automático no funcionará o romperá el comportamiento estándar del núcleo.

Segunda: la contraseña se almacena como texto plano en el código del plugin, así que nunca use este fragmento para cuentas de administrador o editor en un sitio en producción. Un usuario de demostración con el rol de Suscriptor o, como máximo, Editor, es aceptable. Un administrador con inicio de sesión automático mediante enlace es un agujero que un atacante encontrará en un segundo.

Tercera: si el sitio funciona sobre HTTPS, reemplace false por true en el segundo argumento de wp_signon(). Esto habilitará la cookie segura y evitará la interceptación del token de autenticación durante la transmisión en red.

La dirección de inicio de sesión se verá así: https://your-site.com/wp-login.php?autologin=dummy. Al seguirla, el usuario termina instantáneamente en el panel de administración. Sin pantallas intermedias, sin copiar y pegar credenciales.

Multicuenta: un enlace, diferentes cuentas

¿Qué pasa si el sitio de demostración muestra el producto desde diferentes roles? El administrador ve el panel de ajustes, el editor ve la interfaz de publicación, el suscriptor ve la cuenta personal. Para este escenario, extendemos el fragmento para soportar múltiples cuentas:

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 mecánica es la misma, pero el array $autologin_accounts almacena las credenciales de todos los usuarios de demostración, y foreach itera a través de ellas buscando una coincidencia por el valor del parámetro URL. Añadir una nueva cuenta se reduce a copiar el bloque del array con nuevos valores de user, pass y location.

El parámetro location acepta cualquier ruta relativa dentro de /wp-admin/: por ejemplo, options-general.php para la página de ajustes, edit.php para la lista de entradas, o post-new.php para crear una nueva entrada. También puede especificar una URL completa para redirigir al frontend, pero entonces reemplace admin_url( $account['location'] ) por $account['location'] en el código.

El punto de entrada es el mismo: https://your-site.com/wp-login.php?autologin=editor_demo, y el usuario aterriza en la página de creación de entradas en lugar de la raíz del administrador. Para el propietario del sitio de demostración, esto significa control total sobre la primera impresión: cada tipo de usuario ve exactamente aquella parte del producto que es relevante para sus intereses.

⁉️🤔 Preguntas frecuentes

¿Es seguro almacenar contraseñas en el código del plugin?

No, no es seguro. El fragmento fue diseñado para sitios de demostración donde las cuentas son intencionadamente públicas y no tienen privilegios reales. En un sitio de producción con usuarios reales, este enfoque es inaceptable: la contraseña en texto plano puede filtrarse durante cualquier auditoría de código. Para escenarios de producción, considere un mecanismo de token de un solo uso o SSO mediante API REST con verificación nonce.

¿Por qué no la acción wp_login, sino directamente wp_signon?

El hook wp_login se dispara después de un inicio de sesión exitoso, no realiza la autorización en sí. wp_signon() es la función que autentica al usuario: verifica la contraseña mediante wp_authenticate(), establece la cookie y dispara wp_login como consecuencia. Si necesita autorizar programáticamente a un usuario solamente, wp_signon es su herramienta.

¿Puedo insertar el fragmento en functions.php en lugar de un plugin separado?

Sí, el código funcionará también en el functions.php del tema. Pero un plugin es más conveniente: el inicio de sesión automático no está vinculado al tema y no se romperá al cambiar de tema. Además, el plugin puede desactivarse con un clic sin editar archivos en el servidor.

¿Qué hacer si después del inicio de sesión el usuario no está autorizado en is_user_logged_in?

Esta es una particularidad conocida de wp_signon() cuando se llama antes del hook init: la cookie está establecida, pero el global $current_user aún no está actualizado. La solución es llamar forzosamente a wp_set_current_user( $user->ID ) inmediatamente después de un wp_signon() exitoso. En nuestro fragmento esto no es crítico porque sigue una redirección inmediata, pero en escenarios sin redirección la línea es obligatoria.

¿Funciona el fragmento en multisitio?

Sí, pero con una salvedad. wp_signon() autoriza al usuario dentro del sitio actual en la red. Si la cuenta existe solo en uno de los subsitios, el inicio de sesión automático no funcionará en los demás. Para autenticación cruzada a través de toda la red, use una combinación de wp_signon() y wp_set_auth_cookie() con instalación forzada de cookie para el dominio principal.

Fragmento de inicio de sesión automático: en conclusión

Quince líneas de PHP eliminan la principal fricción en el embudo del sitio de demostración: copiar usuario y contraseña. Un enlace, y el visitante está dentro del producto, con el rol y en la sección que usted eligió.

La versión básica cubre el escenario de "un usuario de demostración", la extendida cubre cualquier número de roles con diferentes puntos de redirección. Ambas no dependen del tema, no requieren plugins de terceros y se activan en un minuto.

La regla principal de seguridad es no elevar privilegios. Un usuario de demostración con el rol de Suscriptor o, como máximo, Editor es aceptable. Un administrador con inicio de sesión automático mediante enlace es un agujero que un atacante encontrará en un segundo.

Si el acceso de demostración es un canal de ventas para usted, el inicio de sesión automático deja de ser un "buen añadido" y se convierte en un elemento de conversión obligatorio. Un enlace en lugar de usuario y contraseña es la diferencia entre "lo probaré luego" y "lo pruebo ahora".