Как изменить разделитель в заголовке
Изменение разделителя в заголовке.
Я работаю со стартовой темой Underscores. Хочу внести небольшие изменения в заголовок: заменить разделитель с "Название записи | Название сайта" на "Название записи - Название сайта".
Простой способ сделать это - добавить:
<title><?php wp_title('-', true, 'right' ); ?><?php bloginfo( 'name' ); ?></title>
в header.php. Но теперь я узнал, что с введением add_theme_support( 'title-tag' );
не рекомендуется использовать тег <title>
в шапке.
Есть ли простой способ изменить разделитель в заголовке?
Чем этот вопрос отличается от других похожих:
Это вопрос о лучших практиках после введения add_theme_support( 'title-tag' );
и о том, как его правильно использовать и модифицировать, так как теперь не следует использовать тег <title>
в header.php.
[Очень надеюсь, что не придется писать 8 строк кода для такого небольшого изменения.
Если я решу использовать тег <title>
как более простое решение, нужно ли мне закомментировать/удалить add_theme_support( 'title-tag' );
из functions.php?]

ОБНОВЛЕНИЕ для WordPress 4.4
Начиная с WordPress 4.4 фильтр wp_title
не работает, потому что функция wp_title()
больше не используется в ядре. Эта функция была помечена как устаревшая, затем восстановлена до дальнейшего уведомления, но разработчикам тем не рекомендуется её использовать. Из-за этого фильтр wp_title
всё ещё будет работать, если вы продолжите использовать функцию wp_title()
напрямую в своей теме, но это не рекомендуется.
Появились новые фильтры для настройки заголовка документа, когда включена поддержка title-tag
в теме:
Если вам нужно настроить только разделитель, вы можете использовать document_title_separator
следующим образом:
add_filter( 'document_title_separator', 'cyb_document_title_separator' );
function cyb_document_title_separator( $sep ) {
$sep = "-";
return $sep;
}
Предыдущий ответ
Вы можете использовать фильтр wp_title
для настройки тега <title>
.
add_filter( 'wp_title', 'customize_title_tag', 10, 3 );
function customize_title_tag( $title, $sep, $seplocation ) {
// Настройка $title здесь.
// Пример взят из https://generatepress.com/forums/topic/title-tag-separator/
$title = str_replace( '|', '-', $title );
return $title;
}
Более сложный пример использования этого фильтра (взято из темы TwentyTwelve):
function twentytwelve_wp_title( $title, $sep ) {
global $paged, $page;
if ( is_feed() )
return $title;
// Добавляем название сайта.
$title .= get_bloginfo( 'name' );
// Добавляем описание сайта для главной страницы.
$site_description = get_bloginfo( 'description', 'display' );
if ( $site_description && ( is_home() || is_front_page() ) )
$title = "$title $sep $site_description";
// Добавляем номер страницы, если необходимо.
if ( $paged >= 2 || $page >= 2 )
$title = "$title $sep " . sprintf( __( 'Страница %s', 'twentytwelve' ), max( $paged, $page ) );
return $title;
}
add_filter( 'wp_title', 'twentytwelve_wp_title', 10, 2 );

Спасибо. Я проверил. Проблема в том, что TwentyTwelve не использует add_theme_support( 'title-tag' );
, что, кстати, теперь является обязательной лучшей практикой. Вместо этого он использует собственную функцию и <title></title?>
в header.php (что больше не разрешено). И эта конкретная функция, я полагаю, не изменяет разделитель.

Это был просто пример того, как можно использовать фильтр wp_title
для настройки вывода тега title. Неважно, поддерживает ли тема title-tag или использует функцию wp_title()
, фильтр работает в обоих случаях.

wp_title()
не устарела, функция была восстановлена до дальнейшего уведомления. Да, её больше не рекомендуется использовать, но она не устарела

О, да, её восстановили, я не знал. Но в любом случае, фильтр wp_title
не работает, если вы не используете функцию wp_title()
напрямую.

Способ генерации заголовка документа изменился, начиная с WordPress версии 4.4.0. Теперь wp_get_document_title
определяет, как формируется заголовок:
/**
* Отображает тег title с содержимым.
*
* @ignore
* @since 4.1.0
* @since 4.4.0 Улучшен вывод заголовка, заменена функция `wp_title()`.
* @access private
*/
function _wp_render_title_tag() {
if ( ! current_theme_supports( 'title-tag' ) ) {
return;
}
echo '<title>' . wp_get_document_title() . '</title>' . "\n";
}
Вот код из версии 5.4.2. Доступные фильтры для изменения тега title:
function wp_get_document_title() {
/**
* Фильтр заголовка документа перед его генерацией.
*
* Передача непустого значения прервет выполнение wp_get_document_title(),
* вернув это значение вместо стандартного.
*
* @since 4.4.0
*
* @param string $title Заголовок документа. По умолчанию пустая строка.
*/
$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
return $title;
}
// --- пропущено ---
/**
* Фильтр разделителя для заголовка документа.
*
* @since 4.4.0
*
* @param string $sep Разделитель заголовка документа. По умолчанию '-'.
*/
$sep = apply_filters( 'document_title_separator', '-' );
/**
* Фильтр частей заголовка документа.
*
* @since 4.4.0
*
* @param array $title {
* Части заголовка документа.
*
* @type string $title Заголовок просматриваемой страницы.
* @type string $page Опционально. Номер страницы, если есть пагинация.
* @type string $tagline Опционально. Описание сайта на главной странице.
* @type string $site Опционально. Название сайта на других страницах.
* }
*/
$title = apply_filters( 'document_title_parts', $title );
// --- пропущено ---
return $title;
}
Существует два способа изменения заголовка.
Первый использует фильтр pre_get_document_title
, который прерывает генерацию заголовка и более производителен, если вам не нужно изменять текущий заголовок:
function custom_document_title( $title ) {
return 'Новый заголовок';
}
add_filter( 'pre_get_document_title', 'custom_document_title', 10 );
Второй способ использует хуки document_title_separator
и document_title_parts
для заголовка и разделителя, которые выполняются позже в функции, после генерации заголовка с помощью функций типа single_term_title
или post_type_archive_title
в зависимости от страницы и перед выводом:
// Пользовательская функция должна возвращать строку
function custom_seperator( $sep ) {
return '>';
}
add_filter( 'document_title_separator', 'custom_seperator', 10 );
// Пользовательская функция должна возвращать массив
function custom_html_title( $title ) {
return array(
'title' => 'Пользовательский заголовок',
'site' => 'Пользовательский сайт'
);
}
add_filter( 'document_title_parts', 'custom_html_title', 10 );
