Cum se construiește un formular personalizat de autentificare/înregistrare cu gestionarea erorilor?
Deci, lucrez la un plugin în care creez o pagină personalizată ce conține un formular de autentificare precum și unul pentru înregistrarea utilizatorilor; Am formularele construite și funcționale, mai jos este codul meu.
<!-- Început formular autentificare -->
<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="Nume utilizator" />
</p>
<p>
<input type="password" name="pwd" id="user_pass" class="input" placeholder="Parolă" />
</p>
<button name="wp-submit" id="wp-submit" class="btn"><?php _e("Autentificare", "shorti"); ?></button>
<input type="hidden" name="redirect_to" value="<?php echo $_SERVER["REQUEST_URI"]; ?>" />
</form>
<!-- sfârșit formular autentificare -->
<!-- Început formular înregistrare -->
<form method="post" id="register_form" class="wp-user-form" action="<?php echo site_url('wp-login.php?action=register', 'login_post') ?>">
<p><!-- Nume utilizator -->
<input type="text" name="user_login" id="user_login" class="input" placeholder="nume utilizator" />
</p>
<p><!-- Email pentru trimitere parolă -->
<input type="email" name="user_email" id="user_email" class="input" placeholder="adresă email" />
</p>
<p class="small-text">Veți primi un email cu o parolă generată<br />(pe care o puteți schimba în "setările utilizatorului")</p>
<?php do_action('register_form'); ?>
<button name="wp-submit" id="wp-submit" class="btn"><?php _e("Înregistrare!", "shorti"); ?></button>
<?php $register = $_GET['register']; if($register == true) { echo '<p>Verificați emailul pentru parolă!</p>'; } ?>
<input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>?register=true" />
<input type="hidden" name="user-cookie" value="1" />
</form><!-- sfârșit formular înregistrare -->
Acesta funcționează bine, cu excepția faptului că ori de câte ori apare un mesaj de eroare, utilizatorul este redirecționat către wp-login.php. Am nevoie ca pagina cu formularul să gestioneze toate erorile cu AJAX; pentru a oferi o experiență mai bună utilizatorului. Care este cea mai bună modalitate de a face acest lucru?

Privește elementul de formular de deschidere. Valoarea atributului action
determină unde sunt trimise datele formularului. Prin modificarea acestei valori, poți pur și simplu să direcționezi formularul către aceeași pagină, în loc să-l trimiți către o altă pagină.
Codex-ul oferă o abordare alternativă pentru generarea marcajului necesar pentru formular:
http://codex.wordpress.org/Customizing_the_Login_Form#Make_a_Custom_Login_Page
Iată un tutorial mult mai detaliat:
http://digwp.com/2010/12/login-register-password-code/
Poți folosi sau adapta oricând un plugin popular de logare bazat pe Ajax care există deja:

Da, linkul Digging into WP este o resursă excelentă... este ceea ce am folosit pentru a construi ceea ce am în prezent (codul pe care l-am împărtășit), dar ei nu arată cum să gestionăm erorile pe aceeași pagină (cel puțin nu văd unde ar face asta). În al doilea rând, construiesc asta pentru un plugin personalizat la care lucrez, ceea ce înseamnă că nu vreau să fiu dependent de un alt plugin care să funcționeze continuu pentru ca al meu să funcționeze.

Iată ce fac. Folosește formularul de login pentru a crea autentificarea https://codex.wordpress.org/Function_Reference/wp_login_form
Mai jos sunt redirecționările pentru login și logout și gestionarea erorilor de autentificare. Acest lucru te va ajuta cu problemele de autentificare.
/** Redirecționare Login
* Redirecționează utilizatorul după autentificare reușită.
*
* @param string $redirect_to URL-ul către care se redirecționează.
* @param string $request URL-ul de pe care vine utilizatorul.
* @param object $user Datele utilizatorului autentificat.
* @return string
*/
function my_login_redirect( $redirect_to, $request, $user ) {
//există un utilizator de verificat?
global $user;
if ( isset( $user->roles ) && is_array( $user->roles ) ) {
//verifică pentru administratori
if ( in_array( 'administrator', $user->roles ) ) {
// redirecționează-i către locația implicită
return home_url('/wp-admin/');
} else {
return home_url();
}
} else {
return $redirect_to;
}
}
/*Gestionare Erori Login*/
add_action( 'wp_login_failed', 'aa_login_failed' ); // interceptează autentificarea eșuată
function aa_login_failed( $user ) {
// verifică de pe ce pagină vine încercarea de autentificare
$referrer = $_SERVER['HTTP_REFERER'];
// verifică că nu suntem pe pagina implicită de login
if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') && $user!=null ) {
// asigură-te că nu avem deja o încercare eșuată
if ( !strstr($referrer, '?login=failed' )) {
// Redirecționează către pagina de login și adaugă un parametru de login eșuat
wp_redirect( $referrer . '?login=failed');
} else {
wp_redirect( $referrer );
}
exit;
}
}
/*Gestionare Erori Câmpuri Goale Login*/
add_action( 'authenticate', 'pu_blank_login');
function pu_blank_login( $user ){
// verifică de pe ce pagină vine încercarea de autentificare
$referrer = $_SERVER['HTTP_REFERER'];
$error = false;
if($_POST['log'] == '' || $_POST['pwd'] == '')
{
$error = true;
}
// verifică că nu suntem pe pagina implicită de login
if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') && $error ) {
// asigură-te că nu avem deja o încercare eșuată
if ( !strstr($referrer, '?login=failed') ) {
// Redirecționează către pagina de login și adaugă un parametru de login eșuat
wp_redirect( $referrer . '?login=failed' );
} else {
wp_redirect( $referrer );
}
exit;
}
}
/*Redirecționare 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');
