如何在T21主题中更改页面标题(从插件)

时间:2021-05-03 作者:GHolmes

首先,是否有可能从插件(特别是从插件中定义的短代码)更改页面标题?This answer 说不,但肯定有合理的使用案例。例如,我的用例(短代码显示集合中某个项目的详细页面内容……因此,我将短代码放在页面上;页面标题应该是什么?它取决于详细项目)。

我尝试了我能找到的所有方法:

$_SESSION[\'custom_page_title\'] = $eventData[\'eventtitle\'];


//attempt 1
add_filter(\'document_title_parts\', \'my_custom_title\');
function my_custom_title( $title ) {
  // $title is an array of title parts, including one called `title`

  $title[\'title\'] = stripslashes($_SESSION[\'custom_page_title\']);

  return $title;
}


//attempt 2
add_filter("pre_get_document_title", "my_callback");
function my_callback($old_title){
    return stripslashes($_SESSION[\'custom_page_title\']);
}


//attempt 3
add_filter(\'the_title\',\'some_callback\');
function some_callback($data){
    return stripslashes($_SESSION[\'custom_page_title\']);

}


//attempt 4
add_filter( \'wp_title\', \'custom_titles\', 10, 2 );
function custom_titles( $title, $sep ) {

    //Check if custom titles are enabled from your option framework
    if ( ot_get_option( \'enable_custom_titles\' ) === \'on\' ||  (1 == 1)) {
        $title = stripslashes($_SESSION[\'custom_page_title\']);
    }

    return $title;
}
但它们都不起作用(使用默认的twentytwentyone主题)。

这个插件是我定制的。用例只是根据插件知道的数据更改页面标题。概念上很简单。其实不是另一种方式。

插件中定义的短代码显示一个特定实体的详细信息(类似于/individual\\u display?id=5),页面应相应地命名。页面不应标题为;“单独显示”;或者随便什么,它应该被命名为;碰巧具有ID#5“的单个对象的实际名称;

是否可能,如果可能,如何实现?

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

您可以这样做:

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的对象缓存setget 内部方法gholmesGetEventData() 最小化DB请求。(因此,第二个调用将只返回缓存的结果。)

SO网友:tiago calado

这段代码应该可以做到这一点,将其添加到主题函数中。php或插件中的函数文件

add_filter("pre_get_document_title", "dynamic_page_title");
function dynamic_page_title(){
    if(isset($_SESSION[\'custom_page_title\'])){
        return stripslashes($_SESSION[\'custom_page_title\']);
    }
}
这只会更改具有$\\u会话[\'custom\\u page\\u title\']的页面的页面标题,其他页面的标题将保持不变。如果代码不起作用,您需要检查更改产品或动态帖子的页面是否属于$\\u会话[\'custom\\u page\\u tile\']=";所需标题;。或者像在你的代码中一样

$_SESSION[\'custom_page_title\'] = $eventData[\'eventtitle\'];
此外,只有在php会话打开时,才能将其分配为变量,请检查。我知道代码是有效的,现在如果您已经有$\\u会话[\'custom\\u page\\u title\']=”您只需要签入动态页面;您想要的动态标题;;

相关推荐

_title()和_content()的用法有区别吗

我试图学习一些关于WP的基本知识,所以我将以下代码粘贴到WP页面中,在该页面中我使用了一个允许我编写PHP的插件。它适用于\\u标题(两次),但当我将\\u内容放在两者之间时,页面将挂起,没有输出。我必须对\\u内容进行注释,以使页面打印\\u标题(两次)。不同的努力会产生相同的结果:\\u content()会挂起页面,但不会挂起\\u title()。使用\\u内容时我做错了什么。很抱歉,我没有得到完美的格式。br1是包含在标记中的中断标记,用于停止php解释$args = array(