WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have a custom page where I try to change the page title.
The function executes, but the title is not changed. This is the code I'm using:

  add_filter('wp_title', set_page_title($brand));

  function set_page_title($brand) { 
    $title = 'Designer '.$brand['name'].' - '.get_bloginfo('name');
    //Here I can echo the result and see that it's actually triggered
    return $title;  

So why is this not working? Am I using add_filter wrong?

share|improve this question
If you only want to change the title for a specific template I believe it would be more suitable to call your custom title function in place of wp_title in the template markup. – Steve Buzonas Dec 27 '11 at 19:51

You cannot pass an array to set_page_title, the filters callback accept only the original title as input parameter.

If you want your function work this way, define the $brand array outside the function and make it global

  add_filter( 'wp_title', 'set_page_title' );
  $brand = array( 'name' => 'Brand Name' );

  function set_page_title( $orig_title ) { 
    global $brand;
    $title = 'Designer '.$brand['name'].' - '.get_bloginfo( 'name' );
    //Here I can echo the result and see that it's actually triggered
    return $title;  
share|improve this answer
When I do this, the function is not called at all. I also tried add_filter('wp_title', 'set_page_title'); The only way to call the function is by doing this: add_filter('wp_title', set_page_title('test'));. Any reason why I'm not able to call the function your way? – Steven Feb 13 '11 at 13:01
I think I know why. Could it be that I'm trying to use add_filter inside custom_template.php and not in my function.php ? – Steven Feb 13 '11 at 15:39
You must place this function in your function.php file that is in your theme directory! – keatch Feb 13 '11 at 16:22

wp_title filter is deprecated since WordPress 4.4 (see here). You can use document_title_parts instead

function custom_title($title_parts) {
    $title_parts['title'] = "Page Title";
    return $title_parts;
add_filter( 'document_title_parts', 'custom_title' );

In custom_title filter, $title_parts contains keys 'title', 'page' (the pagination, if any), 'tagline' (the slogan you specified, only on homepage) and 'site'. Set "title" the way you like. WordPress will keep your configured format to then concatenate everything together.

If you want to override WordPress title formating, then use pre_get_document_title and provide to that filter a function that takes a string and returns the title you want.

function custom_title($title) {
    return "Page Title";
add_filter( 'pre_get_document_title', 'custom_title' );
share|improve this answer

What is happening in both examples of code is that add_filter is not calling a function to accept a return as the new title. The function add_filter expects at least two parameters, the first being a string that contains the 'tag' or name of the filter you would like to use, and the second is mixed. In the case of using a defined function you should use the function name as a string, it can also accept an array for a callback within a namespace, and an anonymous function.

In the case of:

add_filter('wp_title', set_page_title('test'));

The inner most function will be evaluated first, passing its return results to the next outer function.


add_filter('wp_title', set_page_title(other_function(function() {return "real_filter";})));

Would pass the string 'real_filter' to add_filter assuming that all functions between the two pass their input parameters as their return value.

I believe what you would want would be something along the lines of:

function my_title_filter($old_title, $sep, $seplocation) {
    // Add some code to determine if/what you want to change your title to.

    global $brand;

    $title = "Designer " . $brand['name'] . " $sep " . get_bloginfo('name');

    return $title;

add_filter('wp_title', 'my_title_filter', 10, 3); // 10 is the priority,
    // and 3 is the number of arguments the function accepts.
    // wp_title can pass 3.

An additional caveat... The filter must be initialized before apply_filters is called. And best practice is to have your function defined prior to calling add_filter.

share|improve this answer

Steve hit it on the nose. This article has a complete example if you're trying to do this for a WP theme.

share|improve this answer
An answer should be more than just a link to an external site. Please add a solution. – toscho Apr 26 '12 at 4:46
Links are helpfull of they solve the problem :) – Steven Apr 26 '12 at 7:18
@Steven If the linked page vanishes, the answer loses all value. That's why we delete such answers rather than collecting dead links … – toscho Apr 26 '12 at 10:02
@toscho Good point! – Steven Apr 26 '12 at 10:22
The link is dead now. – Shoaib Iqbal May 6 at 14:34

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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