Как изменить заголовок на странице WordPress?

Контекст: WordPress 5.4.5, Yoast 3.7.1

Я разработчик плагинов, у меня есть доступ к сайту клиента. На сайте установлен Yoast 3.7.1, и мне интересно, имеет ли это значение, потому что независимо от того, что я делаю, я не могу изменить title страницы 404.

Теперь на других страницах StackOverflow, где были заданы аналогичные вопросы (здесь, здесь и здесь, например), те, кто отвечает, спросили, правильно ли встраивается header.php звонок wp_title(). Вот что в текущей теме header.php на тот момент:

    <title><?php wp_title( '|', true, 'right' ); ?></title> 

Интересно, что на моей странице 404.php wp_get_document_title() говорит мне, что заголовок документа — Page not found - XXXX, хотя вызов wp_title выше указывает разделитель как |. Переписывание заголовков Yoast отключено, поэтому я совсем не уверен, откуда взялась эта черточка.

Мой плагин выполняет вызов REST и извлекает контент извне для включения на страницу. Частью этого контента является текст, который будет использоваться в файле title.

На предыдущих клиентских сайтах я смог сделать следующее:

add_filter('wp_title', 'change_404_title');
function change_404_title($title) {
    if (is_404()) 
    {
        global $plugin_title;
        if (!empty($plugin_title)) 
        {
             $title = $plugin_title;
        }
    }
    return $title;
}

Однако на этом сайте это не работает.

Я попытался, основываясь на используемой версии WordPress, подключить фильтр pre_get_document_title, а именно

add_filter('pre_get_document_title', 'change_404_title');

но опять безрезультатно. Я сейчас читаю Yoast...


person bugmagnet    schedule 04.11.2016    source источник
comment
Вы уверены в этой переменной global $plugin_title;?   -  person Khorshed Alam    schedule 04.11.2016
comment
Полностью. Он называется как-то по-другому, но он определенно там.   -  person bugmagnet    schedule 04.11.2016


Ответы (3)


wp_title устарело, начиная с версии 4.4. Поэтому мы должны использовать новый фильтр pre_get_document_title. Ваш код выглядит нормально, но я не понимаю global $plugin_title. Я бы предпочел попросить вас сначала попробовать это

add_filter('pre_get_document_title', 'change_404_title');
function change_404_title($title) {
    if (is_404()) {
        return 'My Custom Title';
    }
    return $title;
}

Если это не сработает, попробуйте изменить приоритет для выполнения вашей функции в последнее время.

add_filter('pre_get_document_title', 'change_404_title', 50);
person Khorshed Alam    schedule 04.11.2016
comment
Мне нравится внешний вид второго предложения. Приоритетом может быть исправление. - person bugmagnet; 04.11.2016
comment
Да, приоритет - это исправление. Спасибо. Очки и похвала @KhorshedAlam - person bugmagnet; 04.11.2016

Способ создания заголовка документа изменился по сравнению с Wordpress версии 4.4.0. Теперь wp_get_document_title определяет, как генерируется заголовок:

/**
 * Displays title tag with content.
 *
 * @ignore
 * @since 4.1.0
 * @since 4.4.0 Improved title output replaced `wp_title()`.
 * @access private
 */
function _wp_render_title_tag() {
    if ( ! current_theme_supports( 'title-tag' ) ) {
        return;
    }

    echo '<title>' . wp_get_document_title() . '</title>' . "\n";
}

Вот код из v5.4.2. Вот фильтры, которые вы можете использовать для управления тегом title:

function wp_get_document_title() {
    /**
    * Filters the document title before it is generated.
    *
    * Passing a non-empty value will short-circuit wp_get_document_title(),
    * returning that value instead.
    *
    * @since 4.4.0
    *
    * @param string $title The document title. Default empty string.
    */
    $title = apply_filters( 'pre_get_document_title', '' );
    if ( ! empty( $title ) ) {
        return $title;
    }
    // --- snipped ---
    /**
    * Filters the separator for the document title.
    *
    * @since 4.4.0
    *
    * @param string $sep Document title separator. Default '-'.
    */
    $sep = apply_filters( 'document_title_separator', '-' );

    /**
    * Filters the parts of the document title.
    *
    * @since 4.4.0
    *
    * @param array $title {
    *     The document title parts.
    *
    *     @type string $title   Title of the viewed page.
    *     @type string $page    Optional. Page number if paginated.
    *     @type string $tagline Optional. Site description when on home page.
    *     @type string $site    Optional. Site title when not on home page.
    * }
    */
    $title = apply_filters( 'document_title_parts', $title );
    // --- snipped ---
    return $title;
}

Итак, вот два способа сделать это.

Первый использует фильтр pre_get_document_title, который сокращает генерацию заголовка и, следовательно, более эффективен, если вы не собираетесь вносить изменения в текущий заголовок:

function custom_document_title( $title ) {
    return 'Here is the new title';
}
add_filter( 'pre_get_document_title', 'custom_document_title', 10 );

Второй способ использует хуки document_title_separator и document_title_parts для заголовка и разделителя заголовков, которые выполняются позже в функции, после того, как заголовок сгенерирован с использованием таких функций, как single_term_title или post_type_archive_title в зависимости от страницы, и непосредственно перед выводом тегов заголовка:

// Custom function should return a string
function custom_seperator( $sep ) {
   return '>';
}
add_filter( 'document_title_separator', 'custom_seperator', 10 );

// Custom function should return an array
function custom_html_title( $title ) {
   return array(
     'title' => 'Custom Title',
     'site'  => 'Custom Site'
    );
}
add_filter( 'document_title_parts', 'custom_html_title', 10 );
person snnsnn    schedule 16.06.2020

Добавьте это в свой functions.php

function custom_wp_title($title) {

    if ( is_404() ) {
        $title = 'Custom 404 Title';
    }
    return $title;
}
add_filter( 'wp_title', 'custom_wp_title', 10, 2 );

10 - изменение приоритета для перезаписи других плагинов, таких как SEO

person tokas    schedule 04.11.2016
comment
wp_title() изначально должен был быть объявлен устаревшим в версии 4.4, но был восстановлен. - person tokas; 04.11.2016