有什么方法可以覆盖header.php中指定的<title>标记吗?

时间:2015-02-26 作者:hawbsl

首先,这既不是一个SEO问题,也不是一个关于在站点范围内更改标题标签的问题。如果你用谷歌搜索我的问题,这些就是你看到的所有答案。

所以我们有自己的主题,我们可以完全控制标题。php。我们知道如何设置标题。目前看起来是这样的:

<head>
    <title><?php wp_title(\' | \', true, \'right\'); bloginfo(\'name\'); ?></title>
etc...
不,问题是这个。对于大多数页面,我们希望标题如上所示。只是我们已经意识到,对于一个特定的自定义帖子类型(及其相关模板),CPT的标题不应该公开显示。仅供管理员使用。奇怪,但你来了。我们不会在模板的H1、内容等任何地方显示它。

但它在标题中有所体现。

理想情况下,我们需要一种覆盖标题的方法。php标题,仅为这组特定的页面指定一个替代标题。这可能吗?

4 个回复
最合适的回答,由SO网友:Shawn Wernig 整理而成

首先,让我们更改您的<title>

<title><?php wp_title(\' | \', true, \'right\'); ?></title>
因为在that was中添加标题字符串并不是未来的事情,相反,最好使用过滤器对标题进行任何修改。因此,让我们改为ad(在functions.php中):

add_filter(\'wp_title\', \'my_custom_title\');
function my_custom_title( $title )
{
    // Return my custom title
    return sprintf("%s %s", $title, get_bloginfo(\'name\'));
}
然后,让我们扩展这个方便的小标题过滤器来完成您想要做的事情:

add_filter(\'wp_title\', \'my_custom_title\');
function my_custom_title( $title )
{
    if( is_singular("your_post_type"))
    {
        return ""; // Return empty
    }
    // Return my custom title
    return sprintf("%s %s", $title, get_bloginfo(\'name\'));
}

SO网友:Przemek Maczewski

您可能想过滤掉标题。

add_filter( \'wp_title\', \'wpse179527_wp_title\' );
function wpse179527_wp_title( $title ) {
  global $post;
  if ( is_single() && \'custom-post\' == get_post_type( $post ) )
    return \'\';
  return $title;
}

SO网友:SnnSnn

我发布这个答案是为了回答另一个问题,但由于它是相关的,而且是最新的,我认为它可能对一些人有用。

自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。以下是可用于操纵标题标记的过滤器:

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

SO网友:Rami Alloush

结合不同的答案,这就是WordPress对我有效的地方v5.7.2 和我的自定义帖子类型company. 我可以很容易地覆盖自定义贴子页面上的标题,在最后添加我的网站名称

function custom_document_title( $title ) {
    if( is_singular("company"))
    {
        return sprintf("%s - %s", $title, get_bloginfo(\'name\'));
    }
    return $title; // Return default title elsewhere
}
add_filter( \'pre_get_document_title\', \'custom_document_title\', 99 );

结束