Title: login_header
Published: April 25, 2014
Last modified: August 20, 2026

---

# login_header( string|null $title = null, string $message = '', WP_Error|null $wp_error = null )

## In this article

 * [Parameters](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#parameters)
 * [Source](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#source)
 * [Hooks](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#hooks)
 * [Related](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#changelog)
 * [User Contributed Notes](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#user-contributed-notes)

[ Back to top](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#wp--skip-link--target)

Outputs the login page header.

## 󠀁[Parameters](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#parameters)󠁿

 `$title`string|nulloptional

WordPress login page title to display in the `<title>` element.
 Defaults to ‘Log
In’.

Default:`null`

`$message`stringoptional

Message to display in header.

Default:`''`

`$wp_error`[WP_Error](https://developer.wordpress.org/reference/classes/wp_error/)
|nulloptional

The error to pass. Defaults to a [WP_Error](https://developer.wordpress.org/reference/classes/wp_error/)
instance.

Default:`null`

## 󠀁[Source](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#source)󠁿

    ```php
    function login_header( $title = null, $message = '', $wp_error = null ) {
    	global $error, $interim_login, $action;

    	if ( null === $title ) {
    		$title = __( 'Log In' );
    	}

    	// Don't index any of these forms.
    	add_filter( 'wp_robots', 'wp_robots_sensitive_page' );
    	add_action( 'login_head', 'wp_strict_cross_origin_referrer' );

    	add_action( 'login_head', 'wp_login_viewport_meta' );

    	if ( ! is_wp_error( $wp_error ) ) {
    		$wp_error = new WP_Error();
    	}

    	// Shake it!
    	$shake_error_codes = array( 'empty_password', 'empty_email', 'invalid_email', 'invalidcombo', 'empty_username', 'invalid_username', 'incorrect_password', 'retrieve_password_email_failure' );
    	/**
    	 * Filters the error codes array for shaking the login form.
    	 *
    	 * @since 3.0.0
    	 *
    	 * @param string[] $shake_error_codes Error codes that shake the login form.
    	 */
    	$shake_error_codes = apply_filters( 'shake_error_codes', $shake_error_codes );

    	if ( $shake_error_codes && $wp_error->has_errors() && in_array( $wp_error->get_error_code(), $shake_error_codes, true ) ) {
    		add_action( 'login_footer', 'wp_shake_js', 12 );
    	}

    	$login_title = get_bloginfo( 'name', 'display' );

    	/* translators: Login screen title. 1: Login screen name, 2: Network or site name. */
    	$login_title = sprintf( __( '%1$s &lsaquo; %2$s &#8212; WordPress' ), $title, $login_title );

    	if ( wp_is_recovery_mode() ) {
    		/* translators: %s: Login screen title. */
    		$login_title = sprintf( __( 'Recovery Mode &#8212; %s' ), $login_title );
    	}

    	/**
    	 * Filters the title tag content for login page.
    	 *
    	 * @since 4.9.0
    	 *
    	 * @param string $login_title The page title, with extra context added.
    	 * @param string $title       The original page title.
    	 */
    	$login_title = apply_filters( 'login_title', $login_title, $title );

    	?><!DOCTYPE html>
    	<html <?php language_attributes(); ?>>
    	<head>
    	<meta http-equiv="Content-Type" content="<?php bloginfo( 'html_type' ); ?>; charset=<?php bloginfo( 'charset' ); ?>" />
    	<title><?php echo $login_title; ?></title>
    	<?php

    	wp_enqueue_style( 'login' );

    	/*
    	 * Remove all stored post data on logging out.
    	 * This could be added by add_action('login_head'...) like wp_shake_js(),
    	 * but maybe better if it's not removable by plugins.
    	 */
    	if ( 'loggedout' === $wp_error->get_error_code() ) {
    		ob_start();
    		?>
    		<script>if("sessionStorage" in window){try{for(var key in sessionStorage){if(key.indexOf("wp-autosave-")!=-1){sessionStorage.removeItem(key)}}}catch(e){}};</script>
    		<?php
    		wp_print_inline_script_tag( wp_remove_surrounding_empty_script_tags( ob_get_clean() ) );
    	}

    	/**
    	 * Enqueues scripts and styles for the login page.
    	 *
    	 * @since 3.1.0
    	 */
    	do_action( 'login_enqueue_scripts' );

    	/**
    	 * Fires in the login page header after scripts are enqueued.
    	 *
    	 * @since 2.1.0
    	 */
    	do_action( 'login_head' );

    	$login_header_url = __( 'https://wordpress.org/' );

    	/**
    	 * Filters link URL of the header logo above login form.
    	 *
    	 * @since 2.1.0
    	 *
    	 * @param string $login_header_url Login header logo URL.
    	 */
    	$login_header_url = apply_filters( 'login_headerurl', $login_header_url );

    	$login_header_title = '';

    	/**
    	 * Filters the title attribute of the header logo above login form.
    	 *
    	 * @since 2.1.0
    	 * @deprecated 5.2.0 Use 'login_headertext' instead.
    	 *
    	 * @param string $login_header_title Login header logo title attribute.
    	 */
    	$login_header_title = apply_filters_deprecated(
    		'login_headertitle',
    		array( $login_header_title ),
    		'5.2.0',
    		'login_headertext',
    		__( 'Usage of the title attribute on the login logo is not recommended for accessibility reasons. Use the link text instead.' )
    	);

    	$login_header_text = empty( $login_header_title ) ? __( 'Powered by WordPress' ) : $login_header_title;

    	/**
    	 * Filters the link text of the header logo above the login form.
    	 *
    	 * @since 5.2.0
    	 *
    	 * @param string $login_header_text The login header logo link text.
    	 */
    	$login_header_text = apply_filters( 'login_headertext', $login_header_text );

    	$classes = array( 'login-action-' . $action, 'wp-core-ui', 'admin-color-modern' );

    	if ( is_rtl() ) {
    		$classes[] = 'rtl';
    	}

    	if ( $interim_login ) {
    		$classes[] = 'interim-login';

    		?>
    		<style>html{background-color: transparent;}</style>
    		<?php

    		if ( 'success' === $interim_login ) {
    			$classes[] = 'interim-login-success';
    		}
    	}

    	$classes[] = 'locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );

    	/**
    	 * Filters the login page body classes.
    	 *
    	 * @since 3.5.0
    	 *
    	 * @param string[] $classes An array of body classes.
    	 * @param string   $action  The action that brought the visitor to the login page.
    	 */
    	$classes = apply_filters( 'login_body_class', $classes, $action );

    	?>
    	</head>
    	<body class="login no-js <?php echo esc_attr( implode( ' ', $classes ) ); ?>">
    	<?php
    	wp_print_inline_script_tag( "document.body.className = document.body.className.replace('no-js','js');" );
    	?>

    	<?php
    	/**
    	 * Fires in the login page header after the body tag is opened.
    	 *
    	 * @since 4.6.0
    	 */
    	do_action( 'login_header' );
    	?>
    	<?php
    	if ( 'confirm_admin_email' !== $action && ! empty( $title ) ) :
    		?>
    		<h1 class="screen-reader-text"><?php echo $title; ?></h1>
    		<?php
    	endif;
    	?>
    	<div id="login">
    		<h1 role="presentation" class="wp-login-logo"><a href="<?php echo esc_url( $login_header_url ); ?>"><?php echo $login_header_text; ?></a></h1>
    	<?php
    	/**
    	 * Filters the message to display above the login form.
    	 *
    	 * @since 2.1.0
    	 *
    	 * @param string $message Login message text.
    	 */
    	$message = apply_filters( 'login_message', $message );

    	if ( ! empty( $message ) ) {
    		echo $message . "\n";
    	}

    	// In case a plugin uses $error rather than the $wp_errors object.
    	if ( ! empty( $error ) ) {
    		$wp_error->add( 'error', $error );
    		unset( $error );
    	}

    	if ( $wp_error->has_errors() ) {
    		$error_list = array();
    		$messages   = '';

    		foreach ( $wp_error->get_error_codes() as $code ) {
    			$severity = $wp_error->get_error_data( $code );
    			foreach ( $wp_error->get_error_messages( $code ) as $error_message ) {
    				if ( 'message' === $severity ) {
    					$messages .= '<p>' . $error_message . '</p>';
    				} else {
    					$error_list[] = $error_message;
    				}
    			}
    		}

    		if ( ! empty( $error_list ) ) {
    			$errors = '';

    			if ( count( $error_list ) > 1 ) {
    				$errors .= '<ul class="login-error-list">';

    				foreach ( $error_list as $item ) {
    					$errors .= '<li>' . $item . '</li>';
    				}

    				$errors .= '</ul>';
    			} else {
    				$errors .= '<p>' . $error_list[0] . '</p>';
    			}

    			/**
    			 * Filters the error messages displayed above the login form.
    			 *
    			 * @since 2.1.0
    			 *
    			 * @param string $errors Login error messages.
    			 */
    			$errors = apply_filters( 'login_errors', $errors );

    			wp_admin_notice(
    				$errors,
    				array(
    					'type'           => 'error',
    					'id'             => 'login_error',
    					'paragraph_wrap' => false,
    				)
    			);
    		}

    		if ( ! empty( $messages ) ) {
    			/**
    			 * Filters instructional messages displayed above the login form.
    			 *
    			 * @since 2.5.0
    			 *
    			 * @param string $messages Login messages.
    			 */
    			$messages = apply_filters( 'login_messages', $messages );

    			wp_admin_notice(
    				$messages,
    				array(
    					'type'               => 'info',
    					'id'                 => 'login-message',
    					'additional_classes' => array( 'message' ),
    					'paragraph_wrap'     => false,
    				)
    			);
    		}
    	}
    } // End of login_header().
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-login.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/7.1/src/wp-login.php#L41)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/7.1/src/wp-login.php#L41-L313)

## 󠀁[Hooks](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#hooks)󠁿

 [apply_filters( ‘login_body_class’, string[] $classes, string $action )](https://developer.wordpress.org/reference/hooks/login_body_class/)

Filters the login page body classes.

 [do_action( ‘login_enqueue_scripts’ )](https://developer.wordpress.org/reference/hooks/login_enqueue_scripts/)

Enqueues scripts and styles for the login page.

 [apply_filters( ‘login_errors’, string $errors )](https://developer.wordpress.org/reference/hooks/login_errors/)

Filters the error messages displayed above the login form.

 [do_action( ‘login_head’ )](https://developer.wordpress.org/reference/hooks/login_head/)

Fires in the login page header after scripts are enqueued.

 [do_action( ‘login_header’ )](https://developer.wordpress.org/reference/hooks/login_header/)

Fires in the login page header after the body tag is opened.

 [apply_filters( ‘login_headertext’, string $login_header_text )](https://developer.wordpress.org/reference/hooks/login_headertext/)

Filters the link text of the header logo above the login form.

 [apply_filters_deprecated( ‘login_headertitle’, string $login_header_title )](https://developer.wordpress.org/reference/hooks/login_headertitle/)

Filters the title attribute of the header logo above login form.

 [apply_filters( ‘login_headerurl’, string $login_header_url )](https://developer.wordpress.org/reference/hooks/login_headerurl/)

Filters link URL of the header logo above login form.

 [apply_filters( ‘login_message’, string $message )](https://developer.wordpress.org/reference/hooks/login_message/)

Filters the message to display above the login form.

 [apply_filters( ‘login_messages’, string $messages )](https://developer.wordpress.org/reference/hooks/login_messages/)

Filters instructional messages displayed above the login form.

 [apply_filters( ‘login_title’, string $login_title, string $title )](https://developer.wordpress.org/reference/hooks/login_title/)

Filters the title tag content for login page.

 [apply_filters( ‘shake_error_codes’, string[] $shake_error_codes )](https://developer.wordpress.org/reference/hooks/shake_error_codes/)

Filters the error codes array for shaking the login form.

## 󠀁[Related](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#related)󠁿

| Uses | Description | 
| [wp_admin_notice()](https://developer.wordpress.org/reference/functions/wp_admin_notice/)`wp-includes/functions.php` |

Outputs an admin notice.

  | 
| [wp_remove_surrounding_empty_script_tags()](https://developer.wordpress.org/reference/functions/wp_remove_surrounding_empty_script_tags/)`wp-includes/script-loader.php` |

Removes leading and trailing _empty_ script tags.

  | 
| [wp_print_inline_script_tag()](https://developer.wordpress.org/reference/functions/wp_print_inline_script_tag/)`wp-includes/script-loader.php` |

Prints an inline script tag.

  | 
| [wp_is_recovery_mode()](https://developer.wordpress.org/reference/functions/wp_is_recovery_mode/)`wp-includes/load.php` |

Determines whether WordPress is in Recovery Mode.

  | 
| [WP_Error::has_errors()](https://developer.wordpress.org/reference/classes/wp_error/has_errors/)`wp-includes/class-wp-error.php` |

Verifies if the instance contains errors.

  | 
| [apply_filters_deprecated()](https://developer.wordpress.org/reference/functions/apply_filters_deprecated/)`wp-includes/plugin.php` |

Fires functions attached to a deprecated filter hook.

  | 
| [get_locale()](https://developer.wordpress.org/reference/functions/get_locale/)`wp-includes/l10n.php` |

Retrieves the current locale.

  | 
| [sanitize_html_class()](https://developer.wordpress.org/reference/functions/sanitize_html_class/)`wp-includes/formatting.php` |

Sanitizes an HTML classname to ensure it only contains valid characters.

  | 
| [language_attributes()](https://developer.wordpress.org/reference/functions/language_attributes/)`wp-includes/general-template.php` |

Displays the language attributes for the ‘html’ tag.

  | 
| [bloginfo()](https://developer.wordpress.org/reference/functions/bloginfo/)`wp-includes/general-template.php` |

Displays information about the current site.

  | 
| [is_rtl()](https://developer.wordpress.org/reference/functions/is_rtl/)`wp-includes/l10n.php` |

Determines whether the current locale is right-to-left (RTL).

  | 
| [WP_Error::get_error_code()](https://developer.wordpress.org/reference/classes/wp_error/get_error_code/)`wp-includes/class-wp-error.php` |

Retrieves the first error code available.

  | 
| [WP_Error::add()](https://developer.wordpress.org/reference/classes/wp_error/add/)`wp-includes/class-wp-error.php` |

Adds an error or appends an additional message to an existing error.

  | 
| [WP_Error::get_error_data()](https://developer.wordpress.org/reference/classes/wp_error/get_error_data/)`wp-includes/class-wp-error.php` |

Retrieves the most recently added error data for an error code.

  | 
| [WP_Error::get_error_messages()](https://developer.wordpress.org/reference/classes/wp_error/get_error_messages/)`wp-includes/class-wp-error.php` |

Retrieves all error messages, or the error messages for the given error code.

  | 
| [WP_Error::get_error_codes()](https://developer.wordpress.org/reference/classes/wp_error/get_error_codes/)`wp-includes/class-wp-error.php` |

Retrieves all error codes.

  | 
| [__()](https://developer.wordpress.org/reference/functions/__/)`wp-includes/l10n.php` |

Retrieves the translation of $text.

  | 
| [esc_attr()](https://developer.wordpress.org/reference/functions/esc_attr/)`wp-includes/formatting.php` |

Escaping for HTML attributes.

  | 
| [esc_url()](https://developer.wordpress.org/reference/functions/esc_url/)`wp-includes/formatting.php` |

Checks and cleans a URL.

  | 
| [get_bloginfo()](https://developer.wordpress.org/reference/functions/get_bloginfo/)`wp-includes/general-template.php` |

Retrieves information about the current site.

  | 
| [wp_enqueue_style()](https://developer.wordpress.org/reference/functions/wp_enqueue_style/)`wp-includes/functions.wp-styles.php` |

Enqueues a CSS stylesheet.

  | 
| [add_filter()](https://developer.wordpress.org/reference/functions/add_filter/)`wp-includes/plugin.php` |

Adds a callback function to a filter hook.

  | 
| [add_action()](https://developer.wordpress.org/reference/functions/add_action/)`wp-includes/plugin.php` |

Adds a callback function to an action hook.

  | 
| [apply_filters()](https://developer.wordpress.org/reference/functions/apply_filters/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to a filter hook.

  | 
| [do_action()](https://developer.wordpress.org/reference/functions/do_action/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to an action hook.

  | 
| [is_wp_error()](https://developer.wordpress.org/reference/functions/is_wp_error/)`wp-includes/load.php` |

Checks whether the given variable is a WordPress Error.

  | 
| [WP_Error::__construct()](https://developer.wordpress.org/reference/classes/wp_error/__construct/)`wp-includes/class-wp-error.php` |

Initializes the error.

  |

[Show 22 more](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#)

## 󠀁[Changelog](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#changelog)󠁿

| Version | Description | 
| [2.1.0](https://developer.wordpress.org/reference/since/2.1.0/) | Introduced. |

## 󠀁[User Contributed Notes](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#user-contributed-notes)󠁿

 1.  [Skip to note 2 content](https://developer.wordpress.org/reference/functions/login_header/?output_format=md#comment-content-1484)
 2.   [Codex](https://profiles.wordpress.org/codex/)  [  11 years ago  ](https://developer.wordpress.org/reference/functions/login_header/#comment-1484)
 3. [You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Flogin_header%2F%23comment-1484)
    Vote results for this note: 0[You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Flogin_header%2F%23comment-1484)
 4. **Example from `wp-login.php`**
 5.     ```php
        $errors = new WP_Error();
        // ...
        login_header( __( 'Reset Password', 'textdomain' ), '<p class="message reset-pass">' . __( 'Enter your new password below.', 'textdomain' ) . '</p>', $errors );
        ```
    
 6.  [Log in to add feedback](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Flogin_header%2F%3Freplytocom%3D1484%23feedback-editor-1484)

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Flogin_header%2F)
before being able to contribute a note or feedback.