Вопрос или проблема
Я использую форму отправки на фронтенде. Она работает на локальном сервере идеально, но не работает, когда мой сайт в сети. Появляется “сообщение об успешном входе”, но на самом деле я не авторизован. Вот мой код:
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == 'log-in' ) :
global $error;
$login = wp_login( $_POST['user-name'], $_POST['password'] );
$login = wp_signon( array( 'user_login' => $_POST['user-name'], 'user_password' => $_POST['password'], 'remember' => $_POST['remember-me'] ), false );
if (!$error) {
save_message( 'success', __( 'Вы успешно авторизованы.', 'frontendprofile' ) );
unset($_POST);
wp_redirect( get_permalink( 4 ) );
}
// wp_redirect( home_url() );
endif;
Что я могу сделать, чтобы это исправить?
Не используйте функцию wp_login, она устарела, вместо этого используйте wp_signon. Функция wp_signon возвращает WP_Error при неудаче, поэтому используйте её для проверки условия следующим образом.
<?php
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == 'log-in' ) :
$login = wp_signon( array( 'user_login' => $_POST['user-name'], 'user_password' => $_POST['password'], 'remember' => $_POST['remember-me'] ), false );
if ( !is_wp_error($login) ){
save_message( 'success', __( 'Вы успешно авторизованы.', 'frontendprofile' ) );
unset($_POST);
wp_redirect( get_permalink( 4 ) );
}
endif;
?>
Вам нужно установить куки, я изменил ваш код следующим образом:
Обновлено
<?php
function parse_user($info = null, $return = 'object') {
if ( is_null( $info ) ) {
global $current_user;
if ( empty( $current_user->ID ) ) return null;
$info = get_userdata( $current_user->ID );
}
elseif ( empty( $info ) ) {
return null;
}
if( $return == 'ID' ) {
if ( is_object( $info ) ) return $info->ID;
if ( is_numeric( $info ) ) return $info;
}
elseif( $return == 'object' ) {
if ( is_object( $info ) && $info->ID) return $info;
if ( is_object( $info )) return get_userdata( $info->ID );
if ( is_numeric( $info ) ) return get_userdata( $info );
if ( is_string( $info ) ) return get_userdatabylogin( $info );
}
else {
return null;
}
}
function wp_login_user_po9856($username, $password, $remember) {
// Получаем пользователя по имени из POST
$user = parse_user($username);
// Убираем HTML теги из переменных
$username = strip_tags($username);
$password = strip_tags($password);
// Проверка данных формы
if(!wp_check_password( $password_stripped, $user->user_pass ) ) return new WP_Error('incorrect_password', "Неверный пароль!");
// Вход пользователя
$login = wp_signon(array('user_login' => $username, 'user_password' => $password, 'remember' => (bool)$remember));
if (is_wp_error($login))
return $login;
// Сброс
unset($_POST);
// Пользовательское сообщение
save_message( 'success', __( 'Вы успешно авторизованы.', 'frontendprofile' ) );
// Перенаправление
wp_redirect(get_permalink( 4 ));
}
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && @$_POST['action'] == 'log-in')
{
wp_login_user_po9856($_POST['user-name'], $_POST['password'], $_POST['remember-me']);
}
?>
Ответ или решение
К сожалению, возникла ситуация, когда форма входа на фронтенде вашего сайта не работает на живом сайте, несмотря на успешное функционирование в локальной среде. Приведем намеченные шаги для диагностики и исправления данной проблемы, а также оптимизации вашего кода.
Анализ проблемы
-
Отсутствие ошибки: При успешной обработке формы отображается сообщение об успехе, но фактическое состояние входа пользователей остается неавторизованным. Это указывает на то, что, возможно, происходит сбой в процессе аутентификации.
-
Использование устаревших функций: Ваш код использует функцию
wp_login
, которая считается устаревшей. Вместо нее рекомендуется использоватьwp_signon
, которая также возвращает объектWP_Error
при неудаче. Это поможет корректно отрабатывать сценарий, когда вход не удастся.
Решение проблемы
Ниже описано, как модифицировать ваш код для улучшения работы и устранения проблемы:
<?php
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty($_POST['action']) && $_POST['action'] == 'log-in' ) :
// Вход пользователя
$login = wp_signon(array(
'user_login' => $_POST['user-name'],
'user_password' => $_POST['password'],
'remember' => isset($_POST['remember-me'])
), false);
// Проверка на наличие ошибки
if ( !is_wp_error($login) ) {
save_message('success', __('Вы успешно вошли.', 'frontendprofile'));
unset($_POST);
wp_redirect(get_permalink(4));
exit; // добавляем exit для предотвращения дальнейшей обработки скрипта
} else {
save_message('error', $login->get_error_message());
}
endif;
?>
Устранение потенциальных причин
-
Настройки PHP: Проверьте, не активированы ли на вашем хостинге какие-либо ограничения, которые могут предотвращать установление сессий или куки. Для функционирования системы авторизации WordPress необходимо, чтобы куки работали корректно.
-
Проблемы с кэшем: Если на сайте используются плагины кэширования (например, W3 Total Cache или WP Super Cache), убедитесь, что кэш очищен после внесения изменений и не мешает процессу аутентификации.
-
Проблемы с плагинами/темами: Отключите все плагины и переключитесь на стандартную тему (например, Twenty Twenty-One), чтобы проверить, нет ли конфликта с каким-либо из них.
-
Отладка кода: Включите режим отладки в WordPress, добавив в файл
wp-config.php
строку:define('WP_DEBUG', true);
Это позволит увидеть подробные сообщения об ошибках и поможет найти причину сбоя в работе.
Заключение
Код был модернизирован, чтобы избежать использования устаревших функций и учесть возможные ошибки. Убедитесь, что ваша серверная среда правильно настроена для работы с сессиями и куками. Не забывайте проводить тестирование после каждой настройки или изменения, чтобы гарантировать бесперебойную работу сайта.
Рекомендуется поддерживать код в актуальном состоянии, следуя последним обновлениям, чтобы избежать упомянутых проблем в будущем.