Contents
Introducción
Este artículo muestra, paso a paso y con ejemplos completos, cómo personalizar la pantalla de login de WordPress usando PHP para engancharse a los hooks adecuados y encolar (enqueue) JavaScript y CSS correctamente. Verás cómo crear un plugin mínimo (también válido desde functions.php del tema, aunque se recomienda plugin) que añada estilos, scripts, cambie el logo y el enlace del encabezado, pase variables desde PHP a JS y trate una petición AJAX segura en la pantalla de login.
Requisitos y buenas prácticas
- Entorno: WordPress 5.x o superior.
- Acceso: FTP o acceso a los archivos del servidor para crear el plugin o editar functions.php.
- Seguridad: usar nonces y capacidades correctas, no encolar scripts innecesarios y evitar cargar librerías desde CDNs inseguros.
- Recomendación: crear un plugin en lugar de modificar el tema si quieres que los cambios sobrevivan a cambios de tema.
Estructura mínima de archivos (plugin)
Se recomienda una estructura sencilla situada en wp-content/plugins/custom-login/ :
- custom-login.php (archivo principal del plugin)
- assets/css/login-style.css
- assets/js/login-script.js
- assets/img/login-logo.svg (o png)
1) Plugin base y hooks para encolar
Este ejemplo crea un plugin que encola CSS y JS en la pantalla de login usando el hook login_enqueue_scripts. Además modifica el logo con CSS y cambia el enlace del logo y su título con filtros.
version ) // Encolar JS (dependencia jQuery si la necesitas) wp_enqueue_script( custom-login-script, plugin_url . assets/js/login-script.js, array( jquery ), this->version, true ) // Pasar datos de PHP a JS (AJAX URL, nonce, etc.) wp_localize_script( custom-login-script, CLE_Params, array( ajax_url => admin_url( admin-ajax.php ), nonce => wp_create_nonce( cle_nonce ), ) ) } public function change_login_logo_url() { return home_url() } public function change_login_logo_title() { return get_bloginfo( name ) } public function ajax_handler() { check_ajax_referer( cle_nonce, security ) // Ejemplo: retornar mensaje con la hora del servidor response = array( success => true, message => Servidor responde: . current_time( mysql ), ) wp_send_json( response ) } } new Custom_Login_Enhancer()
Explicación
- login_enqueue_scripts: hook usado exclusivamente en la pantalla de login. Ideal para encolar CSS y JS sin afectar el front-end o el admin.
- wp_localize_script: método estándar para pasar datos PHP a JS (url de AJAX, nonces, datos de configuración).
- wp_ajax_nopriv_…: permite manejar peticiones AJAX de usuarios no autenticados (la pantalla de login es pública).
- check_ajax_referer: valida el nonce enviado desde JS para prevenir CSRF.
2) CSS para personalizar logo y estilos
Un CSS simple para cambiar el logo y estilos del formulario de login.
/ assets/css/login-style.css / body.login { background: #f5f7fa } .login h1 a { background-image: url(../img/login-logo.svg) background-size: contain width: 320px height: 80px } .login form { box-shadow: 0 6px 18px rgba(0,0,0,0.06) border-radius: 8px padding: 26px } .login .button-primary { background: linear-gradient(90deg, #0073aa, #006799) border: none box-shadow: none text-shadow: none }
3) JavaScript para mejorar la experiencia (encolado con jQuery)
Ejemplo de script que añade interactividad: animaciones, focus en el primer campo, validaciones simples y un ejemplo de petición AJAX a admin-ajax.php usando el objeto pasado por wp_localize_script.
// assets/js/login-script.js jQuery( document ).ready( function( ) { // Efecto de enfoque en inputs ( .login form .input, .login form input ).focus( function() { ( this ).closest( p ).addClass( cle-focused ) }).blur( function() { ( this ).closest( p ).removeClass( cle-focused ) }) // Ejemplo de petición AJAX con nonce ( #loginform ).on( submit, function( e ) { // Este es solo un ejemplo: no interceptes el submit real salvo que sepas lo que haces. // Aquí evitamos el envío real y hacemos una llamada de ejemplo. e.preventDefault() var data = { action: custom_login_action, security: CLE_Params.nonce } .post( CLE_Params.ajax_url, data, function( response ) { if ( response.success ) { // Mostrar mensaje (puedes insertar DOM) alert( response.message ) } else { alert( Error en la petición AJAX ) } }, json ) } ) } )
Notas sobre el ejemplo AJAX
- En el ejemplo se intercepta el submit únicamente a modo demostrativo. En producción evita bloquear el flujo de login salvo que gestiones el proceso de autenticación tú mismo.
- Si quieres añadir características de seguridad (p. ej. verificación extra), implementa la lógica en el handler PHP y usa wp_signon si gestionas el login por AJAX.
4) Handler PHP para AJAX (ya incluido, ampliación)
El handler registrado con wp_ajax_nopriv_custom_login_action ya valida el nonce y devuelve JSON con wp_send_json. Si necesitas autenticar al usuario por AJAX, usa wp_signon con credenciales seguras y responde con códigos de error claros.
// Fragmento: uso de wp_signon (solo si gestionas login por AJAX) public function ajax_login_process() { check_ajax_referer( cle_nonce, security ) creds = array( user_login => isset( _POST[log] ) ? sanitize_text_field( wp_unslash( _POST[log] ) ) : , user_password => isset( _POST[pwd] ) ? _POST[pwd] : , remember => ! empty( _POST[remember] ) ) user = wp_signon( creds, is_ssl() ) if ( is_wp_error( user ) ) { wp_send_json( array( success => false, error => user->get_error_message() ) ) } else { wp_send_json( array( success => true, redirect => admin_url() ) ) } }
5) Accesibilidad y usabilidad
- Asegúrate de que los cambios visuales mantienen contraste suficiente y son navegables por teclado.
- Si usas animaciones, ofréceles una duración moderada y prueba que no interfieran con lectores de pantalla.
- Mantén los elementos esenciales (olvido de contraseña, registro) visibles y funcionales.
6) Seguridad y rendimiento
- Usa nonces y check_ajax_referer para todas las peticiones AJAX.
- No incluyas credenciales ni datos sensibles en JavaScript accesible públicamente.
- Evita encolar librerías pesadas solo para la pantalla de login.
- Versiona tus scripts para controlar caché mediante el parámetro version en wp_enqueue_script/style.
7) Depuración y problemas comunes
- Mi CSS/JS no se carga: verifica que el hook es login_enqueue_scripts y que las rutas a los archivos son correctas (plugin_dir_url/ get_stylesheet_directory_uri si lo pones en tema).
- AJAX devuelve 0: indica que WordPress no encontró la acción asegúrate de usar wp_ajax_nopriv_… para usuarios no autenticados y que action en la petición coincide con el hook registrado.
- Nonce inválido: revisa que el nonce enviado desde JS coincida con el generado en PHP y que check_ajax_referer use el mismo nombre.
8) Código final consolidado (plugin listo para copiar)
Reúno aquí el archivo principal con todo lo básico. Asegúrate de crear también los archivos CSS/JS y la imagen según la estructura mostrada.
version ) wp_enqueue_script( custom-login-script, plugin_url . assets/js/login-script.js, array( jquery ), this->version, true ) wp_localize_script( custom-login-script, CLE_Params, array( ajax_url => admin_url( admin-ajax.php ), nonce => wp_create_nonce( cle_nonce ), ) ) } public function change_login_logo_url() { return home_url() } public function change_login_logo_title() { return get_bloginfo( name ) } public function ajax_handler() { check_ajax_referer( cle_nonce, security ) response = array( success => true, message => Servidor responde: . current_time( mysql ), ) wp_send_json( response ) } // Ejemplo de proceso de login por AJAX (opcional) public function ajax_login_process() { check_ajax_referer( cle_nonce, security ) creds = array( user_login => isset( _POST[log] ) ? sanitize_text_field( wp_unslash( _POST[log] ) ) : , user_password => isset( _POST[pwd] ) ? _POST[pwd] : , remember => ! empty( _POST[remember] ) ) user = wp_signon( creds, is_ssl() ) if ( is_wp_error( user ) ) { wp_send_json( array( success => false, error => user->get_error_message() ) ) } else { wp_send_json( array( success => true, redirect => admin_url() ) ) } } } new Custom_Login_Enhancer()
Conclusión
Personalizar la pantalla de login en WordPress es seguro y robusto cuando usas los hooks adecuados (login_enqueue_scripts, filtros de login_headerurl y login_headertext) y encolas correctamente CSS/JS. Para integrar dinámicamente valores desde PHP a JS usa wp_localize_script y valida todas las peticiones AJAX con nonces y check_ajax_referer. Mantén accesibilidad, rendimiento y seguridad como prioridades.
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |