Làm cách nào để chuyển hướng người dùng sau khi nhập sai mật khẩu?


16

Tôi đang sử dụng wp_login_form()để hiển thị biểu mẫu đăng nhập trong cửa sổ hộp thoại jQuery.

Nếu người dùng nhập sai mật khẩu, người dùng sẽ được đưa vào phụ trợ. Tôi không muốn điều đó. Có cách nào để thông báo cho người dùng rằng anh ta nhập sai mật khẩu và vẫn ở cùng một trang không?

Trước khi wp_login_form()đến tôi đã sử dụng một plugin. Tôi hy vọng tôi có thể tránh sử dụng một plugin cho việc này.

Mã của tôi:

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

Câu trả lời:


5

wp_login_form()tạo một biểu mẫu với thuộc tính hành động site_url/wp-login.php, nghĩa là khi bạn nhấp vào nút gửi, biểu mẫu được đăng lên site_url/wp-login.phpmà bỏ qua redirect_to trên các lỗi (như sai mật khẩu), do đó, trong trường hợp của bạn, hãy quay lại sử dụng plugin hoặc tạo lại toàn bộ quá trình đăng nhập và theo cách đó bạn sẽ kiểm soát được các lỗi, hãy xem Kiểm tra tên người dùng chính xác trên biểu mẫu đăng nhập tùy chỉnh , đây là câu hỏi rất giống nhau.


26

Tôi đến đây từ google. Nhưng câu trả lời không làm tôi hài lòng. Tôi đã tìm kiếm một lúc và tìm thấy một giải pháp tốt hơn.

Thêm phần này vào hàm của bạn.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;
   }
}

Cảm ơn Alexey, tôi sẽ kiểm tra điều này (vì tôi vẫn đang sử dụng một plugin)
Steven

7
Giải pháp của Alexey hoạt động khi nhập sai thông tin đăng nhập, nhưng không may thất bại khi người dùng quên nhập tên người dùng hoặc mật khẩu. Rõ ràng Wordpress thậm chí không cố gắng đăng nhập người dùng trong trường hợp này, vì vậy hành động wp_login_fails không được thực hiện.
Szczepan Hołyszewski

Tôi sẽ sử dụng wp_get_Vferer () tại đây để tiết kiệm thời gian: codex.wordpress.org/Function_Reference/wp_get_Vferer
Jake

1
Ngoài ra, bạn chắc chắn sử dụng add_query_arg tại đây, vì vậy wp_redirect phải là: "wp_redirect (add_query_arg ('login', 'fail', $ tham chiếu));"
Jake

18

Phương pháp hiện tại tôi đang sử dụng để giải quyết tất cả các vấn đề được nêu ở đây hoạt động rất tốt ngay cả với tên người dùng / mật khẩu trống và không phụ thuộc vào javascript (mặc dù js có thể tốt với điều này).

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;
    }
}

Chìa khóa là bộ lọc này để thay đổi cách xử lý tên người dùng / mật khẩu trống:

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;
    }
}

Bạn có thể tiến thêm một bước này và thay thế hoàn toàn wp-login.php bằng cách chuyển hướng người dùng đến trang đăng nhập tùy chỉnh của bạn và sử dụng trang đó để chuyển hướng login_fails. Mã đầy đủ:

/**
 * 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;
}

Tùy chỉnh và thêm chúng để thêm logo của bạn vào trang đăng nhập wp để khôi phục mật khẩu:

// 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'); }

Đăng nhập logo 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: Tôi vừa thực hiện điều này trên một mẫu đầu trang khác và thấy "bước tiếp theo" ở trên hoàn thiện hơn và đã sửa các lỗi cú pháp nhỏ trong "add_ilities". Đã thêm một số nhận xét và phương pháp để tự động thêm biểu mẫu đăng nhập vào trang đăng nhập mà không cần tệp mẫu riêng. Phương thức biểu mẫu đăng nhập sẽ hoạt động trong hầu hết các trường hợp, vì nó được đính kèm với "the_content", nó có thể gây ra và sự cố nếu bạn có nhiều vòng lặp trên trang đăng nhập, chỉ cần sử dụng mẫu page-login.php trong trường hợp đó.


1
Cảm ơn, tôi sẽ xem xét điều này (và xem liệu tôi có thể làm cho nó hoạt động cùng với đăng nhập của bên thứ 3 như Twitter và FB không)
Steven

1
Jake - đây là một giải pháp hoàn chỉnh tốt đẹp. Cám ơn vì đã chia sẻ. +1
henrywright

Điều này về cơ bản được gói vào một plugin có tên là Sewn In Template Đăng nhập, một plugin khá nhỏ, hoàn chỉnh. wordpress.org/plugins/sewn-in-template-log-in
Jake

Thật tuyệt, vấn đề duy nhất là nó không thực sự phát sinh lỗi ở mặt trước ....
Siyah

4

Một giải pháp cho quan điểm của Szczepan Hołyszewski về các trường trống trong giải pháp được chấp nhận, jQuery sau đây sẽ ngăn không truy cập trang đăng nhập wp tiêu chuẩn: (thêm vào mẫu trang đăng nhập hoặc 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

Một bổ sung cho câu trả lời của Alexey. Bạn có thể thêm một hàm jquery để kiểm tra xem một trong các trường không trống. Bằng cách đó, biểu mẫu sẽ không gửi trừ khi có điều gì đó để kiểm tra, ngăn WordPress chuyển hướng đến /wp-login.php.

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

Vẫn không chắc chắn cách khắc phục khía cạnh quên mật khẩu


3
Xin lưu ý rằng WordPress tải jQuery ở chế độ "Không xung đột". Các $bí danh không hoạt động.
s_ha_dum

Bạn cũng phải xem xét rằng người dùng nhấn [enter] và không nhấp vào nút đăng nhập. Ngoài ra, bạn cần phải kiểm tra mật khẩu trống.
Steven

-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;
});

Vui lòng chỉnh sửa câu trả lời của bạn và thêm một lời giải thích: tại sao điều đó có thể giải quyết vấn đề?
fuxia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.