使用Wordpress插件覆盖标题标记

时间:2017-08-04 10:46:46

标签: php wordpress

我正在尝试使用Wordpress插件覆盖页面的<title>标记。 我不想改变主题的代码。我只想强迫主题通过插件更改一些页面标题。

主题使用add_theme_support( 'title-tag' )。请注意,现在不推荐使用wp_title。

2 个答案:

答案 0 :(得分:3)

您的问题是,如果主题已支持title-tag,则您无法在主题中使用wp_title()。您主题的<head>应如下所示:

<head>
    <meta charset="<?php bloginfo( 'charset' ); ?>">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <?php wp_head(); ?>
</head>

过滤器和title-tag支持:

add_action( 'after_setup_theme', 'my_theme_functions' );
function my_theme_functions() {
    add_theme_support( 'title-tag' );
}

add_filter( 'wp_title', 'custom_titles', 10, 2 );
function custom_titles( $title, $sep ) {

    //set custom title here
    $title = "Some other title" . $title;;
    return $title;
}

如果你这样做,它将完美地运作。

答案 1 :(得分:0)

我将此答案发布到另一个问题上,但是由于它是相关的并且是最新的,尽管它对某些人可能有用。

自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_separator或{{1}之类的函数生成标题之后,使用document_title_partssingle_term_title钩子为标题和标题分隔符添加钩子,稍后在函数中执行},具体取决于页面和即将输出的内容:

post_type_archive_title