问题描述
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_title
或 document_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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。