Як я можу перенаправити користувача після введення неправильного пароля?


16

Я використовую wp_login_form()для відображення форми входу в діалогове вікно jQuery.

Якщо користувач вводить неправильний пароль, користувач переноситься в бекенд. Я цього не хочу. Чи є спосіб сповістити користувача про те, що він ввів неправильний пароль і все ще залишається на тій же сторінці?

До wp_login_form()приходу я використовував плагін. Я сподіваюся, що я можу уникати використання плагіна для цього.

Мій код:

wp_login_form( array(
  'label_remember' => __( 'Remember me' ),
  'label_log_in' => __( 'Login' )
) );

Відповіді:


5

wp_login_form()створює форму з атрибутом дії site_url/wp-login.php, що означає, що при натисканні кнопки "Надіслати" розміщується форма, site_url/wp-login.phpяка ігнорує redirect_to за помилками (наприклад, неправильним паролем), тому у вашому випадку або поверніться до використання плагіна, або відтворіть весь процес входу. і таким чином ви будете контролювати помилки, подивіться на Перевірити правильність імені користувача у спеціальній формі входу, що дуже схоже питання.


26

Я прийшов сюди з google. Але відповідь мене не задовольнила. Я деякий час шукав і знайшов краще рішення.

Додайте це до своїх функцій.php :

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

function my_front_end_login_fail( $username ) {
   $referrer = $_SERVER['HTTP_REFERER'];  // where did the post submission come from?
   // 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') ) {
      wp_redirect( $referrer . '?login=failed' );  // let's append some information (login=failed) to the URL for the theme to use
      exit;
   }
}

Дякую Олексію, я перевірю це (оскільки я все ще використовую плагін)
Стівен

7
Рішення Олексія працює, коли вводяться неправильні облікові дані, але, на жаль, не вдається, коли користувач забуде ввести ім'я користувача або пароль. Мабуть, Wordpress навіть не намагається увійти до цього користувача, тому дія wp_login_failed не виконується.
Szczepan Hołyszewski

Я б тут використовував wp_get_referer (), щоб заощадити час: codex.wordpress.org/Function_Reference/wp_get_referer
Джейк

1
Також ви точно використовуєте тут add_query_arg, тому wp_redirect повинен бути: "wp_redirect (add_query_arg ('вхід', 'помилка', $ reference));"
Джейк

18

Нинішній метод, який я використовую для вирішення всіх проблем, описаних тут, чудово працює навіть із порожнім ім'ям користувача / паролем і не покладається на JavaScript (хоча js може бути хорошим разом із цим).

add_action( 'wp_login_failed', 'custom_login_failed' );
function custom_login_failed( $username )
{
    $referrer = wp_get_referer();

    if ( $referrer && ! strstr($referrer, 'wp-login') && ! strstr($referrer,'wp-admin') )
    {
        wp_redirect( add_query_arg('login', 'failed', $referrer) );
        exit;
    }
}

Ключ цього фільтра, щоб змінити поводження з порожнім ім'ям користувача / паролем:

add_filter( 'authenticate', 'custom_authenticate_username_password', 30, 3);
function custom_authenticate_username_password( $user, $username, $password )
{
    if ( is_a($user, 'WP_User') ) { return $user; }

    if ( empty($username) || empty($password) )
    {
        $error = new WP_Error();
        $user  = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid username or incorrect password.'));

        return $error;
    }
}

Ви можете зробити цей крок далі і повністю замінити wp-login.php, перенаправляючи користувачів на вашу власну сторінку входу, а також використовувати її для перенаправлення login_failed. Повний код:

/**
 * Custom Login Page Actions
 */
// Change the login url sitewide to the custom login page
add_filter( 'login_url', 'custom_login_url', 10, 2 );
// Redirects wp-login to custom login with some custom error query vars when needed
add_action( 'login_head', 'custom_redirect_login', 10, 2 );
// Updates login failed to send user back to the custom form with a query var
add_action( 'wp_login_failed', 'custom_login_failed', 10, 2 );
// Updates authentication to return an error when one field or both are blank
add_filter( 'authenticate', 'custom_authenticate_username_password', 30, 3);
// Automatically adds the login form to "login" page
add_filter( 'the_content', 'custom_login_form_to_login_page' );

/**
 * Custom Login Page Functions
 */
function custom_login_url( $login_url='', $redirect='' )
{
    $page = get_page_by_path('login');
    if ( $page )
    {
        $login_url = get_permalink($page->ID);

        if (! empty($redirect) )
            $login_url = add_query_arg('redirect_to', urlencode($redirect), $login_url);
    }
    return $login_url;
}
function custom_redirect_login( $redirect_to='', $request='' )
{
    if ( 'wp-login.php' == $GLOBALS['pagenow'] )
    {
        $redirect_url = custom_login_url();

        if (! empty($_GET['action']) )
        {
            if ( 'lostpassword' == $_GET['action'] )
            {
                return;
            }
            elseif ( 'register' == $_GET['action'] )
            {
                $register_page = get_page_by_path('register');
                $redirect_url = get_permalink($register_page->ID);
            }
        }
        elseif (! empty($_GET['loggedout'])  )
        {
            $redirect_url = add_query_arg('action', 'loggedout', custom_login_url());
        }

        wp_redirect( $redirect_url );
        exit;
    }
}
function custom_login_failed( $username )
{
    $referrer = wp_get_referer();

    if ( $referrer && ! strstr($referrer, 'wp-login') && ! strstr($referrer, 'wp-admin') )
    {
        if ( empty($_GET['loggedout']) )
        wp_redirect( add_query_arg('action', 'failed', custom_login_url()) );
        else
        wp_redirect( add_query_arg('action', 'loggedout', custom_login_url()) );
        exit;
    }
}
function custom_authenticate_username_password( $user, $username, $password )
{
    if ( is_a($user, 'WP_User') ) { return $user; }

    if ( empty($username) || empty($password) )
    {
        $error = new WP_Error();
        $user  = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid username or incorrect password.'));

        return $error;
    }
}
function custom_login_form_to_login_page( $content )
{
    if ( is_page('login') && in_the_loop() )
    {
        $output = $message = "";
        if (! empty($_GET['action']) )
        {
            if ( 'failed' == $_GET['action'] )
                $message = "There was a problem with your username or password.";
            elseif ( 'loggedout' == $_GET['action'] )
                $message = "You are now logged out.";
            elseif ( 'recovered' == $_GET['action'] )
                $message = "Check your e-mail for the confirmation link.";
        }

        if ( $message ) $output .= '<div class="message"><p>'. $message .'</p></div>';
        $output .= wp_login_form('echo=0&redirect='. site_url());
        $output .= '<a href="'. wp_lostpassword_url( add_query_arg('action', 'recovered', get_permalink()) ) .'" title="Recover Lost Password">Lost Password?</a>';

        $content .= $output;
    }
    return $content;
}

Налаштуйте та додайте їх, щоб додати ваш логотип на сторінку wp-login для відновлення пароля:

// calling it only on the login page
add_action( 'login_enqueue_scripts', 'custom_login_css', 10 );
function custom_login_css() { wp_enqueue_style( 'custom_login_css', get_template_directory_uri() .'/library/css/login.css', false ); }
// changing the logo link from wordpress.org to your site
add_filter( 'login_headerurl', 'custom_login_logo_url' );
function custom_login_logo_url() { return home_url(); }
// changing the alt text on the logo to show your site name
add_filter( 'login_headertitle', 'custom_login_title' );
function custom_login_title() { return get_option('blogname'); }

Css логотип для входу:

.login h1 a {
    background: url(../images/login-logo.png) no-repeat top center;
    width: 274px;
    height: 63px;
    text-indent: -9999px;
    overflow: hidden;
    padding-bottom: 15px;
    display: block;
}

EDIT: Я щойно реалізував це на іншій ділянці форми сайту і виявив, що вищезазначений "крок далі" є більш повним, і виправив невеликі синтаксичні помилки в "add_action". Додано кілька коментарів та метод автоматичного додавання форми входу на сторінку входу без окремого файлу шаблону. Метод форми входу повинен працювати в більшості випадків, оскільки він додається до "the_content", він може викликати та видавати, якщо у вас на сторінці входу є більше одного циклу, просто використовуйте шаблон page-login.php у цьому випадку.


1
Дякую, я погляну на це (і побачу, чи зможу я змусити його працювати разом із входом третіх сторін, як Twitter і FB)
Стівен

1
Джейк - це приємне повне рішення. Дякую, що поділились. +1
henrywright

Це в основному загорнуте у плагін під назвою Sewn In Template Login, досить повний невеликий плагін. wordpress.org/plugins/sewn-in-template-log-in
Джейк

Приємно, єдине питання полягає в тому, що він насправді не
Сія

4

Рішення для точки зору Щепана Холішевського про порожні поля у прийнятому рішенні, наступний jQuery не дозволить перейти на стандартну сторінку wp-login: (додати шаблон сторінки входу або footer.php)

jQuery("#loginform-custom").submit(function(){
     var isFormValid = true;
       jQuery("input").each(function()
       {
       if (jQuery.trim($(this).val()).length == 0){
       jQuery(this).addClass("submit_error");
       isFormValid = false;
       }     
     else {
     jQuery(this).removeClass("submit_error");
     }
     });
     return isFormValid;
});

0

Одне доповнення до відповіді Олексія. Ви можете додати функцію jquery, щоб перевірити, чи не одне з полів порожнє. Таким чином форма не надсилатиметься, якщо щось не перевірити, заважаючи WordPress перенаправлятись на /wp-login.php.

  <script>
        $("#wp-submit").click(function() {
          var user = $("input#user_login").val();
            if (user == "") {
            $("input#user_login").focus();
            return false;
          }
         });
  </script>   

Ще не знаєте, як виправити забутий пароль


3
Зауважте, що WordPress завантажує jQuery в режимі "Без конфлікту". $Ім'я користувача не працює.
s_ha_dum

Ви також повинні врахувати, що користувач натискає [enter], а не натискає кнопку t login. Також вам потрібно перевірити чи порожній пароль.
Стівен

-1
jQuery("#loginform-custom").submit(function(){
     var isFormValid = true;
       jQuery("input").each(function()
       {
       if (jQuery.trim($(this).val()).length == 0){
       jQuery(this).addClass("submit_error");
       isFormValid = false;
       }     
     else {
     jQuery(this).removeClass("submit_error");
     }
     });
     return isFormValid;
});

Будь ласка , змініть свій відповідь , і додати пояснення: чому це може вирішити цю проблему?
фуксія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.