标题标签和文档标题部件的问题

时间:2016-05-12 作者:hookedonwinter

Wordpress version 4.5.1

我正在尝试动态更新特定模板上的页面标题。经过大量的挖掘和学习wp_title() 更改,我正在尝试使用document_title_parts. 但是,我根本无法运行过滤器。

我是以儿童为主题的,functions.php:

add_theme_support( \'title-tag\' );
//add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });

add_filter( \'document_title_parts\', function( $title )
{
    error_log(\'here\');
    return $title;

}, 10, 1 );
我尝试了如上所示添加主题支持的两种变体,但查看我的日志,页面重新加载时没有显示任何内容。那个error_log 正在使用其他功能(例如wp_title), 因此,错误日志记录工作正常。

我也试过了pre_get_document_title, 这会在页面加载时触发,尽管我无法让它实际更改标题。

所以我可能是使用了错误的过滤器,没有正确设置主题,或者是其他一些我不知道的事情。任何帮助都将不胜感激!

编辑以添加更多详细信息

正在尝试初始化函数,但也不起作用:https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

而且,虽然我删除了对<title> 从…起header.php, 实际的站点标题仍显示在源代码中。

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

我在我的开发区运行了你的过滤器。它不起作用。然后我关闭了Yoast SEO插件,我知道它也会影响页面标题。然后它成功了。所以我的建议是,另一个插件正在搞乱它。

在Yoast的情况下,这是对pre_get_document_title 返回非空。那样的话wp_get_document_title 短路,其余功能,包括documents_title_parts 过滤器,则不会进行计算,正如您从第一行代码中看到的:

$title = apply_filters( \'pre_get_document_title\', \'\' );
if ( ! empty( $title ) ) {
    return $title;
    }
我把你的过滤器换成了pre_get_document_title. 它不起作用。然后,我将优先级更改为比Yoast中的同一过滤器更高的级别。然后它成功了。因此,我不知道您的设置,但我建议您尝试一下:

add_filter( \'pre_get_document_title\', function( $title )
  {
    error_log(\'here\');
    return $title;
  }, 999, 1 );

SO网友:tillinberlin

经过一些实验,我得出了以下建议:是否<title> 标记在父主题中“硬编码”header.php? 如果是这种情况,您可以尝试删除<title> 来自子主题的标记header.php (复制您父母的header.php ,然后通过functions.php:

add_theme_support( \'title-tag\' );
我将试着解释是什么导致我提出这个建议:我按照你和其他人的建议做了尝试,但结果发现two <title> tags 在源代码中。第一个标题是标准标题,第二个标题是修改后的标题。但是(当然)在浏览器标题栏中,我只能看到默认标题。

然后我检查了header.php 我使用的父主题(214)和<title> 标签确实是在模板中硬编码的,如下所示:

<title><?php wp_title( \'|\', true, \'right\' ); ?></title>
删除后,我将以下代码添加到子主题的functions.php 它成功了:

/**
 * Theme support added
 */

function add_theme_support_child() {

    add_theme_support( \'title-tag\' );

}

add_action( \'after_setup_theme\', \'add_theme_support_child\', 11 );


/**
 * Change the title of a page
 * 
 */

function change_title_for_a_template( $title ) {

// Check if current page template is \'template-homepage.php\'
// if ( is_page_template( \'template-homepage.php\' ) ) {

    // change title parts here
    $title[\'title\'] = \'My Title\'; 
    $title[\'tagline\'] = \'My fancy tagline\'; // optional
    $title[\'site\'] = \'example.org\'; //optional

// }

return $title; 

}

add_filter( \'document_title_parts\', \'change_title_for_a_template\', 10, 1 );
因此,在移除<title> 模板中的标记–只有two <title> 后者被忽略的标记。你的主题也会有同样的问题吗?

Since wp 4.4.0 however the <title> tag is created dynamically 按功能_wp_render_title_tag() 基本上调用另一个函数wp_get_document_title() 并围绕结果包装html标记。长话短说:如果你的主题header.php 缺少<title> tag,您可以直接通过pre_get_document_titledocument_title_parts 如上所述here:

1) 直接更改标题:

add_filter(\'pre_get_document_title\', \'change_the_title\');
function change_the_title() {
    return \'The expected title\';
}
2)过滤标题部分:

add_filter(\'document_title_parts\', \'filter_title_part\');
function filter_title_part($title) {
    return array(\'a\', \'b\', \'c\');
}

SO网友:Pieter Goosen

从上到下、从下到上阅读了您的文章后,您很可能有一个过滤器正在通过pre_get_document_title 滤器线索如下:

我也试过了pre_get_document_title, 页面加载时会触发,

查看soure code for wp_get_document_title(), 我们看到以下代码:

$title = apply_filters( \'pre_get_document_title\', \'\' );
if ( ! empty( $title ) ) {
    return $title;
}
这意味着,每当非空值通过pre_get_document_title 过滤器wp_get_document_title() 函数将返回通过pre_get_document_title 滤器在这种情况下document_title_separator 过滤器和document_title_parts 永远不会执行筛选器,因为这些仅在pre_get_document_title 滤器

再看看你说的话:

。。。虽然我无法让它真正改变标题。

你肯定有pre_get_document_title 具有覆盖同一筛选器实例的权限的筛选器,并且由于此筛选器,函数返回传递给它的任何内容,从而导致document_title_parts 未执行筛选器。

您需要做的是使用grep 或者一个好的编辑器,搜索整个wp-content 该文件夹pre_get_document_title 滤器找到该过滤器后,您可以从那里取下该过滤器,然后用自己的过滤器进行更换

SO网友:Nikhil Chavan

如果父主题未声明支持title-tag 你可以在儿童主题中这样做

/**
 * Theme support should be added on `after_setup_theme`
 */
function add_theme_support_child() {

    add_theme_support( \'title-tag\' );

}

add_action( \'after_setup_theme\', \'add_theme_support_child\', 11 );
过滤器document_title_parts 像这样的预期返回类型数组,请确保根据您的要求更改if条件,或者完全删除它以更改整个站点的标题,只是为了测试它是否有效。

/**
 * Change title of a page conditionally
 * 
 * @return $title - type array
 * $title[\'title\'] - Page Title
 * $title[\'tagline\'] - Site Tagline
 */
function change_title_for_a_template( $title ) {

    // Check if current page template is \'template-homepage.php\'
    if ( is_page_template( \'template-homepage.php\' ) ) {
        $title[\'title\'] = \'Changed title for a template\';
    }

    return $title;

}

add_filter( \'document_title_parts\', \'change_title_for_a_template\' );
你能试试这两个功能吗?

相关推荐

Add SKU in Product Title

我正在尝试在产品标题之前添加产品sku。下面是我的代码,当应用此代码时,它会在我的标题之前添加sku。但我想添加一次标题。 function append_sku_to_titles() { $all_ids = get_posts( array( \'post_type\' => \'product\', \'numberposts\' => -1, \'post_status\' => \'publis