Правильная настройка формы входа/регистрации
Я работаю над настраиваемой формой входа для 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 и изменить его? Если да, то с чего мне начать (с точки зрения ввода темы и формы)?
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;
}
}
Если вы тоже заинтересованы в правильном входе в систему после неудачной регистрации, проверьте мой пост в блоге на эту тему.