php 如何更改WordPress页面的标题?

093gszye  于 2023-03-22  发布在  PHP
关注(0)|答案(3)|浏览(205)

环境:WordPress 5.4.5和Yoast SEO 3.7.1
我是一个插件开发者,可以访问客户的网站。该网站安装了Yoast 3.7.1。这很重要吗?因为无论我做什么,我都不能更改404页面的title
现在在Stack Overflow的其他页面上,也有类似的问题(例如hereherehere),那些回答的人问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...

niwlg2el

niwlg2el1#

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);
icnyk63a

icnyk63a2#

自WordPress v4.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_separatordocument_title_parts钩子来处理标题和标题分隔符,这些钩子在函数中稍后执行,在使用single_term_titlepost_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 );
11dmarpk

11dmarpk3#

将其添加到您的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

相关问题