¿Cómo mostrar 'error de inicio de sesión' y 'contraseña perdida' en mi página de plantilla?

10

Estoy proporcionando inicio de sesión front-end en una plantilla, usando la función wp_login_form. ¡Maneja la redirección después de iniciar sesión y cerrar sesión de manera bastante clara! Pero si el nombre de usuario / contraseña no coincide o no existe, el usuario es redirigido a la página de inicio de sesión de administrador, con el error js tembloroso. También es el caso cuando intento restablecer la contraseña, me lleva a la página de backend donde tengo que ingresar mi correo electrónico para restablecer la contraseña. Quiero mostrar ambas actividades en mi plantilla. ¿Hay alguna manera de que pueda hacer esto?

Gracias por cualquier ayuda de antemano.

Rutwick Gangurde
fuente

Respuestas:

9

Si es posible. Tienes que crear tres filtros para esto.

Admin cosas dentro de una clase

class WPSE29338_Admin {
    public static function setup() {
        add_filter('login_url', array(__CLASS__, 'modifyLoginURL'), 10, 2);
        add_filter('lostpassword_url', array(__CLASS__, 'modifyLostPasswordURL'), 10, 2);
        add_filter('register', array(__CLASS__, 'modifyRegisterURL'));
    }

    public static function modifyLoginURL($loginUrl, $redirect = '') {
        $loginUrl = site_url('login'); // Link to login URL

        if(!empty($redirect)) {
            $loginUrl = add_query_arg('redirect_to', urlencode($redirect), $loginUrl);
        }

        return $loginUrl;
    }

    public static function modifyLostPasswordURL($lostpwUrl, $redirect = '') {
        $lostpwUrl = wp_login_url() . '#lostpassword'; // Link to lostpassword URL

        if(!empty($redirect)) {
            $lostpwUrl = add_query_arg('redirect_to', urlencode($redirect), $lostpwUrl);
        }

        return $lostpwUrl;
    }

    public static function modifyRegisterURL($registerUrl) {
        if(!is_user_logged_in()) {
            if (get_option('users_can_register')) {
                $registerUrl = '<a href="' . wp_login_url() . '#register" class="btn">' . __('Register') . '</a>'; // Link to register URL
            } else {
                $registerUrl = '';
            }
        }

        return $registerUrl;
    }
}

Primero necesitamos filtrar la salida de la función wp_login_url()que se usa wp_login_form()en el actionatributo de formularios .

Mira el método modifyLoginUrl(). Aquí almacenamos la URL de la página logindentro de la variable $loginUrl. Esta página debe existir dentro de WordPress, así que créala primero.

Luego necesitamos un filtro para la función wp_lostpassword_url()y wp_register(). Es básicamente lo mismo. La URL del sitio se almacena dentro de la variable $lostpwUrly $registerUrl.

Por último, pero no menos importante, debe llamar a la clase en el gancho de acción correcto. Para los temas, esto debería ser after_setup_themey para los complementos que puede usar plugins_loaded.

Temas / funciones.php

add_action('after_setup_theme', 'wpse29338_admin_init');
function wpse29338_admin_init() {
    WPSE29338_Admin::setup();
}

Complementos

add_action('plugins_loaded', 'wpse29338_admin_init');
function wpse29338_admin_init() {
    WPSE29338_Admin::setup();
}
rofflox
fuente
Lamento tropezar con esto, pero me encantaría hacerlo, ¡pero parece que no puedo entenderlo! En el código que proporcionó, ¿qué debería cambiar yo?
Bram Vanroy
Bram, si estás creando un tema personalizado, entonces coloca todos los bloques de código primero y segundo en tu archivo de funciones de tema. Si está creando un complemento, coloque el primer y tercer bloque de código en su archivo de complemento. Parece que lo único que podría tener que modificar es la novena línea de la clase, donde dice $loginUrl = site_url('login'); // Link to login URL. Simplemente cambie 'inicio de sesión' para que coincida con el slug de la página de inicio de sesión que desea utilizar. A menos que Rofflox haya cometido un error de sintaxis que no estoy viendo, parece que funcionaría de maravilla.
Jen
@guiniveretoo ¡Gracias por tu respuesta! El problema es que trabajo con un formulario desplegable al que se puede acceder desde cualquier página del sitio web. Entonces, no hay una babosa definitiva posible, porque las personas pueden iniciar sesión desde cualquier página ... Entonces, ¿qué debo poner allí?
Bram Vanroy
1
Bram - Wordpress necesita una URL de inicio de sesión para que si hay algún error de usuario o similar, hay algún lugar para que puedan ir y restablecer su contraseña o registrarse para obtener una cuenta. Establecer una URL de inicio de sesión proporciona esa página. Hice exactamente esta configuración con un proyecto el año pasado: un cuadro de inicio de sesión de JavaScript que apareció con el formulario de inicio de sesión; si ingresan su información correctamente, los envía a wp-admin; de lo contrario, terminan en la página de inicio de sesión personalizada para volver a intentarlo o restablecer su contraseña.
Jen