Показ сообщений об успехе или ошибках в Ajax-ответе для пользовательской формы регистрации WordPress
У меня есть эта пользовательская форма внутри шаблона страницы 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>Ошибка..</strong></span><br /><br />Вы должны заполнить имя пользователя.";
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>Ошибка..</strong></span><br /><br />пожалуйста, используйте действительный email-адрес.";
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>Ошибка..</strong></span><br /><br />пароли не совпадают.";
exit();
}
$random_password = $pass1;
$status = wp_create_user( $username, $random_password, $email );
if ( is_wp_error($status) )
echo "<span style='color:#FF0000'><strong>Ошибка..</strong></span><br /><br />Имя пользователя уже существует. Пожалуйста, попробуйте другое.";
else {
$from = get_option('admin_email');
$headers = 'From: '.$from . "\r\n";
$subject = "Регистрация успешна!";
$msg = "Добро пожаловать, вы зарегистрированы. Вот ваше имя пользователя и пароль.\Info:\Имя пользователя: $username\Пароль: $random_password";
wp_mail( $email, $subject, $msg, $headers );
echo "<strong>Вы зарегистрированы. Письмо с вашим именем пользователя и паролем отправлено на email..";
}
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">Имя пользователя</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>
Пароль <input type="password" name="pass1" size="25" value="">
Повторите пароль <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="Регистрация" 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('Успешно');
},
error: function (jqXHR, textStatus, errorThrown) {
alert(jqXHR.status); // Я хотел бы получить информацию об ошибке
}
});
return false;
});
</script>
<?php }
} else ?>
Уже зарегистрированы? Войдите в свой аккаунт с помощью формы на боковой панели.
<?php } else { ?>
Вы уже вошли в систему...
<?php } ?>
PHP, похоже, работает нормально, так как при выводе в консоль я получаю правильное сообщение при возникновении ошибки.
Как я могу показать эти ошибки внутри функций Ajax success или error?
Используемый мной код, похоже, всегда попадает в функцию success, даже если есть какие-то ошибки.
Я хотел бы знать, какие есть ошибки, и выводить сообщение с типом ошибки где-то на странице, а если операция успешна, я хотел бы вывести сообщение об успехе.
Как я могу отображать эти ошибки внутри функций success или error в Ajax?
Ошибка jQuery срабатывает, когда сам запрос завершается неудачно, например, по таймауту или другим причинам. Смотрите документацию jQuery.
Сообщения об ошибках, которые генерирует PHP, появляются только при успешном выполнении запроса.
Для их отображения вы можете сделать, например, так:
success: function(data){
jQuery( data ).appendTo( 'body' );
}
Правда, потребуется немного стилизации :)
РЕДАКТИРОВАНО:
Поскольку в вашем скрипте возможно, что будет выводиться весь элемент form
, вы можете предотвратить это с помощью регулярных выражений в callback-функции success
:
success: function(data){
if( ! data.match( /<form/ ) )
jQuery( data ).appendTo( 'body' );
}
Таким образом, вы можете использовать регулярные выражения, чтобы избежать добавления вывода, который вам, возможно, не нужен.

Спасибо за это. Я пробовал этот способ, но он добавляет всю страницу. Можно ли добавить только сообщения об ошибках или успешном выполнении?

Благодаря @websupporter мне удалось найти решение моей проблемы.
Я использовал это внутри моей Ajax-функции:
success: function(data){
jQuery(data).find('.message').appendTo('#login-error');
}
А в PHP-коде я сделал следующее:
...
if(empty($username)) {
echo "<span class='message error'>Пожалуйста, введите имя пользователя.</span>";
exit();
}
...
Надеюсь, это будет полезно кому-нибудь.

Я столкнулся с такой же проблемой. Ни один из вышеперечисленных способов не сработал. Убедитесь, что вы установили dataType вашего AJAX-запроса в 'html', а не 'json'.
Пример кода:
$.ajax({
url: ajaxurl,
type: 'POST',
dataType: 'html',
cache: false,
data: { data: data, action: 'jseditajax' }
})
.done(function(response) {
response = response.slice(0, - 1); // удаляем 0 в последней позиции строки
response = JSON.parse(response); // преобразуем строку в JSON
console.log(response);
});
А в вашем PHP-файле можно просто:
echo json_encode($your_array);
Надеюсь, это поможет!
