代码之家  ›  专栏  ›  技术社区  ›  4thSpace wkw

如何在短代码中修改页面标题?

  •  2
  • 4thSpace wkw  · 技术社区  · 11 年前

    如何在短代码中修改特定页面的页面标题?

    以下内容将更改标题,但它对每一页都执行。我需要更多地控制它在哪里执行。

    function assignPageTitle(){
      return "Title goes here";
    }
    add_filter('wp_title', 'assignPageTitle');
    

    有没有一种方法可以在短代码函数中调用上述内容?我知道如何使用do_shortcode(),但上面只是一个过滤器。

    我的目标是根据URL参数修改页面标题。这种情况只发生在特定的页面上。

    2 回复  |  直到 11 年前
        1
  •  5
  •   user8717003 user8717003    6 年前

    虽然WordPress的短代码并不是为了做到这一点而设计的,但它是可以做到的。问题是在发送首段之后处理短代码,因此解决方案是在发送头段之前处理短代码。

    add_filter( 'pre_get_document_title', function( $title ) {
        global $post;
        if ( ! $post || ! $post->post_content ) {
            return $title;
        }
        if ( preg_match( '#\[mc_set_title.*\]#', $post->post_content, $matches ) !== 1 ) {
            return '';
        }
        return do_shortcode( $matches[0] );
    } );
    
    add_shortcode( 'mc_set_title', function( $atts ) {
        if ( ! doing_filter( 'pre_get_document_title' ) ) {
            # just remove the shortcode from post content in normal shortcode processing
            return '';
        }
        # in filter 'pre_get_document_title' - you can use $atts and global $post to compute the title
        return 'MC TITLE';
    } );
    

    关键点是,当过滤器“pre_get_document_title”完成时,全局$post对象被设置,$post->post_content可用。所以,你可以在这个时候找到这篇文章的短代码。

    当通常调用shortcode时,它会将自己替换为空字符串,因此对post_content没有影响。然而,当从过滤器“pre_get_document_title”调用时,它可以根据其参数$atts和全局$post计算标题。

        2
  •  3
  •   Peter Featherstone    11 年前

    取自 WordPress Codex

    WordPress 2.5中引入了短代码API,它是一组简单的 用于创建用于发布内容的宏代码的函数。

    这表明您无法使用短代码控制页面标题,因为短代码在帖子内容中运行,此时标题标签已经呈现,而且为时已晚。

    你到底想做什么?使用 Yoast SEO Plugin 如果你想这样做,你可以在每个帖子中设置帖子和页面标题吗?

    您可以根据URL参数创建自定义插件,如下所示:

    function assignPageTitle(){
    
    if( $_GET['query'] == 'something' ) { return 'something'; }
    
    elseif( $_GET['query'] == 'something-else' ) { return 'something-else'; }
    
    else { return "Default Title"; }
    
    }
    
    add_filter('wp_title', 'assignPageTitle');