Aprende como personalizar y proteger wp-login.php con logo personalizado, CSS, mejor UX y manejo seguro de errores de login sin anadir otro plugin.
ES

Como personalizar la página de inicio de sesion de WordPress sin plugins

5.00 /5 - (31 votes )
Última verificación: 1 de mayo de 2026
6min de lectura
Guía
Auditor de seguridad
Desarrollador full-stack

La pantalla de login predeterminada de WordPress (wp-login.php) es iconica, pero grita “Blog generico”. Si eres una agencia construyendo un sitio para un clientes (p. ej., Coca-Cola), ver el logo de WordPress es un fallo de branding.

Descubre más sobre servicios de seguridad WordPress en WPPoland. En 2026, el White-Labeling es práctica estándar. Esta guía te muestra como personalizar completamente la experiencia de login usando functions.php, haciendola parecer una aplicación a medida.

Si solo necesitas la versión práctica, usa los hooks de login para reemplazar el logo, cargar CSS dedicado y devolver mensajes de error menos reveladores, todo sin instalar otro plugin solo para branding.

#1. Cambiar el logo (lo básico)

Primero, eliminemos la “W” de WordPress y reemplazala con el logo de tu clientes.

function wppoland_login_logo() { ?>
    <style type="text/css">
        #login h1 a, .login h1 a {
            background-image: url(<?php echo get_stylesheet_directory_uri(); ?>/images/clientes-logo.svg);
            height: 65px;
            width: 320px;
            background-size: contain;
            background-repeat: no-repeat;
            padding-bottom: 30px;
        }
    </style>
<?php }
add_action( 'login_enqueue_scripts', 'wppoland_login_logo' );

Consejo profesional: El enlace predeterminado va a WordPress.org. Cambialo a la página principal de tu sitio:

function wppoland_login_logo_url() {
    return home_url();
}
add_filter( 'login_headerurl', 'wppoland_login_logo_url' );

#2. Renovacion completa del CSS (el look moderno)

El fondo gris predeterminado (#f1f1f1) es aburrido. Hagamoslo una experiencia de marca a pantalla completa. Crea un archivo login-style.css en tu tema y encolalo solo en la página de login.

function wppoland_login_stylesheet() {
    wp_enqueue_style( 'custom-login', get_stylesheet_directory_uri() . '/style-login.css' );
}
add_action( 'login_enqueue_scripts', 'wppoland_login_stylesheet' );

Ejemplo de style-login.css:

body.login {
    background-color: #0d1117; /* Modo oscuro */
    display: flex;
    align-items: center;
    justify-content: center;
}
.login form {
    background: #161b22;
    border: 1px solid #30363d;
    box-shadow: none;
    border-radius: 8px;
}
.login label {
    color: #c9d1d9;
}
.wp-core-ui .button-primary {
    background: #238636; /* Verde GitHub */
    border-color: rgba(27,31,35,0.15);
}

#3. Refuerzo de seguridad (oscuridad)

Por defecto, si escribes una contrasena incorrecta, WordPress dice: “La contrasena que introdujiste para el usuario admin es incorrecta.” Esto le dice a un hacker: “El usuario admin existe! Ahora solo hay que hacer fuerza bruta en la contrasena.”

Forcemos a WordPress a ser vago.

function wppoland_login_errors() {
    return 'Algo esta mal!';
}
add_filter( 'login_errors', 'wppoland_login_errors' );

Ahora el mensaje de error es generico, sin revelar nada.

#4. Eliminar el efecto “shake”

Cuando fallas un login, el formulario se sacude. Algunos clientes encuentran esto molesto o poco profesional. Puedes eliminar el JS que lo activa.

function wppoland_remove_login_shake() {
    remove_action( 'login_head', 'wp_shake_js', 12 );
}
add_action( 'login_head', 'wppoland_remove_login_shake' );

#5. Anadiendo 2FA / Passkeys (el futuro)

En 2026, las contrasenas son posiblemente obsoletas. Aunque no puedes construir fácilmente 2FA (Autenticación de Dos Factores) desde cero en functions.php, deberias estilizar los campos de 2FA si usas un plugin como Two Factor. Apunta a la clase CSS .login .backup-methods para asegurarte de que los botones “Usar una llave de seguridad” coincidan con tu branding.

#6. Personalización avanzada del formulario

#Campos personalizados en el login

Puedes anadir campos adicionales al formulario de login para requisitos específicos:

// Anadir campo personalizado al formulario de login
add_action( 'login_form', function() {
    ?>
    <p class="login-department">
        <label for="department">Departamento</label>
        <select name="department" id="department">
            <option value="marketing">Marketing</option>
            <option value="development">Desarrollo</option>
            <option value="management">Direccion</option>
        </select>
    </p>
    <?php
});

#Redireccion personalizada según rol

add_filter( 'login_redirect', function( $redirect_to, $request, $user ) {
    if ( ! is_wp_error( $user ) ) {
        if ( in_array( 'administrator', $user->roles ) ) {
            return admin_url();
        }
        if ( in_array( 'customer', $user->roles ) ) {
            return wc_get_page_permalink( 'myaccount' );
        }
        if ( in_array( 'subscriber', $user->roles ) ) {
            return home_url( '/miembros/' );
        }
    }
    return $redirect_to;
}, 10, 3 );

#7. Limitacion de intentos de login

Además de la personalización visual, es fundamental limitar los intentos de login:

function wppoland_limit_login_attempts() {
    $max_attempts = 5;
    $lockout_time = 15 * MINUTE_IN_SECONDS;
    $ip = $_SERVER['REMOTE_ADDR'];
    $transient_key = 'login_attempts_' . md5( $ip );

    $attempts = get_transient( $transient_key );
    if ( false === $attempts ) {
        $attempts = 0;
    }

    if ( $attempts >= $max_attempts ) {
        wp_die(
            'Demasiados intentos de inicio de sesion. Intentalo de nuevo en 15 minutos.',
            'Acceso bloqueado',
            ['response' => 403]
        );
    }
}
add_action( 'wp_login_failed', function() {
    $ip = $_SERVER['REMOTE_ADDR'];
    $transient_key = 'login_attempts_' . md5( $ip );

    $attempts = get_transient( $transient_key );
    if ( false === $attempts ) {
        $attempts = 0;
    }

    set_transient( $transient_key, $attempts + 1, 15 * MINUTE_IN_SECONDS );
});
add_action( 'login_init', 'wppoland_limit_login_attempts' );

#8. Página de login completamente personalizada

Para una experiencia totalmente a medida, puedes crear una página de login personalizada usando una plantilla de WordPress:

// Redirigir wp-login.php a página personalizada
add_action( 'login_init', function() {
    if ( ! is_user_logged_in() ) {
        $custom_login_page = home_url( '/acceso/' );
        if ( strpos( $_SERVER['REQUEST_URI'], 'wp-login.php' ) !== false
             && ! isset( $_GET['action'] ) ) {
            wp_redirect( $custom_login_page );
            exit;
        }
    }
});

#9. Consideraciones de accesibilidad

Al personalizar la página de login, no olvides la accesibilidad:

/* Asegurar contraste suficiente */
.login label {
    color: #c9d1d9;
    font-size: 16px;
}

/* Focus visible para navegación por teclado */
.login input:focus {
    outline: 2px solid #238636;
    outline-offset: 2px;
    box-shadow: none;
}

/* Respetar preferencias de movimiento reducido */
@media (prefers-reduced-motion: reduce) {
    .login form {
        transition: none;
    }
}

/* Modo oscuro automático */
@media (prefers-color-scheme: dark) {
    body.login {
        background-color: #0d1117;
    }
}

#10. Pruebas y verificación

Despues de personalizar la página de login, verifica:

  • El logo se muestra correctamente en diferentes tamaños de pantalla
  • Los mensajes de error son genericos y no revelan información
  • El formulario funciona correctamente con gestores de contrasenas
  • La accesibilidad por teclado es completa
  • Los plugins de 2FA siguen funcionando correctamente
  • La redireccion despues del login es correcta para cada rol

#Resumen

Una página de login personalizada es la “guinda del pastel” de un proyecto WordPress profesional.

  • Ponle marca: Logo + Enlace.
  • Dale estilo: Control total del CSS.
  • Protegela: Mensajes de error genericos.

No dejes que tu clientes vea la interfaz predeterminada de WordPress. Rompe la inmersion de una solución construida a medida.

Siguiente paso

Transforma el artículo en una implementación real

Este bloque refuerza el enlazado interno y lleva al lector al siguiente paso más útil dentro de la arquitectura del sitio.

Cluster relacionado

Explora otros servicios WordPress y base de conocimiento

Refuerza tu negocio con soporte técnico profesional en áreas clave del ecosistema WordPress.

FAQ del artículo

Preguntas Frecuentes

Respuestas prácticas para aplicar el tema en la ejecución real.

SEO-ready GEO-ready AEO-ready 3 Q&A
Como cambiar el logo de login de WordPress sin un plugin?
Usa el hook login_enqueue_scripts, genera CSS para la pantalla de login y reemplaza el logo predeterminado con tu propia imagen del tema o tema hijo.
Se puede personalizar wp-login.php y mejorar la seguridad al mismo tiempo?
Si. Puedes personalizar la página, ajustar CSS, ocultar errores de login excesivamente específicos y eliminar comportamientos de UI molestos sin cambiar la experiencia del panel de administración.
Donde debe vivir el código de personalización del login de WordPress?
Usa un tema hijo o un plugin pequeño específico del sitio para que los cambios sobrevivan a las actualizaciones del tema y permanezcan aislados del estilo frontend no relacionado.

¿Necesitas un FAQ adaptado a tu sector y mercado? Preparamos una versión alineada con tus objetivos de negocio.

Hablemos

Artículos Relacionados

Aprende a agregar passkeys a WordPress con WebAuthn y FIDO2, además de como funciona el registro de passkeys en iPhone, Android, Windows Hello y llaves de seguridad.
security

Passkeys para WordPress - Guia de autenticación sin contrasena 2026

Aprende a agregar passkeys a WordPress con WebAuthn y FIDO2, además de como funciona el registro de passkeys en iPhone, Android, Windows Hello y llaves de seguridad.

Una guía práctica para fortalecer WordPress en 2026 con passkeys, protección en el Edge, controles de infraestructura y habitos operativos más seguros.
development

Seguridad avanzada y hardening de WordPress en 2026

Una guía práctica para fortalecer WordPress en 2026 con passkeys, protección en el Edge, controles de infraestructura y habitos operativos más seguros.

Mas alla de la instalación de 5 minutos. Aprende a configurar WordPress para seguridad, depuracion y rendimiento usando constantes de wp-config.php y mu-plugins.
development

Configuración de desarrollador WordPress y blindaje de wp-config

Mas alla de la instalación de 5 minutos. Aprende a configurar WordPress para seguridad, depuracion y rendimiento usando constantes de wp-config.php y mu-plugins.