- Вопрос или проблема
- Ответ или решение
- Проблемы с системой входа через Ajax в WordPress – Ошибка 302
- 1. Понимание кода состояния 302
- 2. Проверка функции wp_signon
- 3. Проверка Ajax-запроса
- 4. Корректное использование функции check_ajax_referer
- 5. Подготовка правильного ответа
- 6. Обработка ошибок в JavaScript
- Заключение
Вопрос или проблема
Я пытаюсь создать простую систему входа через Ajax с использованием WordPress. К сожалению, всякий раз, когда вызывается функция “wp_signon”, моя система не работает, и единственная информация, которая у меня есть, это:
POST myurl/wp-admin/admin-ajax.php - 302 Найдено
GET myurl/?login = failed - 200 Найдено
Таким образом, независимо от того, пытаюсь ли я войти с правильной информацией или нет, мой JS скрипт попадает в “часть ошибки” моей Ajax функции.
Может кто-то подсказать, что я делаю не так? Я буду очень признателен!
Большое спасибо!
JS :
jQuery(document).on('submit', loginForm, function(event) {
event.preventDefault();
var usernameVal = jQuery('.modal-login .login-form #user_login').val();
var passwordVal = jQuery('.modal-login .login-form #user_pass').val();
var remembermeField = jQuery('.modal-login .login-form #rememberme');
var securityVal = jQuery('.modal-login .login-form #security').val();
if ( remembermeField.prop('checked') ) {
var remembermeVal="true";
} else {
var remembermeVal="false";
}
jQuery.ajax({
type : "post",
url : data_front_end_users_management.ajaxurl,
dataType: 'json',
data: {
action: 'AuthUserAjax',
username: usernameVal,
password: passwordVal,
rememberme: remembermeVal,
security: securityVal
},
success: function(data) {
if ( data['answer'] === 1 ) {
modalAlert( msgRow, msgAlert, msgContent, false, 'alert-success', 'alert-danger', data['message'] );
} else {
modalAlert( msgRow, msgAlert, msgContent, false, 'alert-danger', 'alert-success', data['message'] );
}
//КОНЕЦ успеха
},
error: function () {
modalAlert( msgRow, msgAlert, msgContent, false, 'alert-danger', 'alert-success', defaultError );
}
//КОНЕЦ ajax
});
//КОНЕЦ jQuery(document).on('submit', loginForm, function(event)
});
ДЕЙСТВИЕ :
function AuthUserAjax() {
$LoginController = new FELoginController();
$value = array();
$value['answer'] = 0;
$value['message'] = '';
$username = trim($_POST['username']);
$password = trim($_POST['password']);
$rememberme = $_POST['rememberme'];
$security = $_POST['security'];
if ( $LoginController->checkAuthInfosFilled( $username, $password ) ) {
$user = $LoginController->UserAuth( $username, $password, $rememberme );
if ( $user ) {
if ( is_wp_error( $user ) ) {
$value['answer'] = 0;
$value['message'] = $user->get_error_message();
} else {
$value['answer'] = 1;
$value['message'] = 'Успех.';
}
//КОНЕЦ if ( $user )
} else {
$value['answer'] = 0;
$value['message'] = 'Неправильное имя пользователя или пароль.';
}
} else {
$value['answer'] = 0;
$value['message'] = 'Пожалуйста, введите ваше имя пользователя и пароль.';
}
$data = json_encode($value);
die( $data );
//КОНЕЦ AuthUserAjax
}
add_action( 'wp_ajax_AuthUserAjax','AuthUserAjax' );
add_action( 'wp_ajax_nopriv_AuthUserAjax','AuthUserAjax' );
КОНТРОЛЛЕР :
public function UserAuth( $username, $password, $rememberme ) {
if ( check_ajax_referer( 'ajax-login-nonce', 'security' ) ) {
$creds = array();
$creds['user_login'] = $username;
$creds['user_password'] = $password;
if ( $rememberme == 'true' || $rememberme == true ) {
$creds['remember'] = true;
} else {
$creds['remember'] = false;
}
$user = wp_signon( $creds, false );
return $user;
} else {
return false;
}
//КОНЕЦ UserAuth
}
Таким образом, после часов поиска я наконец нашел, в чем была моя проблема: другой метод в моем классе вмешивался в мою систему аутентификации через ajax.
.
Ответ или решение
Проблемы с системой входа через Ajax в WordPress – Ошибка 302
Если вы столкнулись с проблемой в вашей системе входа через Ajax, когда функция wp_signon
возвращает ответ с кодом 302 и все попытки входа (как успешные, так и неуспешные) завершаются ошибкой, это может быть вызвано несколькими факторами. Давайте подробно рассмотрим возможные причины и решения.
1. Понимание кода состояния 302
Ошибка 302 (Found) означает, что запрашиваемый ресурс временно перемещён на другой URL. В контексте вашего Ajax-запроса это может быть связано с переадресацией, происходящей после попытки входа. WordPress часто использует 302 для управления перенаправлениями, особенно если пользователь не вошел в систему или если используются проверки безопасности.
2. Проверка функции wp_signon
Одной из главных функций для аутентификации пользователей в WordPress является wp_signon
, которую вы используете в своем коде. Если при выполнении этой функции возникает переадресация, это может происходить из-за неправильных данных аутентификации или отсутствия необходимых параметров.
3. Проверка Ajax-запроса
Ваш JavaScript-код отправляет данные в admin-ajax.php
. Убедитесь, что передаваемые вами параметры соответствуют ожидаемым. Ваша функция AuthUserAjax
должна иметь возможность правильно обрабатывать входные данные. Проверьте, что:
$username
и$password
правильно передаются в запросе.- Верно передается nonce (защита от CSRF), который вы используете для проверки.
4. Корректное использование функции check_ajax_referer
В вашем контроллере UserAuth
вы используете check_ajax_referer
для проверки безопасности запроса. Если проверка не проходит, возникает логика return false;
, что может быть причиной вашего 302. Убедитесь, что nonce передается и проверяется правильно.
Пример:
if ( check_ajax_referer( 'ajax-login-nonce', 'security' ) ) {
// Код для выполнения входа
}
5. Подготовка правильного ответа
Убедитесь, что ответ вашей Ajax-функции имеет правильную структуру. Так как вы уже правильно обрабатываете разные случаи аутентификации, важно убедиться, что вы завершаете выполнение скрипта с помощью die()
или wp_die()
, как у вас и указано:
$data = json_encode($value);
wp_send_json($value); // более предпочтительное использование для отправки JSON
6. Обработка ошибок в JavaScript
Ваш JavaScript-код, хотя и содержит логику для обработки ошибок, возможно, не видит причин сбоя на стороне сервера. Рекомендуется добавить вывод ошибки в консоль для дальнейшего анализа:
error: function (jqXHR, textStatus, errorThrown) {
console.error('Ошибка:', textStatus, errorThrown);
modalAlert( msgRow, msgAlert, msgContent, false, 'alert-danger', 'alert-success', defaultError );
}
Заключение
Ваш случай показывает, как важно учитывать каждый шаг процесса аутентификации пользователей через Ajax в WordPress. Ошибка 302 может быть вызвана множеством факторов, среди которых неверная передача данных, проблемы проверки безопасности или дополнительные перенаправления, которые могут быть вызваны неправильной конфигурацией сервера. Правильная диагностика на каждом этапе поможет выявить и устранить проблему, обеспечив правильный вход пользователя через Ajax.