Tất nhiên, chúng tôi sẽ không thực hiện bất kỳ thay đổi nào trong tệp wp-login.php của WordPress, nhưng do thiếu hook bên trong nó, tốt hơn là bạn nên tạo một mẫu trang tùy chỉnh.
Tôi quyết định đặt tất cả mã vào một tệp duy nhất, nhưng bạn có thể tách nó thành các tệp khác nhau.
/* Template name: No more passwords */ // Redirect logged-in users to member's area or admin area if ( is_user_logged_in() ) { wp_redirect( admin_url() ); exit; } // Check if the form is being submitted if ( !empty( $_POST['misha_email'] ) && ( $user_data = get_user_by( 'email', $_POST['misha_email'] ) ) && !is_wp_error( $key = get_password_reset_key( $user_data ) ) ) { // Generate login URL $login_url = add_query_arg( array( 'key' => $key, 'email' => rawurlencode( $user_data->user_email ) ), site_url('login') ); // Prepare email headers and message $headers = array( 'From: Misha <[email protected]>', 'Content-type: text/html; charset=utf-8' ); $message = 'Here is your link to login <a href="' . $login_url . '">' . $login_url . '</a>'; // Send email wp_mail( $user_data->user_email, 'Sign in to YOUR-WEBSITE.COM', $message, $headers ); // Redirect user to success message page wp_redirect( add_query_arg('status', 'sent', site_url('login') ) ); exit; } // If it's the login link being clicked else if( !empty( $_GET['key'] ) && !empty($_GET['email']) ) { // Validate the reset key if( ( $user_data = get_user_by( 'email', $_GET['email'] ) ) && ( !is_wp_error( $check = check_password_reset_key( wp_unslash( $_GET['key']), $user_data->user_login ) ) ) ) { // Set authentication cookie wp_set_auth_cookie( $check->data->ID, true, false ); // Redirect user to admin area or members' dashboard wp_redirect( admin_url() ); exit; } else { echo 'The authentication link is expired or incorrect. Please try again.'; } } // Display status message after email is sent if( isset( $_GET['status'] ) && $_GET['status'] == 'sent' ) { echo 'If this email is registered on the website, please check your inbox.'; } // Display the email form echo '<form action="" method="POST"> <input type="email" name="misha_email" required /> <button type="submit">Send login link</button> </form>';
Và điều cuối cùng tôi muốn bạn biết là bạn có thể thay đổi thời gian hết hạn liên kết bằng password_reset_expiration
action hook (mặc định là 1 ngày)
add_filter( 'password_reset_expiration', 'misha_custom_activation_link_period', 9999 ); function misha_custom_activation_link_period( $day_in_seconds ) { return 900; // 15 minutes }
Hy vọng sẽ hữu ích với bạn.