add_filter('wp_title') doesn't replace my title tag (WordPress plugin) add_filter('wp_title') doesn't replace my title tag (WordPress plugin) wordpress wordpress

add_filter('wp_title') doesn't replace my title tag (WordPress plugin)


If anyone else is having problems with this, it may be due to the Yoast plugin. Use:

add_filter( 'pre_get_document_title', function( $title ){    // Make any changes here    return $title;}, 999, 1 );


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