您可以这样做:
function filterDocumentTitle(string $title): string
{
// don\'t change title on admin pages or when global $post is not loaded
if (is_admin() || get_the_ID() === false) {
return $title;
}
// don\'t change title if shortcode is not present in content
if (!has_shortcode(get_the_content(), \'caption\')) {
return $title;
}
return \'special title\';
}
add_filter(\'pre_get_document_title\', \'filterDocumentTitle\');
如果您正在使用Yoast的SEO插件,您还需要
add_filter(\'wpseo_title\', \'filterDocumentTitle\');
, 因为插件不能很好地使用
pre_get_document_title
单独地其他SEO插件可能需要类似的修复。
在上面的代码中,我检查[caption]
shortcode,我在本地使用它进行测试,将其替换为您真正的shortcode名称(没有[
和]
).
这样,您就可以知道您的短代码何时是页面的一部分,何时不是页面的一部分。现在剩下要做的就是获得你想要的标题值。由于缺乏更多信息,我假设您的短代码如下所示
add_shortcode(\'myshortcode\', function () {
$id = intval($_GET[\'item\']);
$eventData = /* .. get event data via ID */;
return \'some contents depending on $eventData\';
});
为了不必重复代码,让我们将其重构为以下内容
function gholmesGetEventData(): array {
if (empty($_GET[\'item\'])) {
throw new Exception(\'Only supported when item is provided.\');
}
$id = intval($_GET[\'item\']);
$eventData = /* .. get event data via ID, throw Exception if not found */;
return $eventData;
}
add_shortcode(\'myshortcode\', function (): ?string {
try {
$eventData = gholmesGetEventData();
return \'some contents depending on $eventData\';
} catch (Exception $e) {
// do something with the exception
return null;
}
});
function gholmesFilterDocumentTitle(string $title): string
{
// don\'t change title on admin pages or when global $post is not loaded
if (is_admin() || get_the_ID() === false) {
return $title;
}
// don\'t change title if shortcode is not present in content
if (!has_shortcode(get_the_content(), \'caption\')) {
return $title;
}
try {
$eventData = gholmesGetEventData();
return $eventData[\'eventtitle\'];
} catch (Exception $e) {
return $title;
}
}
add_filter(\'pre_get_document_title\', \'gholmesFilterDocumentTitle\');
通过此设置,您可以调用
gholmesGetEventData()
两次一次在标题中,一次在短代码正文中。要对此进行优化,可以使用WordPress的对象缓存
set 和
get 内部方法
gholmesGetEventData()
最小化DB请求。(因此,第二个调用将只返回缓存的结果。)