I have some templates where I need to customize the page title according to user selection. I have added a filter hook to ‘wp_title’ tag following Codex docs but when the filter is applied I’m receiving a warning, I’d say an error, regarding parameters in the callback function declaration:
Warning: Missing argument 4 for buildPageTitle() in /Applications/XAMPP/xamppfiles/htdocs/…/blog/wp-content/themes/…/inc/my_functions.php on line 2
my_functions.php
1 <?php
2 function buildPageTitle($sep, $echo, $seplocation, $brand) {
3 return $brand.$sep;
4 }
5 ...
Template
<?php
/*
Template Name: By brand-countries
*/
$brandLabel = get_query_var('brand');
require_once('inc/dbConn.php');
require_once('inc/get_brand_data.php');
require_once('inc/my_functions.php');
add_filter('wp_title', 'buildPageTitle', 10, 4);
apply_filters('wp_title', $sep, false, $seplocation, $brand);
get_header();
?>
I can solve the problem declaring $brand var as global in the buildPageTitle() function but I prefer to pass it as a parameter as in other templates different vars will be needed
I think you have a wrong idea how WordPress filters work. There is a function
wp_title()
and a filterwp_title
. You call the function, which does some work to create a title, and then passes its output to the filter, so other code can further customize the result.The function and the filter do not necessarily use the same arguments. For the function
wp_title()
you can pass the separator, whether to echo the title or not, and the separator location. The filter can get the title aswp_title()
has created it, the separator and the separator location. When setting up the filter hook (viaadd_filter()
) you specify how many arguments you need: 1 (the default), 2 or 3. You can’t get more than three arguments becausewp_title()
does not pass more than three arguments to thewp_title
filter.So you should not have to call
apply_filters()
yourself. You callwp_title()
(probably in yourheader.php
template file, and this function calls the filter itself.If you want to access your
brand
variable you should either put it in a global variable or let yourbuildPageTitle()
function call some other function that will return it. What strategy to use depends on your situation. Can you tell more about the different templates and the title formats you want to use there?