6

Every WordPress page can be described as having two titles:

  1. The page/post title, which is displayed within the page/post via the the_title() function call

  2. The html <title></title> tag that displays the title on top of the browser

I am writing a plugin which at one point should change the title of a page dynamically (well, it should change both titles described above).

So, for step 1 above, I found multiple solutions on Stack Overflow (such as this or this). Those are great for only step 1 above.

For step 2, I found this solution; in a nutshell, this is how it works:

add_filter('wp_title', 'change_page_title');
function change_page_title ($title) {

    // Do some magic, and eventually modify $title then return it
    return $title;
}

But the suggested solution is not working for me; and by not working I mean that the filter is not calling the associated function. I am not sure what the problem is; is it because this filter is being called from within the plugin not the theme? (Just FYI, I do not have access to the theme files, so it has to be done from within the plugin).

How can I accomplish this? How can I change the browser title of a page dynamically from within a plugin?

Thanks.

2 Answers 2

9

A post or page has only one title, the title tag <title> is the document title.

The filter wp_title filters the output of wp_title() function, which was used before to output the title of the document. In WordPress 4.1, the title-tag support in themes was introduced and wp_get_document_title() is used instead of wp_title(). So, if your theme supports title-tag, wp_title filter has not effect, but you can use a other filters:

pre_get_document_title to set a new title

add_filter( 'pre_get_document_title', 'cyb_change_page_title' );
function cyb_change_page_title () {

    return "Custom title";

}

document_title_separator to filter the title separator

add_filter('document_title_separator', 'cyb_change_document_title_separator');
function cyb_change_document_title_separator ( $sep ) {

    return "|";

}

documente_title_parts to filter different parts of the title: title, page number, tagline and site name.

add_filter( 'document_title_parts', 'cyb_change_document_title_parts' );
function cyb_change_document_title_parts ( $title_parts ) {

    $title_parts['title'] = 'Custom title';
    $title_parts['page'] = 54;
    $title_parts['tagline'] = "Custom tagline";
    $title_parts['site'] = "My Site"; // When not on home page

    return $title_parts;

}

PD: You can use current_theme_supports( 'title-tag' ) to check if theme supports title-tag or not.

2
  • but how to pass a pages unique meta data into the filter functions on a page-by-page basis? Dec 22, 2018 at 20:40
  • You can use functions like is_page(), is_single(), is_singular() and so on, to check the current page or post.
    – cybmeta
    Dec 24, 2018 at 8:29
1

Using this code on you page.php or page which you want to change <pre> <title><?php wp_title(); ?> | <?php bloginfo(‘name’); ?></title> </pre>

2
  • You mean in the theme? I do not have access to the theme files.
    – Greeso
    Dec 24, 2016 at 6:24
  • worked. thank you so much Jan 11, 2020 at 0:00

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.