add_filter('wp_title') doesn't replace my title tag (WordPress plugin)
I can't tell from the code you have provided, but are you using:
<title><?php wp_title(); ?></title>
in your <head>
, under header.php?
UPDATE
Apparently a change was made to the way titles are handled as of 4.4. Here is a link that explains how to use the new code:
https://www.developersq.com/change-page-post-title-wordpress-4-4/
/* * Override default post/page title - example * @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. * } * @since WordPress 4.4 * @website: www.developersq.com * @author: Aakash Dodiya*/add_filter('document_title_parts', 'dq_override_post_title', 10);function dq_override_post_title($title){ // change title for singular blog post if( is_singular( 'post' ) ){ // change title parts here $title['title'] = 'EXAMPLE'; $title['page'] = '2'; // optional $title['tagline'] = 'Home Of Genesis Themes'; // optional $title['site'] = 'DevelopersQ'; //optional } return $title; }
I posted this answer to another question but since it is relevant and more up-to-date, I though it might be useful.
How document title is generated has changed since Wordpress v4.4.0. Now wp_get_document_title
dictates how title is generated:
/** * Displays title tag with content. * * @ignore * @since 4.1.0 * @since 4.4.0 Improved title output replaced `wp_title()`. * @access private */function _wp_render_title_tag() { if ( ! current_theme_supports( 'title-tag' ) ) { return; } echo '<title>' . wp_get_document_title() . '</title>' . "\n";}
Here is the code from v5.4.2. Here are the filters you can use to manipulate title tag:
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; } // --- snipped --- /** * 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 ); // --- snipped --- return $title;}
So here are two ways you can do it.
First one uses pre_get_document_title
filter which short-circuits the title generation and hence more performant if you are not going make changes on current title:
function custom_document_title( $title ) { return 'Here is the new title';}add_filter( 'pre_get_document_title', 'custom_document_title', 10 );
Second way uses document_title_separator
and document_title_parts
hooks for the title and the title seperator that are executed later in the function, after title is generated using functions like single_term_title
or post_type_archive_title
depending on the page and about to be outputted:
// Custom function should return a stringfunction custom_seperator( $sep ) { return '>';}add_filter( 'document_title_separator', 'custom_seperator', 10 );// Custom function should return an arrayfunction custom_html_title( $title ) { return array( 'title' => 'Custom Title', 'site' => 'Custom Site' );}add_filter( 'document_title_parts', 'custom_html_title', 10 );