Не удается изменить wp_title с помощью add_filter

12 февр. 2011 г., 13:31:59
Просмотры: 22.8K
Голосов: 10

У меня есть пользовательская страница, где я пытаюсь изменить заголовок страницы.
Функция выполняется, но заголовок не меняется. Вот код, который я использую:

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

  function set_page_title($brand) { 
    $title = 'Дизайнер '.$brand['name'].' - '.get_bloginfo('name');
    //Здесь я могу вывести результат и видеть, что функция действительно срабатывает
    return $title;  
  } 

Почему это не работает? Я неправильно использую add_filter?

1
Комментарии

Если вы хотите изменить заголовок только для определенного шаблона, я считаю, что будет более подходящим вызвать вашу пользовательскую функцию заголовка вместо wp_title в разметке шаблона.

Steve Buzonas Steve Buzonas
27 дек. 2011 г. 21:51:50
Все ответы на вопрос 3
3
20

Фильтр 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' );
28 мая 2016 г. 07:09:03
Комментарии

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

amurrell amurrell
27 окт. 2018 г. 02:20:49

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

GreatBlakes GreatBlakes
9 июл. 2020 г. 17:16:55

@GreatBlakes У меня ситуация всё ещё актуальна. По состоянию на март 2022 года document_title_parts работал у меня, тогда как wp_title — нет.

Clarus Dignus Clarus Dignus
25 мар. 2022 г. 02:08:56
3

Вы не можете передавать массив в 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;  
  }
12 февр. 2011 г. 15:16:19
Комментарии

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

Steven Steven
13 февр. 2011 г. 15:01:38

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

Steven Steven
13 февр. 2011 г. 17:39:41

Вы должны разместить эту функцию в вашем файле function.php, который находится в директории вашей темы!

keatch keatch
13 февр. 2011 г. 18:22:29
0

В обоих примерах кода происходит следующее: 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.

27 дек. 2011 г. 21:49:28