The login_init WordPress PHP action fires when the login form is initialized, allowing you to perform custom actions during the login process.
Usage
add_action('login_init', 'my_custom_login_init');
function my_custom_login_init() {
    // your custom code here
}
Parameters
- None
More information
See WordPress Developer Resources: login_init
Examples
Redirect users to a custom login page
Create a custom login page and redirect users to it instead of the default WordPress login page.
add_action('login_init', 'my_custom_login_page_redirect');
function my_custom_login_page_redirect() {
    $custom_login_page = 'https://example.com/custom-login-page';
    wp_redirect($custom_login_page);
    exit;
}
Enforce SSL on the login page
Force users to log in using SSL (HTTPS) for added security.
add_action('login_init', 'force_ssl_login');
function force_ssl_login() {
    if (!is_ssl()) {
        wp_safe_redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301);
        exit;
    }
}
Add a custom error message to the login page
Display a custom error message on the login page when users enter incorrect credentials.
add_action('login_init', 'my_custom_login_error_message');
function my_custom_login_error_message() {
    if (isset($_GET['login']) && $_GET['login'] === 'failed') {
        add_filter('login_errors', function () {
            return 'Incorrect username or password. Please try again.';
        });
    }
}
Limit login attempts
Limit the number of login attempts to protect your site from brute force attacks.
add_action('login_init', 'limit_login_attempts');
function limit_login_attempts() {
    if (!session_id()) {
        session_start();
    }
    if (isset($_SESSION['login_attempts']) && $_SESSION['login_attempts'] >= 5) {
        wp_die('Too many failed login attempts. Please try again later.');
    }
}
Log IP addresses of failed login attempts
Log the IP addresses of users who fail to log in to help identify potential security threats.
add_action('wp_login_failed', 'log_failed_login_attempts');
function log_failed_login_attempts($username) {
    $ip_address = $_SERVER['REMOTE_ADDR'];
    $failed_logins = get_option('failed_login_attempts', array());
    $failed_logins[] = array('username' => $username, 'ip_address' => $ip_address, 'timestamp' => current_time('mysql'));
    update_option('failed_login_attempts', $failed_logins);
}
add_action('login_init', 'check_failed_login_attempts');
function check_failed_login_attempts() {
    if (isset($_GET['login']) && $_GET['login'] === 'failed') {
        add_action('wp_login_failed', 'log_failed_login_attempts');
    }
}