wp_get_document_title()WP 4.4.0

Returns document title for the current page.

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

Return

String. Tag with the document title.

Usage

wp_get_document_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.

Code of wp_get_document_title() WP 5.9.3

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