Как создать свою форму входа/регистрации с обработкой ошибок?

10 нояб. 2013 г., 01:21:15
Просмотры: 21.3K
Голосов: 5

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

<!-- Начало формы входа -->               
<form name="loginform" id="login_form" class="login_form" action="<?php echo esc_url( wp_login_url() ); ?>" method="post">

    <p>
        <input type="text" name="log" id="user_login" class="input" placeholder="Имя пользователя" />
    </p>

    <p>
        <input type="password" name="pwd" id="user_pass" class="input" placeholder="Пароль" />
    </p>

    <button name="wp-submit" id="wp-submit" class="btn"><?php _e("Войти", "shorti"); ?></button>

    <input type="hidden" name="redirect_to" value="<?php echo $_SERVER["REQUEST_URI"]; ?>" />

</form>
<!-- конец формы входа -->

<!-- Начало формы регистрации -->
<form method="post" id="register_form" class="wp-user-form" action="<?php echo site_url('wp-login.php?action=register', 'login_post') ?>">

    <p><!-- Имя пользователя -->
        <input type="text" name="user_login" id="user_login" class="input" placeholder="имя пользователя" />
    </p>

    <p><!-- Email для отправки пароля -->
        <input type="email" name="user_email" id="user_email" class="input" placeholder="email адрес" />
    </p>

    <p class="small-text">Вы получите email с сгенерированным паролем<br />(который вы сможете изменить в "настройках пользователя")</p>

    <?php do_action('register_form'); ?>
    <button name="wp-submit" id="wp-submit" class="btn"><?php _e("Регистрация!", "shorti"); ?></button>
    <?php $register = $_GET['register']; if($register == true) { echo '<p>Проверьте свою почту для получения пароля!</p>'; } ?>
    <input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>?register=true" />
    <input type="hidden" name="user-cookie" value="1" />

</form><!-- конец формы регистрации -->

Это работает нормально, но когда возникает сообщение об ошибке, пользователь перенаправляется на wp-login.php. Мне нужно, чтобы страница с формой обрабатывала все ошибки с помощью AJAX для обеспечения лучшего пользовательского опыта. Как лучше всего это реализовать?

3
Комментарии

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

Nicolai Grossherr Nicolai Grossherr
10 нояб. 2013 г. 15:55:26

@ialocin: Пока что я ничего не делал с AJAX. Я мало работал с AJAX, поэтому даже не знаю, с чего начать. :( В последние дни я проводил расширенное исследование... но единственное, что я могу найти о том, как переопределить перенаправление на wp-login.php, требует дополнительных загрузок страниц; а это не то, чего я хочу. Некоторые из найденных мной материалов... здесь и здесь

Designer 17 Designer 17
12 нояб. 2013 г. 21:45:23

@Designer17 вы нашли решение? У меня такая же ситуация

alex alex
7 сент. 2014 г. 00:48:23
Все ответы на вопрос 2
1

Посмотрите на открывающий элемент формы. Значение атрибута action определяет, куда отправляются данные формы. Изменив это значение, вы можете перенаправить форму на саму себя вместо другой страницы.

Кодекс предлагает альтернативный подход к генерации разметки для необходимой формы:

http://codex.wordpress.org/Customizing_the_Login_Form#Make_a_Custom_Login_Page

Вот более подробное руководство:

http://digwp.com/2010/12/login-register-password-code/

Вы также можете использовать или модифицировать уже существующий популярный плагин для AJAX-авторизации:

http://wordpress.org/plugins/login-with-ajax/

10 нояб. 2013 г. 02:37:03
Комментарии

Да, ссылка Digging into WP — это отличный ресурс... я использовал её для создания того, что у меня есть сейчас (код, которым я поделился), но там не показано, как обрабатывать ошибки на той же странице (по крайней мере, я этого не увидел). Во-вторых, я разрабатываю это для собственного плагина, над которым работаю, а это значит: я не хочу зависеть от другого плагина, который должен постоянно работать, чтобы мой тоже функционировал.

Designer 17 Designer 17
12 нояб. 2013 г. 21:51:59
0

Вот что я делаю. Использую форму входа для создания логина https://codex.wordpress.org/Function_Reference/wp_login_form

Ниже приведены редиректы при входе/выходе и обработка ошибок входа. Это поможет вам с проблемами авторизации.

/** Редирект после входа
 * Перенаправляет пользователя после успешного входа.
 *
 * @param string $redirect_to URL для перенаправления.
 * @param string $request URL, с которого пришел пользователь.
 * @param object $user Данные авторизованного пользователя.
 * @return string
 */
function my_login_redirect( $redirect_to, $request, $user ) {
    // есть ли пользователь для проверки?
    global $user;
    if ( isset( $user->roles ) && is_array( $user->roles ) ) {
        // проверка для администраторов
        if ( in_array( 'administrator', $user->roles ) ) {
            // перенаправляем их в стандартное место
            return home_url('/wp-admin/');
        } else {
            return home_url();
        }
    } else {
        return $redirect_to;
    }
}

/*Обработка ошибок входа*/
add_action( 'wp_login_failed', 'aa_login_failed' ); // хук для неудачного входа

function aa_login_failed( $user ) {
    // проверяем, с какой страницы пришла попытка входа
    $referrer = $_SERVER['HTTP_REFERER'];

    // проверяем, что мы не на стандартной странице входа
    if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') && $user!=null ) {
        // убедимся, что у нас еще нет отметки о неудачной попытке входа
        if ( !strstr($referrer, '?login=failed' )) {
            // перенаправляем на страницу входа и добавляем параметр login=failed
            wp_redirect( $referrer . '?login=failed');
        } else {
            wp_redirect( $referrer );
        }

        exit;
    }
}

/*Обработка ошибок пустых полей входа*/
add_action( 'authenticate', 'pu_blank_login');

function pu_blank_login( $user ){
    // проверяем, с какой страницы пришла попытка входа
    $referrer = $_SERVER['HTTP_REFERER'];

    $error = false;

    if($_POST['log'] == '' || $_POST['pwd'] == '')
    {
        $error = true;
    }

    // проверяем, что мы не на стандартной странице входа
    if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') && $error ) {

        // убедимся, что у нас еще нет отметки о неудачной попытке входа
        if ( !strstr($referrer, '?login=failed') ) {
            // перенаправляем на страницу входа и добавляем параметр login=failed
            wp_redirect( $referrer . '?login=failed' );
        } else {
            wp_redirect( $referrer );
        }

    exit;

    }
}

/*Редирект после выхода*/
add_filter( 'login_redirect', 'my_login_redirect', 10, 3 );

function go_home(){
  wp_redirect( home_url('/login/') );
  exit();
}
add_action('wp_logout','go_home');
11 апр. 2014 г. 09:49:24