Come creare un modulo personalizzato di login/registrazione con gestione degli errori?

10 nov 2013, 01:21:15
Visualizzazioni: 21.3K
Voti: 5

Sto lavorando su un plugin in cui sto creando una pagina personalizzata contenente un modulo di login e uno per la registrazione utenti; ho costruito i form e sono operativi, di seguito il mio codice.

<!-- Inizio form di login -->               
<form name="loginform" id="login_form" class="login_form" action="<?php echo esc_url( wp_login_url() ); ?>" method="post">

    <p>
        <input type="text" name="log" id="user_login" class="input" placeholder="Nome utente" />
    </p>

    <p>
        <input type="password" name="pwd" id="user_pass" class="input" placeholder="Password" />
    </p>

    <button name="wp-submit" id="wp-submit" class="btn"><?php _e("Accedi", "shorti"); ?></button>

    <input type="hidden" name="redirect_to" value="<?php echo $_SERVER["REQUEST_URI"]; ?>" />

</form>
<!-- fine form di login -->

<!-- Inizio form di registrazione -->
<form method="post" id="register_form" class="wp-user-form" action="<?php echo site_url('wp-login.php?action=register', 'login_post') ?>">

    <p><!-- Nome utente -->
        <input type="text" name="user_login" id="user_login" class="input" placeholder="nome utente" />
    </p>

    <p><!-- Email per inviare la password -->
        <input type="email" name="user_email" id="user_email" class="input" placeholder="indirizzo email" />
    </p>

    <p class="small-text">Riceverai un'email con una password generata<br />(che potrai modificare nelle tue "impostazioni utente")</p>

    <?php do_action('register_form'); ?>
    <button name="wp-submit" id="wp-submit" class="btn"><?php _e("Registrati!", "shorti"); ?></button>
    <?php $register = $_GET['register']; if($register == true) { echo '<p>Controlla la tua email per la password!</p>'; } ?>
    <input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>?register=true" />
    <input type="hidden" name="user-cookie" value="1" />

</form><!-- fine form di registrazione -->

Questo funziona bene a parte il fatto che quando c'è un messaggio di errore reindirizza l'utente a wp-login.php. Ho bisogno che la pagina con il modulo gestisca tutti gli errori con AJAX, in modo da offrire una migliore esperienza utente. Qual è il modo migliore per farlo?

3
Commenti

Dando un secondo sguardo a questo, devo dire che il mio suggerimento di duplicato è impreciso, mi dispiace. A parte questo, cosa hai fatto finora riguardo all'implementazione di ajax?

Nicolai Grossherr Nicolai Grossherr
10 nov 2013 15:55:26

@ialocin: Finora non ho fatto nulla con AJAX. Non ho lavorato molto con AJAX, quindi non so nemmeno bene da dove iniziare. :( Negli ultimi giorni ho fatto alcune ricerche approfondite... ma le uniche cose che riesco a trovare su come sovrascrivere il reindirizzamento a wp-login.php richiedono più caricamenti di pagina; che non è quello che voglio. Alcune delle cose che ho trovato sono... qui e qui

Designer 17 Designer 17
12 nov 2013 21:45:23

@Designer17 hai trovato una soluzione, mi trovo nella stessa situazione

alex alex
7 set 2014 00:48:23
Tutte le risposte alla domanda 2
1

Osserva l'elemento form di apertura. Il valore per l'attributo action determina dove i dati del form verranno inviati. Modificando questo valore puoi semplicemente dire al form di reindirizzare a se stesso piuttosto che a un'altra pagina.

Il codex offre un approccio alternativo per generare il markup necessario per il form:

http://codex.wordpress.org/Customizing_the_Login_Form#Make_a_Custom_Login_Page

Ecco un tutorial molto più approfondito:

http://digwp.com/2010/12/login-register-password-code/

Potresti sempre utilizzare o modificare un plugin già esistente e popolare per il login basato su Ajax:

http://wordpress.org/plugins/login-with-ajax/

10 nov 2013 02:37:03
Commenti

Sì, il link Digging into WP è un'ottima risorsa... è quello che ho usato per costruire ciò che ho attualmente (il codice che ho condiviso), ma non mostrano come gestire gli errori nella stessa pagina (almeno non riesco a vedere dove lo fanno). In secondo luogo, sto sviluppando questo per un plugin personalizzato a cui sto lavorando, il che significa che non voglio assolutamente dipendere dal funzionamento continuo di un altro plugin affinché il mio funzioni.

Designer 17 Designer 17
12 nov 2013 21:51:59
0

Ecco cosa faccio. Utilizzo il modulo di login per creare l'accesso https://codex.wordpress.org/Function_Reference/wp_login_form

Di seguito trovi i reindirizzamenti per login/logout e la gestione degli errori di login. Questo ti aiuterà con i problemi di accesso.

/** Reindirizzamento Login
 * Reindirizza l'utente dopo un login riuscito.
 *
 * @param string $redirect_to URL di reindirizzamento.
 * @param string $request URL da cui proviene l'utente.
 * @param object $user Dati dell'utente loggato.
 * @return string
 */
function my_login_redirect( $redirect_to, $request, $user ) {
    //c'è un utente da verificare?
    global $user;
    if ( isset( $user->roles ) && is_array( $user->roles ) ) {
        //verifica per gli amministratori
        if ( in_array( 'administrator', $user->roles ) ) {
            // reindirizzali alla posizione predefinita
            return home_url('/wp-admin/');
        } else {
            return home_url();
        }
    } else {
        return $redirect_to;
    }
}

/*Gestione Errori Login*/
add_action( 'wp_login_failed', 'aa_login_failed' ); // hook per login fallito

function aa_login_failed( $user ) {
    // verifica da quale pagina proviene il tentativo di login
    $referrer = $_SERVER['HTTP_REFERER'];

    // verifica che non siamo sulla pagina di login predefinita
    if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') && $user!=null ) {
        // assicurati che non abbiamo già un tentativo di login fallito
        if ( !strstr($referrer, '?login=failed' )) {
            // Reindirizza alla pagina di login e aggiungi un parametro di login fallito
            wp_redirect( $referrer . '?login=failed');
        } else {
            wp_redirect( $referrer );
        }

        exit;
    }
}

/*Gestione Errori Campi Vuoti Login*/
add_action( 'authenticate', 'pu_blank_login');

function pu_blank_login( $user ){
    // verifica da quale pagina proviene il tentativo di login
    $referrer = $_SERVER['HTTP_REFERER'];

    $error = false;

    if($_POST['log'] == '' || $_POST['pwd'] == '')
    {
        $error = true;
    }

    // verifica che non siamo sulla pagina di login predefinita
    if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') && $error ) {

        // assicurati che non abbiamo già un tentativo di login fallito
        if ( !strstr($referrer, '?login=failed') ) {
            // Reindirizza alla pagina di login e aggiungi un parametro di login fallito
            wp_redirect( $referrer . '?login=failed' );
        } else {
            wp_redirect( $referrer );
        }

    exit;

    }
}

/*Reindirizzamento Logout*/
add_filter( 'login_redirect', 'my_login_redirect', 10, 3 );

function go_home(){
  wp_redirect( home_url('/login/') );
  exit();
}
add_action('wp_logout','go_home');
11 apr 2014 09:49:24