Come posso reindirizzare l'utente dopo aver inserito una password errata?


16

Sto usando wp_login_form()per visualizzare il modulo di login in una finestra di dialogo jQuery.

Se l'utente immette una password errata, l'utente viene indirizzato al back-end. Non lo voglio. C'è un modo per avvisare l'utente che ha inserito una password errata e che rimane sulla stessa pagina?

Prima che wp_login_form()venissi stavo usando un plugin. Spero di poter evitare di usare un plugin per questo.

Il mio codice:

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

Risposte:


5

wp_login_form()crea un modulo con un attributo action di site_url/wp-login.php, il che significa che quando si fa clic sul pulsante di invio viene inviato il modulo in site_url/wp-login.phpcui ignora redirect_to su errori (come password errata), quindi nel tuo caso torna a utilizzare un plug-in o ricrea l'intero processo di accesso e in questo modo avrai il controllo degli errori, dai un'occhiata a Controlla il nome utente corretto sul modulo di accesso personalizzato che è una domanda molto simile.


26

Sono venuto qui da Google. Ma la risposta non mi ha soddisfatto. Stavo cercando da un po 'e ho trovato una soluzione migliore.

Aggiungi questo alle tue funzioni.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;
   }
}

Grazie Alexey, lo metterò alla prova (visto che sto ancora usando un plugin)
Steven,

7
La soluzione di Alexey funziona quando vengono immesse credenziali errate, ma sfortunatamente fallisce quando l'utente dimentica di inserire nome utente o password. Apparentemente Wordpress non tenta nemmeno di accedere all'utente in questo caso, quindi l'azione wp_login_failed non viene eseguita.
Szczepan Hołyszewski,

Vorrei usare wp_get_referer () qui per risparmiare un po 'di tempo: codex.wordpress.org/Function_Reference/wp_get_referer
Jake

1
Inoltre, usi sicuramente add_query_arg qui, quindi wp_redirect dovrebbe essere: "wp_redirect (add_query_arg ('login', 'failed', $ referrer));"
Jake,

18

Il metodo attuale che sto usando per affrontare tutti i problemi descritti qui funziona benissimo anche con nome utente / password vuoti e non si basa su javascript (anche se js potrebbe essere buono insieme a questo).

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 chiave è questo filtro per modificare la modalità di trattamento di un nome utente / password vuoti:

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;
    }
}

Puoi fare un ulteriore passo avanti e sostituire completamente wp-login.php reindirizzando gli utenti alla tua pagina di accesso personalizzata e utilizzare quella pagina anche per il reindirizzamento login_failed. Codice 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;
}

Personalizza e aggiungi questi per aggiungere il tuo logo alla pagina di accesso wp per il recupero della password:

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

Accedi 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;
}

EDIT: ho appena implementato questo su un altro sito da zero, e ho trovato il precedente "ulteriore passo" per essere più completo, e risolto piccoli errori di sintassi in "add_actions". Aggiunti alcuni commenti e un metodo per aggiungere automaticamente il modulo di accesso alla pagina di accesso senza un file modello separato. Il metodo del modulo di accesso dovrebbe funzionare nella maggior parte dei casi, poiché è collegato a "the_content", potrebbe causare ed emettere problemi se nella pagina di accesso sono presenti più di un loop, in tal caso basta usare un modello page-login.php.


1
Grazie, darò un'occhiata a questo (e vedrò se riesco a farlo funzionare insieme a login di terze parti come Twitter e FB)
Steven

1
Jake - questa è una bella soluzione completa. Grazie per la condivisione. +1
henrywright,

Questo è sostanzialmente racchiuso in un plug-in chiamato Sewn In Template Login, un plug-in abbastanza piccolo e completo. wordpress.org/plugins/sewn-in-template-log-in
Jake

Bello, l'unico problema è che in realtà non genera errori nel front-end ....
Siyah

4

Una soluzione per il punto di Szczepan Hołyszewski sui campi vuoti nella soluzione accettata, il seguente jQuery impedirà di accedere alla pagina standard di wp-login: (aggiungi al modello di pagina di login 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;
});

0

Un'aggiunta alla risposta di Alexey. È possibile aggiungere una funzione jquery per verificare che uno dei campi non sia vuoto. In questo modo il modulo non verrà inviato a meno che non ci sia qualcosa da verificare, impedendo a WordPress di reindirizzare a /wp-login.php.

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

Non sono ancora sicuro di come correggere l'aspetto della password dimenticata


3
Ricorda che WordPress carica jQuery in modalità "Nessun conflitto". L' $alias non funziona.
s_ha_dum,

Devi anche considerare che l'utente preme [invio] e non fa clic sul pulsante di accesso. Inoltre, è necessario controllare anche la password vuota.
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;
});

Si prega di modificare la risposta , e aggiungere una spiegazione: perché potrebbe che risolvere il problema?
fuxia
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.