¿Cómo puedo redirigir al usuario después de ingresar una contraseña incorrecta?

16

Estoy usando wp_login_form()para mostrar el formulario de inicio de sesión en una ventana de diálogo jQuery.

Si el usuario ingresa una contraseña incorrecta, el usuario es llevado al backend. No quiero eso ¿Hay alguna manera de notificar al usuario que ingresó una contraseña incorrecta y aún permanece en la misma página?

Antes de que wp_login_form()llegara, estaba usando un complemento. Espero poder evitar usar un complemento para esto.

Mi código:

wp_login_form( array(
  'label_remember' => __( 'Remember me' ),
  'label_log_in' => __( 'Login' )
) );
Steven
fuente

Respuestas:

5

wp_login_form()crea un formulario con un atributo de acción de site_url/wp-login.php, lo que significa que cuando hace clic en el botón enviar, se envía el formulario site_url/wp-login.phpque ignora redirect_to en caso de errores (como una contraseña incorrecta), por lo que en su caso vuelva a usar un complemento o vuelva a crear todo el proceso de inicio de sesión y de esa manera tendrá control sobre los errores, eche un vistazo a Verificar el nombre de usuario correcto en el formulario de inicio de sesión personalizado, que es una pregunta muy similar.

Bainternet
fuente
26

Vine aquí de google. Pero la respuesta no me satisfizo. Estuve buscando un tiempo y encontré una mejor solución.

Agregue esto a sus functions.php :

add_action( 'wp_login_failed', 'my_front_end_login_fail' );  // hook failed login

function my_front_end_login_fail( $username ) {
   $referrer = $_SERVER['HTTP_REFERER'];  // where did the post submission come from?
   // if there's a valid referrer, and it's not the default log-in screen
   if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') ) {
      wp_redirect( $referrer . '?login=failed' );  // let's append some information (login=failed) to the URL for the theme to use
      exit;
   }
}
Alexey
fuente
Gracias Alexey, probaré esto (ya que todavía estoy usando un complemento)
Steven
77
La solución de Alexey funciona cuando se ingresan credenciales incorrectas, pero desafortunadamente falla cuando el usuario olvida ingresar un nombre de usuario o contraseña. Aparentemente, Wordpress ni siquiera intenta registrar al usuario en este caso, por lo que no se realiza la acción wp_login_failed.
Szczepan Hołyszewski
Usaría wp_get_referer () aquí para ahorrar tiempo: codex.wordpress.org/Function_Reference/wp_get_referer
Jake
1
Además, definitivamente usa add_query_arg aquí, por lo que wp_redirect debería ser: "wp_redirect (add_query_arg ('inicio de sesión', 'error', $ referencia))";
Jake
18

El método actual que estoy utilizando para tratar todos los problemas descritos aquí funciona muy bien incluso con un nombre de usuario / contraseña en blanco y no se basa en javascript (aunque el js podría ser bueno junto con esto).

add_action( 'wp_login_failed', 'custom_login_failed' );
function custom_login_failed( $username )
{
    $referrer = wp_get_referer();

    if ( $referrer && ! strstr($referrer, 'wp-login') && ! strstr($referrer,'wp-admin') )
    {
        wp_redirect( add_query_arg('login', 'failed', $referrer) );
        exit;
    }
}

La clave es este filtro para cambiar cómo se trata un nombre de usuario / contraseña en blanco:

add_filter( 'authenticate', 'custom_authenticate_username_password', 30, 3);
function custom_authenticate_username_password( $user, $username, $password )
{
    if ( is_a($user, 'WP_User') ) { return $user; }

    if ( empty($username) || empty($password) )
    {
        $error = new WP_Error();
        $user  = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid username or incorrect password.'));

        return $error;
    }
}

Puede llevar esto un paso más allá y reemplazar completamente wp-login.php al redirigir a los usuarios a su página de inicio de sesión personalizada y usar esa página también para la redirección login_failed. Código completo:

/**
 * Custom Login Page Actions
 */
// Change the login url sitewide to the custom login page
add_filter( 'login_url', 'custom_login_url', 10, 2 );
// Redirects wp-login to custom login with some custom error query vars when needed
add_action( 'login_head', 'custom_redirect_login', 10, 2 );
// Updates login failed to send user back to the custom form with a query var
add_action( 'wp_login_failed', 'custom_login_failed', 10, 2 );
// Updates authentication to return an error when one field or both are blank
add_filter( 'authenticate', 'custom_authenticate_username_password', 30, 3);
// Automatically adds the login form to "login" page
add_filter( 'the_content', 'custom_login_form_to_login_page' );

/**
 * Custom Login Page Functions
 */
function custom_login_url( $login_url='', $redirect='' )
{
    $page = get_page_by_path('login');
    if ( $page )
    {
        $login_url = get_permalink($page->ID);

        if (! empty($redirect) )
            $login_url = add_query_arg('redirect_to', urlencode($redirect), $login_url);
    }
    return $login_url;
}
function custom_redirect_login( $redirect_to='', $request='' )
{
    if ( 'wp-login.php' == $GLOBALS['pagenow'] )
    {
        $redirect_url = custom_login_url();

        if (! empty($_GET['action']) )
        {
            if ( 'lostpassword' == $_GET['action'] )
            {
                return;
            }
            elseif ( 'register' == $_GET['action'] )
            {
                $register_page = get_page_by_path('register');
                $redirect_url = get_permalink($register_page->ID);
            }
        }
        elseif (! empty($_GET['loggedout'])  )
        {
            $redirect_url = add_query_arg('action', 'loggedout', custom_login_url());
        }

        wp_redirect( $redirect_url );
        exit;
    }
}
function custom_login_failed( $username )
{
    $referrer = wp_get_referer();

    if ( $referrer && ! strstr($referrer, 'wp-login') && ! strstr($referrer, 'wp-admin') )
    {
        if ( empty($_GET['loggedout']) )
        wp_redirect( add_query_arg('action', 'failed', custom_login_url()) );
        else
        wp_redirect( add_query_arg('action', 'loggedout', custom_login_url()) );
        exit;
    }
}
function custom_authenticate_username_password( $user, $username, $password )
{
    if ( is_a($user, 'WP_User') ) { return $user; }

    if ( empty($username) || empty($password) )
    {
        $error = new WP_Error();
        $user  = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid username or incorrect password.'));

        return $error;
    }
}
function custom_login_form_to_login_page( $content )
{
    if ( is_page('login') && in_the_loop() )
    {
        $output = $message = "";
        if (! empty($_GET['action']) )
        {
            if ( 'failed' == $_GET['action'] )
                $message = "There was a problem with your username or password.";
            elseif ( 'loggedout' == $_GET['action'] )
                $message = "You are now logged out.";
            elseif ( 'recovered' == $_GET['action'] )
                $message = "Check your e-mail for the confirmation link.";
        }

        if ( $message ) $output .= '<div class="message"><p>'. $message .'</p></div>';
        $output .= wp_login_form('echo=0&redirect='. site_url());
        $output .= '<a href="'. wp_lostpassword_url( add_query_arg('action', 'recovered', get_permalink()) ) .'" title="Recover Lost Password">Lost Password?</a>';

        $content .= $output;
    }
    return $content;
}

Personalice y agregue estos para agregar su logotipo a la página de inicio de sesión de wp para recuperar la contraseña:

// calling it only on the login page
add_action( 'login_enqueue_scripts', 'custom_login_css', 10 );
function custom_login_css() { wp_enqueue_style( 'custom_login_css', get_template_directory_uri() .'/library/css/login.css', false ); }
// changing the logo link from wordpress.org to your site
add_filter( 'login_headerurl', 'custom_login_logo_url' );
function custom_login_logo_url() { return home_url(); }
// changing the alt text on the logo to show your site name
add_filter( 'login_headertitle', 'custom_login_title' );
function custom_login_title() { return get_option('blogname'); }

Iniciar sesión logo css:

.login h1 a {
    background: url(../images/login-logo.png) no-repeat top center;
    width: 274px;
    height: 63px;
    text-indent: -9999px;
    overflow: hidden;
    padding-bottom: 15px;
    display: block;
}

EDITAR: Acabo de implementar esto en otro sitio desde cero, y encontré que el "paso más allá" anterior es más completo, y solucioné pequeños errores de sintaxis en "add_actions". Se agregaron algunos comentarios y un método para agregar automáticamente el formulario de inicio de sesión a la página de inicio de sesión sin un archivo de plantilla separado. El método de formulario de inicio de sesión debería funcionar en la mayoría de los casos, ya que está adjunto a "the_content", podría causar y emitir problemas si tiene más de un bucle en la página de inicio de sesión, solo use una plantilla page-login.php en ese caso.

Jake
fuente
1
Gracias, echaré un vistazo a esto (y veré si puedo hacerlo funcionar junto con el inicio de sesión de terceros como Twitter y FB)
Steven
1
Jake: esta es una buena solución completa. Gracias por compartir. +1
henrywright
Esto está básicamente envuelto en un complemento llamado Sewn In Template Login, un complemento bastante completo y pequeño. wordpress.org/plugins/sewn-in-template-log-in
Jake
Agradable, el único problema es que en realidad no arroja errores en el front-end ...
Siyah
4

Una solución para el punto de Szczepan Hołyszewski sobre los campos vacíos en la solución aceptada, el siguiente jQuery evitará ir a la página estándar de inicio de sesión de wp: (agregar a la plantilla de página de inicio de sesión o footer.php)

jQuery("#loginform-custom").submit(function(){
     var isFormValid = true;
       jQuery("input").each(function()
       {
       if (jQuery.trim($(this).val()).length == 0){
       jQuery(this).addClass("submit_error");
       isFormValid = false;
       }     
     else {
     jQuery(this).removeClass("submit_error");
     }
     });
     return isFormValid;
});
willytk
fuente
0

Una adición a la respuesta de Alexey. Puede agregar una función jquery para verificar que uno de los campos no esté en blanco. De esa forma, el formulario no se enviará a menos que haya algo que verificar, evitando que WordPress redirija a /wp-login.php.

  <script>
        $("#wp-submit").click(function() {
          var user = $("input#user_login").val();
            if (user == "") {
            $("input#user_login").focus();
            return false;
          }
         });
  </script>   

Todavía no estoy seguro de cómo solucionar el aspecto de contraseña olvidada

usuario28022
fuente
3
Tenga en cuenta que WordPress carga jQuery en modo "No Conflict". El $alias no funciona.
s_ha_dum
También debe tener en cuenta que el usuario presiona [enter] y no hace clic en el botón de inicio de sesión. Además, también debe verificar la contraseña en blanco.
Steven
-1
jQuery("#loginform-custom").submit(function(){
     var isFormValid = true;
       jQuery("input").each(function()
       {
       if (jQuery.trim($(this).val()).length == 0){
       jQuery(this).addClass("submit_error");
       isFormValid = false;
       }     
     else {
     jQuery(this).removeClass("submit_error");
     }
     });
     return isFormValid;
});
farhan
fuente
Por favor, editar su respuesta , y añadir una explicación: ¿por qué podría que resolver el problema?
fuxia