wp_get_document_title()WP 4.4.0

Gets the title of the current page (document), which is typically output in the HTML tag <title>.

This is a replacement for the deprecated function wp_title().

Title format notes:

  • At the end of the title, — site name is added.
  • On the homepage, instead of the name, — site description is displayed. The homepage is defined as: is_home() && is_front_page().
  • For pagination pages, the page number will be added at the end: – Page 2.

This function will work in the <head> part of HTML automatically if the theme supports title-tag:

add_theme_support( 'title-tag' );

In this case, the following structure will be added to the <head>:

<title><?php echo wp_get_document_title(); ?></title>

In modern WP themes, there is generally no need to add the <title> tag in the <head>, it will be added automatically by the function _wp_render_title_tag(), which will run on the hook wp_head, which in turn is called by the function wp_head().

The operation of this function can be overridden via the hook pre_get_document_title:

$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
	return $title;
}

See example 3.

Useful filters:

1 time — 0.00042 sec (fast) | 50000 times — 15 sec (slow)

Returns

String. The title of the current page.

Usage

<title><?php echo wp_get_document_title(); ?></title>

Examples

0

#1 Demonstration of work

Let's say we are on the Contact page:

echo wp_get_document_title();
// outputs: Contacts - Site Name
0

#2 Page TITLE output

This is a replacement for template tag wp_title(). It is used in header.php to output header of any page.

This is a demo example, in WP this code is executed by function _wp_render_title_tag() which is hooked to wp_head hook. I.e. the code is executed in the HEAD part of HTML and to enable it, you need enable theme feature title-tag.

<head>
	<meta charset="<?php bloginfo( 'charset' ); ?>">
	<meta name="viewport" content="width=device-width" />

	<title><?php echo wp_get_document_title(); ?></title>

	<?php wp_head(); ?>
</head>
0

#3 Let's output header title using the filter

Let's say we want this function to not work at all and through it we want to display our custom header, for example "My Page", on the page with ID 20:

// The title "My Page" will be displayed on page 20
add_filter( 'pre_get_document_title', function(){
	global $post;

	if( $post->ID != 20 ){
		return ''; // do not change anything
	}

	return 'My Page';
} );
0

#4 Redefining the function

You can write your own function and completely replace the work of this function. You can do it with pre_get_document_title hook:

add_filter( 'pre_get_document_title', 'my_get_document_title' );

function my_get_document_title(){
	// Generate a dynamic header for each page.
	// You can take the code of this function as a basis and modify it to suit your needs.

	$title = 'This is a dynamically generated title';

	return $title;
}
0

#5 Change the separator between the header and the site name

By default, the function adds a ' - ' delimiter after the header site name. You can change the delimiter through a filter:

add_filter( 'document_title_separator', function(){
	return ' | ';
} );
0

#6 Remove the name of the site at the end of the header

To all titles on is_singular() pages, adds the site name, separated by a separator. This is not always good, let's fix it. To do this we use filter: document_title_parts:

// Remove the name of the site at the end of the header
add_filter( 'document_title_parts', function( $parts ){

	if( isset( $parts['site'] ) ){
		unset( $parts['site'] );
	}

	return $parts;
} );
0

#7 Remove site description from the home page title

On the main page displays "Site name - site description". To remove the description and display only the title, use this hook:

// remove the description from the header for the home page
add_filter( 'document_title_parts', function( $title ){

	if( isset( $title['tagline'] ) ){
		unset( $title['tagline'] );
	}

	return $title;
} );

Notes

  • Global. Int. $page Page number of a single post.
  • Global. Int. $paged Page number of a list of posts.

Changelog

Since 4.4.0 Introduced.

wp_get_document_title() code WP 6.9.1

function wp_get_document_title() {

	/**
	 * Filters the document title before it is generated.
	 *
	 * Passing a non-empty value will short-circuit wp_get_document_title(),
	 * returning that value instead.
	 *
	 * @since 4.4.0
	 *
	 * @param string $title The document title. Default empty string.
	 */
	$title = apply_filters( 'pre_get_document_title', '' );
	if ( ! empty( $title ) ) {
		return $title;
	}

	global $page, $paged;

	$title = array(
		'title' => '',
	);

	// If it's a 404 page, use a "Page not found" title.
	if ( is_404() ) {
		$title['title'] = __( 'Page not found' );

		// If it's a search, use a dynamic search results title.
	} elseif ( is_search() ) {
		/* translators: %s: Search query. */
		$title['title'] = sprintf( __( 'Search Results for &#8220;%s&#8221;' ), get_search_query() );

		// If on the front page, use the site title.
	} elseif ( is_front_page() ) {
		$title['title'] = get_bloginfo( 'name', 'display' );

		// If on a post type archive, use the post type archive title.
	} elseif ( is_post_type_archive() ) {
		$title['title'] = post_type_archive_title( '', false );

		// If on a taxonomy archive, use the term title.
	} elseif ( is_tax() ) {
		$title['title'] = single_term_title( '', false );

		/*
		* If we're on the blog page that is not the homepage
		* or a single post of any post type, use the post title.
		*/
	} elseif ( is_home() || is_singular() ) {
		$title['title'] = single_post_title( '', false );

		// If on a category or tag archive, use the term title.
	} elseif ( is_category() || is_tag() ) {
		$title['title'] = single_term_title( '', false );

		// If on an author archive, use the author's display name.
	} elseif ( is_author() && get_queried_object() ) {
		$author         = get_queried_object();
		$title['title'] = $author->display_name;

		// If it's a date archive, use the date as the title.
	} elseif ( is_year() ) {
		$title['title'] = get_the_date( _x( 'Y', 'yearly archives date format' ) );

	} elseif ( is_month() ) {
		$title['title'] = get_the_date( _x( 'F Y', 'monthly archives date format' ) );

	} elseif ( is_day() ) {
		$title['title'] = get_the_date();
	}

	// Add a page number if necessary.
	if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) {
		/* translators: %s: Page number. */
		$title['page'] = sprintf( __( 'Page %s' ), max( $paged, $page ) );
	}

	// Append the description or site title to give context.
	if ( is_front_page() ) {
		$title['tagline'] = get_bloginfo( 'description', 'display' );
	} else {
		$title['site'] = get_bloginfo( 'name', 'display' );
	}

	/**
	 * Filters the separator for the document title.
	 *
	 * @since 4.4.0
	 *
	 * @param string $sep Document title separator. Default '-'.
	 */
	$sep = apply_filters( 'document_title_separator', '-' );

	/**
	 * Filters the parts of the document title.
	 *
	 * @since 4.4.0
	 *
	 * @param array $title {
	 *     The document title parts.
	 *
	 *     @type string $title   Title of the viewed page.
	 *     @type string $page    Optional. Page number if paginated.
	 *     @type string $tagline Optional. Site description when on home page.
	 *     @type string $site    Optional. Site title when not on home page.
	 * }
	 */
	$title = apply_filters( 'document_title_parts', $title );

	$title = implode( " $sep ", array_filter( $title ) );

	/**
	 * Filters the document title.
	 *
	 * @since 5.8.0
	 *
	 * @param string $title Document title.
	 */
	$title = apply_filters( 'document_title', $title );

	return $title;
}