Как изменить разделитель в заголовке

21 сент. 2015 г., 11:41:28
Просмотры: 19.4K
Голосов: 9

Изменение разделителя в заголовке.

Я работаю со стартовой темой 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?]

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

возможный дубликат Изменение разделителя Meta Title и удаление на главной странице

mmm mmm
21 сент. 2015 г. 12:16:30
Все ответы на вопрос 2
6
20

ОБНОВЛЕНИЕ для WordPress 4.4

Начиная с WordPress 4.4 фильтр wp_title не работает, потому что функция wp_title() больше не используется в ядре. Эта функция была помечена как устаревшая, затем восстановлена до дальнейшего уведомления, но разработчикам тем не рекомендуется её использовать. Из-за этого фильтр wp_title всё ещё будет работать, если вы продолжите использовать функцию wp_title() напрямую в своей теме, но это не рекомендуется.

Появились новые фильтры для настройки заголовка документа, когда включена поддержка title-tag в теме:

  1. pre_get_document_title
  2. document_title_parts
  3. document_title_separator.

Если вам нужно настроить только разделитель, вы можете использовать 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 );
21 сент. 2015 г. 12:14:15
Комментарии

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

IXN IXN
21 сент. 2015 г. 13:19:26

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

cybmeta cybmeta
21 сент. 2015 г. 14:16:15

Ответ @IXN был обновлен для WordPress 4.4

cybmeta cybmeta
17 дек. 2015 г. 11:47:13

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

Pieter Goosen Pieter Goosen
17 дек. 2015 г. 12:13:14

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

cybmeta cybmeta
17 дек. 2015 г. 13:25:50

Ответ снова обновлён с более точной информацией. Спасибо, Pieter, за уточнение, что wp_title() была восстановлена.

cybmeta cybmeta
17 дек. 2015 г. 13:38:52
Показать остальные 1 комментариев
0

Способ генерации заголовка документа изменился, начиная с 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 );
16 июн. 2020 г. 17:26:54