Как показать ошибки в форме входа?

Ссылка скопирована
1 ответ

Форма входа из ядра, но на кастомной странице

<?php         $args = array(         'echo' => true,         'redirect' => site_url( $_SERVER['REQUEST_URI'] ),          'form_id' => 'loginform',         'label_username' => __( "Nom d'utilisateur ou email" ),         'label_password' => __( 'Password' ),         'label_remember' => __( 'Remember Me' ),         'label_log_in' => __( 'Log In' ),         'id_username' => 'user_login',         'id_password' => 'user_pass',         'id_remember' => 'rememberme',         'id_submit' => 'wp-submit',         'remember' => false,         'value_username' => NULL,         'value_remember' => false );   wp_login_form( $args );?>

<?php $args = array( 'echo' => true, 'redirect' => site_url( $_SERVER['REQUEST_URI'] ), 'form_id' => 'loginform', 'label_username' => __( "Nom d'utilisateur ou email" ), 'label_password' => __( 'Password' ), 'label_remember' => __( 'Remember Me' ), 'label_log_in' => __( 'Log In' ), 'id_username' => 'user_login', 'id_password' => 'user_pass', 'id_remember' => 'rememberme', 'id_submit' => 'wp-submit', 'remember' => false, 'value_username' => NULL, 'value_remember' => false ); wp_login_form( $args );?>

Релиректы, чтобы при входе и выходе оставаться на той же странице

add_action('wp_logout','auto_redirect_after_logout');  function auto_redirect_after_logout(){   wp_safe_redirect( home_url('/ebibliotheque/') );   exit; }  function wpdocs_my_login_redirect( $url, $request, $user ) {     if ( $user && is_object( $user ) && is_a( $user, 'WP_User' ) ) {                    $url = home_url( '/ebibliotheque/' );             }     return $url; }  add_filter( 'login_redirect', 'wpdocs_my_login_redirect', 10, 3 );  add_action( 'wp_login_failed', 'my_front_end_login_fail' ); function my_front_end_login_fail( $username ) {      $referrer = $_SERVER['HTTP_REFERER'];      if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin')     ) {           wp_redirect( $referrer . '?login=failed' );           exit;      } }

add_action('wp_logout','auto_redirect_after_logout'); function auto_redirect_after_logout(){ wp_safe_redirect( home_url('/ebibliotheque/') ); exit; } function wpdocs_my_login_redirect( $url, $request, $user ) { if ( $user && is_object( $user ) && is_a( $user, 'WP_User' ) ) { $url = home_url( '/ebibliotheque/' ); } return $url; } add_filter( 'login_redirect', 'wpdocs_my_login_redirect', 10, 3 ); add_action( 'wp_login_failed', 'my_front_end_login_fail' ); function my_front_end_login_fail( $username ) { $referrer = $_SERVER['HTTP_REFERER']; if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') ) { wp_redirect( $referrer . '?login=failed' ); exit; } }

До того, как добавить последний редирект, переносило при введении неправильного пароля на wp-login.php.
Сейчас не переносит, но мне нужно показывать ошибки, что неверный логин или пароль. Сейчас ссылка превращается в site.com/ebibliotheque/?login=failed, но ошибок вообще нет. Если форма из ядра, то можно как-то и ошибки показать из ядра? Как прописать их?

Дополнительно:

ну так Вы передали GET параметр(login=failed).... проверьте его наличие и выдайте ошибку

  • Спасибо, как-то сделал
    let url = window.location.href; if(url.includes('?login=failed')){   jQuery('.forms-wrapper.d-flex').prepend("<div id='login_error'><strong>ERREUR</strong>: Le nom d'utilisateur ou le mot de passe est incorrect. </div>"); }

    let url = window.location.href; if(url.includes('?login=failed')){ jQuery('.forms-wrapper.d-flex').prepend("<div id='login_error'><strong>ERREUR</strong>: Le nom d'utilisateur ou le mot de passe est incorrect. </div>"); }

    Не знаю - так правильно или надо проверку из ядра?(если да -где ее взять?)

  • alexiusgrey, из ядра у Вас все работает на странице обработчика стандартного, но с него Вы уходите редиректом на кастомную страницу и передаете только get параметр. следовательно это единственная крошка для дальнейшей обработки. Javascript, считаю, в данном случае костыль. Лучше на php доработать. лучше, думаю, создать template под страницу авторизации, раз на то пошло, и прикрепить к созданной странице. добавтить тут
    if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin')     ) {

    if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') ) {

    проверку на некую переменную эрор, а также в самом template проверить get параметр, и, если он есть выводить разметку...

  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Роман IT Ответ

    wp_login_form() только выводит форму. Ошибки входа он сам в шаблон не вставляет. Если форма находится на кастомной странице, нужно перехватить неудачный логин, вернуть пользователя обратно и вывести сообщение через query arg или transient.

    Простой вариант через редирект:

    add_action('wp_login_failed', function ($username) {
        $redirect = wp_get_referer();
     
        if (! $redirect) {
            $redirect = home_url('/login/');
        }
     
        wp_safe_redirect(add_query_arg('login', 'failed', $redirect));
        exit;
    });
     
    add_filter('authenticate', function ($user, $username, $password) {
        if ($username === '' || $password === '') {
            $redirect = wp_get_referer() ?: home_url('/login/');
            wp_safe_redirect(add_query_arg('login', 'empty', $redirect));
            exit;
        }
     
        return $user;
    }, 30, 3);

    add_action('wp_login_failed', function ($username) { $redirect = wp_get_referer(); if (! $redirect) { $redirect = home_url('/login/'); } wp_safe_redirect(add_query_arg('login', 'failed', $redirect)); exit; }); add_filter('authenticate', function ($user, $username, $password) { if ($username === '' || $password === '') { $redirect = wp_get_referer() ?: home_url('/login/'); wp_safe_redirect(add_query_arg('login', 'empty', $redirect)); exit; } return $user; }, 30, 3);

    В шаблоне кастомной страницы перед формой:

    <?php if (isset($_GET['login']) && $_GET['login'] === 'failed') : ?>
        <div class="login-error">Неверный логин или пароль.</div>
    <?php elseif (isset($_GET['login']) && $_GET['login'] === 'empty') : ?>
        <div class="login-error">Заполните логин и пароль.</div>
    <?php endif; ?>
     
    <?php wp_login_form($args); ?>

    <?php if (isset($_GET['login']) && $_GET['login'] === 'failed') : ?> <div class="login-error">Неверный логин или пароль.</div> <?php elseif (isset($_GET['login']) && $_GET['login'] === 'empty') : ?> <div class="login-error">Заполните логин и пароль.</div> <?php endif; ?> <?php wp_login_form($args); ?>

    Для безопасности не выводите пользователю точную причину «такого пользователя нет» или «пароль неверный». Это помогает подбирать логины. Лучше общее сообщение: «Неверный логин или пароль».

    Также проверьте redirect в аргументах формы. Если после успешного входа нужно вернуться на текущую страницу, используйте:

    'redirect' => esc_url($_SERVER['REQUEST_URI']),

    'redirect' => esc_url($_SERVER['REQUEST_URI']),

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

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно