Форма входа на фронтенде не работает на живом сайте.

Вопрос или проблема

Я использую форму отправки на фронтенде. Она работает на локальном сервере идеально, но не работает, когда мой сайт в сети. Появляется “сообщение об успешном входе”, но на самом деле я не авторизован. Вот мой код:

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']);
}

?>

Ответ или решение

К сожалению, возникла ситуация, когда форма входа на фронтенде вашего сайта не работает на живом сайте, несмотря на успешное функционирование в локальной среде. Приведем намеченные шаги для диагностики и исправления данной проблемы, а также оптимизации вашего кода.

Анализ проблемы

  1. Отсутствие ошибки: При успешной обработке формы отображается сообщение об успехе, но фактическое состояние входа пользователей остается неавторизованным. Это указывает на то, что, возможно, происходит сбой в процессе аутентификации.

  2. Использование устаревших функций: Ваш код использует функцию 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;
?>

Устранение потенциальных причин

  1. Настройки PHP: Проверьте, не активированы ли на вашем хостинге какие-либо ограничения, которые могут предотвращать установление сессий или куки. Для функционирования системы авторизации WordPress необходимо, чтобы куки работали корректно.

  2. Проблемы с кэшем: Если на сайте используются плагины кэширования (например, W3 Total Cache или WP Super Cache), убедитесь, что кэш очищен после внесения изменений и не мешает процессу аутентификации.

  3. Проблемы с плагинами/темами: Отключите все плагины и переключитесь на стандартную тему (например, Twenty Twenty-One), чтобы проверить, нет ли конфликта с каким-либо из них.

  4. Отладка кода: Включите режим отладки в WordPress, добавив в файл wp-config.php строку:

    define('WP_DEBUG', true);

    Это позволит увидеть подробные сообщения об ошибках и поможет найти причину сбоя в работе.

Заключение

Код был модернизирован, чтобы избежать использования устаревших функций и учесть возможные ошибки. Убедитесь, что ваша серверная среда правильно настроена для работы с сессиями и куками. Не забывайте проводить тестирование после каждой настройки или изменения, чтобы гарантировать бесперебойную работу сайта.

Рекомендуется поддерживать код в актуальном состоянии, следуя последним обновлениям, чтобы избежать упомянутых проблем в будущем.

Оцените материал
Добавить комментарий

Капча загружается...