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?

link|improve this question

71% accept rate
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
feedback

3 Answers

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

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.

So...

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.

link|improve this answer
feedback

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

link|improve this answer
Links are helpfull of they solve the problem :) – Steven Apr 26 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 at 10:02
@toscho Good point! – Steven Apr 26 at 10:22
feedback

Your Answer

 
or
required, but never shown

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