Динамическое изменение заголовка страницы из плагина
Каждая страница WordPress может иметь два заголовка:
Заголовок страницы/записи, который отображается на странице/в записи через вызов функции
the_title()
HTML тег
<title></title>
, который отображает заголовок в верхней части браузера
Я разрабатываю плагин, который в определенный момент должен динамически изменять заголовок страницы (точнее, оба заголовка, описанных выше).
Для шага 1, я нашел несколько решений на Stack Overflow (таких как это или это). Они отлично подходят только для шага 1.
Для шага 2, я нашел это решение; если кратко, оно работает так:
add_filter('wp_title', 'change_page_title');
function change_page_title ($title) {
// Выполняем некоторую магию, изменяем $title и возвращаем его
return $title;
}
Но предложенное решение у меня не работает; под "не работает" я имею в виду, что фильтр не вызывает связанную функцию. Я не уверен, в чем проблема; может быть, это потому, что фильтр вызывается из плагина, а не из темы? (К сведению, у меня нет доступа к файлам темы, поэтому это должно быть сделано из плагина).
Как я могу это реализовать? Как изменить заголовок браузера страницы динамически из плагина?
Спасибо.

У записи или страницы может быть только один заголовок, тег <title>
является заголовком документа.
Фильтр wp_title
изменяет вывод функции wp_title()
, которая раньше использовалась для вывода заголовка документа. В WordPress 4.1 была добавлена поддержка тега заголовка в темах, и вместо wp_title()
теперь используется wp_get_document_title()
. Таким образом, если ваша тема поддерживает title-tag
, фильтр wp_title
не действует, но вы можете использовать другие фильтры:
pre_get_document_title
для установки нового заголовка
add_filter( 'pre_get_document_title', 'cyb_change_page_title' );
function cyb_change_page_title () {
return "Пользовательский заголовок";
}
document_title_separator
для изменения разделителя заголовка
add_filter('document_title_separator', 'cyb_change_document_title_separator');
function cyb_change_document_title_separator ( $sep ) {
return "|";
}
documente_title_parts
для изменения различных частей заголовка: самого заголовка, номера страницы, слогана и названия сайта.
add_filter( 'document_title_parts', 'cyb_change_document_title_parts' );
function cyb_change_document_title_parts ( $title_parts ) {
$title_parts['title'] = 'Пользовательский заголовок';
$title_parts['page'] = 54;
$title_parts['tagline'] = "Пользовательский слоган";
$title_parts['site'] = "Мой сайт"; // Когда не на главной странице
return $title_parts;
}
Примечание: Вы можете использовать current_theme_supports( 'title-tag' )
, чтобы проверить, поддерживает ли тема title-tag
или нет.

но как передавать уникальные метаданные страницы в функции фильтров для каждой отдельной страницы?

Вы можете использовать функции типа is_page()
, is_single()
, is_singular()
и так далее, чтобы проверять текущую страницу или запись.
