Правильная настройка формы входа/регистрации


Я работаю над настраиваемой формой входа для WordPress. Я заметил, что довольно трудно добиться того, чего я хотел.

Вот HTML-код формы:

<form method="post" action="<?php bloginfo('url') ?>/wp-login.php">
    <div class="loginbox_fields">
        <div class="loginbox_field"><input type="text" name="log" id="user_login"  value="" placeholder="<?php _e('Username'); ?>"/></div>
        <div class="loginbox_field"><input type="password" name="pwd" id="user_pass" value="" placeholder="<?php _e('Password'); ?>"/></div>
        <div class="loginbox_text">
            <input name="rememberme" type="checkbox" id="rememberme" value="forever"  <?php checked( $rememberme ); ?> />
            <label for="remember"><?php esc_attr_e('Remember Me'); ?></label>
        </div>
        <a href="/nojs.html" class="loginbox_button form_submit" title="<?php esc_attr_e('Log In'); ?>"><?php esc_attr_e('Log In'); ?></a>
        <table>
            <tr>
                <td class="first_column">Not registered?</td>
                <td></td>
                <td>Forgot password?</td>
            </tr>
            <tr>
                <td class="first_column"><a href="<?php echo get_permalink(); ?>?action=register" class="loginbox_stdbutton" title="Register">Register</a></td>
                <td></td>
                <td><a href="<?php echo get_permalink(); ?>?action=lostpassword" class="loginbox_stdbutton" title="Reset Password">Reset Password</a></td>
            </tr>
        </table>
    </div>
</form>

Из-за требований к стилю я помещаю div обертывания вокруг полей input, а кнопка отправки является тегом привязки. Согласно документу, wp_login_form и его крючки не смогут реализовать эту конструкцию.

Поэтому я последовал предложениям по этому вопросу (я спросил) Пользовательский пользователь профиль, регистрация, страница входа в систему с темой, и получил что-то близкое к http://digwp.com/2010/12/login-register-password-code /. В принципе, это позволяет вам размещать форму входа в любом месте, где вы хотите, но все равно указывает на wp-login.php при отправке.

Но у него есть один существенный недостаток. Когда логин неверен, он возвращает вас к wp-login.php. Как в этой демо-версии , если вы нажмете "Войти", ничего не вводя, это приведет вас обратно к форме по умолчанию wp-login.php.

Я в настоящее время размещаю вышеуказанную форму на одной из пользовательских страниц. У меня был фильтр, подключенный к template_include, и я использовал этот HTML-код в качестве формы входа. Я только хотел изменить стиль, я не планирую добавлять функции.

Что требуется для реализации этого дизайна формы входа в систему? Должен ли я начать с wp-login.php и изменить его? Если да, то с чего мне начать (с точки зрения ввода темы и формы)?

Author: Community, 2013-02-10

1 answers

Чтобы перенаправить обратно в пользовательскую форму входа в систему после сбоя входа, попробуйте этот код:

// hook failed login
add_action('wp_login_failed', 'my_front_end_login_fail'); 

function my_front_end_login_fail($username){
    // Get the reffering page, where did the post submission come from?
    $referrer = add_query_arg('login', false, $_SERVER['HTTP_REFERER']);

    // if there's a valid referrer, and it's not the default log-in screen
    if(!empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin')){
        // let's append some information (login=failed) to the URL for the theme to use
        wp_redirect($referrer . '?login=failed'); 
    exit;
    }
}

Вам также придется проверить наличие пустого пароля или логина - когда форма входа из интерфейса (ваша пользовательская форма входа) будет отправлена пустой, вы попадете на стандартную wp-login.php еще раз. Чтобы предотвратить это, добавьте этот код:

add_action( 'login_head', 'my_frontend_login_no_pass_no_username' );

function my_frontend_login_no_pass_no_username(){
    $referrer = add_query_arg('login', false, $_SERVER['HTTP_REFERER']);
    if ( (!isset($_REQUEST['user_login']) || ( isset( $_REQUEST['user_login'] ) && trim( $_REQUEST['user_login'] ) == '' ) ) || (!isset($_REQUEST['user_pass']) || ( isset( $_REQUEST['user_pass'] ) && trim( $_REQUEST['user_pass'] ) == '' ) ) ){
        wp_redirect( add_query_arg('login', 'failed', $referrer) ); 
        exit; 
    }   
}

Если вы тоже заинтересованы в правильном входе в систему после неудачной регистрации, проверьте мой пост в блоге на эту тему.

 1
Author: david.binda, 2013-02-10 13:26:00