Не удается изменить wp_title с помощью add_filter
У меня есть пользовательская страница, где я пытаюсь изменить заголовок страницы.
Функция выполняется, но заголовок не меняется. Вот код, который я использую:
add_filter('wp_title', set_page_title($brand));
function set_page_title($brand) {
$title = 'Дизайнер '.$brand['name'].' - '.get_bloginfo('name');
//Здесь я могу вывести результат и видеть, что функция действительно срабатывает
return $title;
}
Почему это не работает? Я неправильно использую add_filter?

Фильтр wp_title
устарел, начиная с WordPress 4.4 (см. здесь). Вместо него можно использовать document_title_parts.
function custom_title($title_parts) {
$title_parts['title'] = "Заголовок страницы";
return $title_parts;
}
add_filter( 'document_title_parts', 'custom_title' );
В фильтре custom_title
, $title_parts
содержит ключи 'title', 'page' (нумерация страниц, если есть), 'tagline' (слоган, указанный вами, только на главной странице) и 'site'. Установите "title" так, как вам нужно. WordPress сохранит ваш настроенный формат, чтобы затем объединить все вместе.
Если вы хотите переопределить форматирование заголовка WordPress, используйте pre_get_document_title и передайте в этот фильтр функцию, которая принимает строку и возвращает нужный вам заголовок.
function custom_title($title) {
return "Заголовок страницы";
}
add_filter( 'pre_get_document_title', 'custom_title' );

Функция wp_title
была восстановлена. Перейдя по вашей ссылке выше, вы найдёте комментарий: ОБНОВЛЕНИЕ 12 ноября [2017] – wp_title был восстановлен до тех пор, пока не будут определены альтернативные варианты использования и пути их реализации.

По состоянию на июль 2020 года document_title_parts
работал у меня, тогда как wp_title
— нет.

Вы не можете передавать массив в set_page_title, так как функция обратного вызова фильтров принимает только оригинальный заголовок в качестве входного параметра.
Если вы хотите, чтобы ваша функция работала таким образом, определите массив $brand вне функции и сделайте его глобальным
add_filter( 'wp_title', 'set_page_title' );
$brand = array( 'name' => 'Название бренда' );
function set_page_title( $orig_title ) {
global $brand;
$title = 'Дизайнер '.$brand['name'].' - '.get_bloginfo( 'name' );
//Здесь я могу вывести результат и убедиться, что функция действительно срабатывает
return $title;
}

Когда я делаю так, функция вообще не вызывается. Я также пробовал add_filter('wp_title', 'set_page_title');
Единственный способ вызвать функцию - это сделать так: add_filter('wp_title', set_page_title('test'));
. Есть ли причина, по которой я не могу вызвать функцию вашим способом?

Кажется, я понимаю почему. Может быть потому, что я пытаюсь использовать add_filter
внутри custom_template.php
, а не в моем function.php
?

В обоих примерах кода происходит следующее: add_filter не вызывает функцию для получения возвращаемого значения в качестве нового заголовка. Функция add_filter ожидает как минимум два параметра: первый — это строка, содержащая 'тег' или название фильтра, который вы хотите использовать, а второй — смешанный тип. В случае использования определенной функции следует передавать её имя в виде строки. Также можно передать массив для callback-функции в пространстве имен или анонимную функцию.
В случае:
add_filter('wp_title', set_page_title('test'));
Сначала будет выполнена внутренняя функция, и её результат передастся во внешнюю функцию.
Таким образом...
add_filter('wp_title', set_page_title(other_function(function() {return "real_filter";})));
...строка 'real_filter' будет передана в add_filter при условии, что все промежуточные функции передают свои входные параметры как возвращаемые значения.
Я предполагаю, что вам нужно что-то вроде:
function my_title_filter($old_title, $sep, $seplocation) {
// Добавьте код для определения, нужно ли изменять заголовок и на что.
global $brand;
$title = "Designer " . $brand['name'] . " $sep " . get_bloginfo('name');
return $title;
}
add_filter('wp_title', 'my_title_filter', 10, 3); // 10 — это приоритет,
// а 3 — количество аргументов, которые принимает функция.
// wp_title может передавать 3 аргумента.
Дополнительное замечание... Фильтр должен быть инициализирован до вызова apply_filters. Лучшей практикой является определение функции до вызова add_filter.
