Come creare un modulo personalizzato di login/registrazione con gestione degli errori?
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?

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:

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.

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