问题描述

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,它在页面加载时触发,尽管我无法让它实际更改标题。

所以!我使用过滤器错误,没有正确设置我的主题,或者我不知道的其他东西。任何帮助将不胜感激!

编辑以添加更多细节

尝试一个 init 函数,但是也不行:https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

此外,虽然我从 header.php 中删除了对<title> 的任何引用,但实际的网站标题仍然显示在源文件中。

最佳解决方案

我在我的开发区域运行过滤器。它没有工作。然后我关闭了 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 更高的级别。然后它工作。所以,我不知道你的 set-up,但我建议你试试这个:

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

次佳解决方案

从顶部到底部以及从底部到顶部读取您的帖子后,您都可以使用通过 pre_get_document_title 过滤器传递标题的过滤器。这里的线索如下:

I’ve also tried pre_get_document_title, which does fire on page load,

看看 wp_get_document_title()的 soure 代码,我们看到以下代码:

$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 过滤器之后运行。

看看你说的更进一步:

…though I’m unable to get it to actually change the title.

您绝对有一个具有权限的 pre_get_document_title 过滤器,该过滤器覆盖了同一过滤器的实例,并且由于此过滤器,该函数将返回传递给它的任何结果,导致 document_title_parts 过滤器未被执行。

您将需要做的是使用 grep 或一个好的编辑器,并搜索整个 wp-content 文件夹中的 pre_get_document_title 过滤器。找到该过滤器后,您可以从中删除该过滤器,并将其替换为自己的过滤器

第三种解决方案

经过一些实验,我来到了以下建议:可以这样,<title> 标签是你父母主题的 header.php 中的”hard coded” 吗?如果是这种情况,您可以尝试从您的孩子主题的 header.php(将您的父母的 header.php 复制到您的子主题文件夹) 中删除<title> 标签,然后通过 functions.php 添加主题支持:

add_theme_support( 'title-tag' );

我会尝试解释什么导致我这个建议:我尝试像你和其他人建议 – 但事实证明,我在源代码中找到了两个<title> 标签。第一个有标准标题,第二个是修改标题。但是 (当然) 在浏览器标题栏我只能看到默认标题。

然后我检查了我使用的父主题的 header.php(二十五),而<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> 标签之前进行的,只有当时有两个被忽略的<title> 标签。这可能与您的主题相同吗?

因为 wp 4.4.0 但是<title> 标签是由_wp_render_title_tag()函数动态创建的,它基本上调用另一个函数 wp_get_document_title()并将 html 标签包裹在结果周围。长篇小说:如果您的主题 header.php 缺少<title> 标签,您可以通过 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');
}

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。