Afișarea mesajelor de succes sau eroare în răspunsul Ajax pentru formular personalizat de înregistrare WordPress
Am acest formular personalizat în interiorul unui șablon de pagină WordPress
<?php if(!is_user_logged_in()) {
if(get_option('users_can_register')) {
if($_POST){
$username = $wpdb->escape($_REQUEST['user_login']);
if(empty($username)) {
echo "<span style='color:#FF0000'><strong>Eroare..</strong></span><br /><br />Trebuie să completați numele de utilizator.";
exit();
}
$email = $wpdb->escape($_REQUEST['user_email']);
if(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/", $email)) {
echo "<span style='color:#FF0000'><strong>Eroare..</strong></span><br /><br />vă rugăm folosiți o adresă de email validă.";
exit();
}
//$random_password = wp_generate_password( 12, false );
$pass1 = $wpdb->escape($_REQUEST['pass1']);
$pass2 = $wpdb->escape($_REQUEST['pass2']);
if ($pass1 != $pass2){
echo "<span style='color:#FF0000'><strong>Eroare..</strong></span><br /><br />parolele nu se potrivesc.";
exit();
}
$random_password = $pass1;
$status = wp_create_user( $username, $random_password, $email );
if ( is_wp_error($status) )
echo "<span style='color:#FF0000'><strong>Eroare..</strong></span><br /><br />Numele de utilizator există deja. Vă rugăm încercați altul.";
else {
$from = get_option('admin_email');
$headers = 'From: '.$from . "\r\n";
$subject = "Înregistrare reușită!";
$msg = "Bine ați venit, v-ați înregistrat cu succes. Aici sunt datele dvs.\Info:\Nume utilizator: $username\Parola: $random_password";
wp_mail( $email, $subject, $msg, $headers );
echo "<strong>V-ați înregistrat cu succes. Un email a fost trimis cu numele de utilizator și parola..";
}
exit();
} else { ?>
<form method="post" action="<?php echo site_url('wp-login.php?action=register', 'login_post') ?>" id="registerform" class="col-xs-12" name="registerform">
<div class="row">
<div class="col-xs-12 col-md-6">
<p>
<label for="user_login">Nume utilizator</label>
<input id="user_login" class="input" type="text" size="20" value="" name="user_login">
</p>
<p>
<label for="user_email">Email</label>
<input id="user_email" class="input" type="email" size="25" value="" name="user_email">
</p>
<p>
Parola <input type="password" name="pass1" size="25" value="">
Repetă parola <input type="password" name="pass2" size="25" value="">
</p>
</div>
<div class="submit">
<input id="wp-register" class="button-primary pull-right col-xs-12 col-md-3" type="submit" value="Înregistrare" name="wp-submit" tabindex="103">
<input type="hidden" value="/login-area/?action=register&success=1" name="redirect_to">
<input type="hidden" name="user-cookie" value="1" />
</div>
</div>
</form>
<script type="text/javascript">
jQuery("#wp-register").click(function() {
var input_data = jQuery('#registerform').serialize();
jQuery.ajax({
type: "POST",
url: "<?php echo "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; ?>",
data: input_data,
success: function(data){
alert('Succes');
},
error: function (jqXHR, textStatus, errorThrown) {
alert(jqXHR.status); // Aș dori să văd care este eroarea
}
});
return false;
});
</script>
<?php }
} else ?>
Deja înregistrat? Conectați-vă la contul dvs. folosind formularul din sidebar.
<?php } else { ?>
Sunteți deja conectat...
<?php } ?>
PHP-ul pare să funcționeze bine deoarece când fac console log primesc mesajul corect când există o eroare.
Cum pot afișa aceste erori în interiorul funcțiilor Ajax success sau error?
Codul pe care îl folosesc pare să ajungă întotdeauna la funcția success chiar dacă există erori.
Aș dori să știu ce erori sunt și să afișez un mesaj cu tipul de eroare undeva pe pagină și dacă este cu succes aș dori să afișez un mesaj de succes.
Cum pot afișa aceste erori în interiorul funcțiilor Ajax success sau error?
Eroarea jQuery este declanșată atunci când cererea în sine eșuează, de exemplu din cauza timeout-ului sau altele. Vezi documentația jQuery.
Mesajele de eroare, care sunt generate de PHP, apar doar la succesul cererii.
Pentru a le afișa, ai putea face de exemplu:
success: function(data){
jQuery( data ).appendTo( 'body' );
}
Va fi nevoie totuși de niște stilizare :)
EDIT:
Deoarece în scriptul tău este posibil ca întregul element form
să fie afișat, poți preveni acest lucru folosind expresii regulate în callback-ul success
:
success: function(data){
if( ! data.match( /<form/ ) )
jQuery( data ).appendTo( 'body' );
}
Astfel, poți folosi expresii regulate pentru a preveni adăugarea de output pe care nu dorești să-l afișezi.

Mulțumesc pentru asta. Am încercat asta, dar adaugă întreaga pagină. Este posibil să adaugi doar mesajele de eroare sau de succes?

Mulțumesc lui @websupporter pentru că am reușit să găsesc o soluție la problema mea.
Am folosit acest cod în funcția mea Ajax:
success: function(data){
jQuery(data).find('.message').appendTo('#login-error');
}
Iar în codul PHP am făcut asta:
...
if(empty($username)) {
echo "<span class='message error'>Vă rugăm să introduceți numele de utilizator.</span>";
exit();
}
...
Sper că acest lucru va fi util pentru cineva.

Am întâmpinat aceeași problemă. Niciuna dintre soluțiile de mai sus nu a funcționat pentru mine. Asigură-te că ai setat dataType-ul apelului tău ajax la 'html' și nu 'json'.
Cod exemplu:
$.ajax({
url: ajaxurl,
type: 'POST',
dataType: 'html',
cache: false,
data: { data: data, action: 'jseditajax' }
})
.done(function(response) {
response = response.slice(0, - 1); // elimină 0 de la ultima poziție a șirului
response = JSON.parse(response); // transformă șirul în JSON
console.log(response);
});
Iar în fișierul tău PHP poți pur și simplu -
echo json_encode($your_array);
Sper că acest lucru te ajută!
