访问子页面或单个帖子时,将父模板名称添加到正文类筛选器

时间:2011-02-28 作者:Mr.Brown

如何为body_class() 标记,允许我在访问子页面或帖子时将父页面slug名称作为类添加到正文中?

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

here:

add_filter(\'body_class\',\'body_class_slugs\');
function body_class_slugs($classes) {
    global $posts,$post;

    if(is_single() || is_page()){ //only on a single post or page
        if (isset($posts)){
            $classes[] = $post[0]->post_name; //posts is an array of posts so we use the first one by calling [0]
        }
        elseif (isset($post)){
            $classes[] = $post->post_name;
        }
    }
    return $classes;
}
SO网友:Dzikri Aziz

尝试以下操作:

function my_body_class( $classes ) {
    global $post;

    # Page
    if ( is_page() ) {
        # Has parent / is sub-page
        if ( $post->post_parent ) {
            # Parent post name/slug
            $parent = get_post( $post->post_parent );
            $classes[] = \'parent-slug-\'.$parent->post_name;

            # Parent template name
            $parent_template = get_post_meta( $parent->ID, \'_wp_page_template\', true);
            if ( !empty($parent_template) )
                $classes[] = \'parent-template-\'.sanitize_html_class( str_replace( \'.\', \'-\', $parent_template ), \'\' );
        }
    }

    return $classes;
}
add_filter( \'body_class\', \'my_body_class\' );
您将获得两个额外的课程:

父段塞-postnametemplatename

SO网友:Mr.Brown

我试着在WordPress帖子模板中查找。body类所在的php文件,找到了生成我想要添加的类的函数,当Im也在子页面或帖子上时,并将其复制到我的函数中。php。。。然后我添加了is_single()is_page() 这似乎至少在一定程度上起到了作用,但我无法让它正确获取模板ID,就像它在访问父页面时自己所做的那样。

这就是我尝试的:

add_filter(\'body_class\',\'body_class_slugs\');
function body_class_slugs($classes) {
    global $wp_query, $wpdb;

    if (is_single() || is_page() || is_page_template()) {
            $classes[] = \'page-template\';
            $classes[] = \'page-template-\' . sanitize_html_class( str_replace( \'.\', \'-\', get_post_meta( $page_id,            \'_wp_page_template\', true ) ), \'\' );
    }
    return $classes;

}
这是输出的内容:

<body class="single single-post postid-852 single-format-standard page-template page-template-">
注意事项page-template-, 这是我需要的类,但剩下的模板名。。。所以它将是页面模板名php。

My goal is to basically always have the parent template name class present in the body tag when visiting ANY page, ie. Pages, Subpages, Posts, etc...


EDIT 1

所以我设法t31os\'s 代码工作,即使我不确定我甚至做得对吗?

我在函数中放置了他的过滤器。php优先:

add_filter( \'template_include\', \'var_template_include\', 1000 );
function var_template_include( $t ){
    $GLOBALS[\'current_theme_template\'] = basename($t);
    return $t;
}

function get_current_template( $echo = false ) {
    if( !isset( $GLOBALS[\'current_theme_template\'] ) )
        return false;
    if( $echo )
        echo $GLOBALS[\'current_theme_template\'];
    else
        return $GLOBALS[\'current_theme_template\'];
}
然后,我添加了我从WordPress核心获得的最后一段代码post-template.php &文件;已添加$classes[] = \'page-template-\' . get_current_template(); 正如他所建议的那样:

add_filter(\'body_class\',\'body_class_slugs\');
function body_class_slugs($classes) {
    global $wp_query, $wpdb;

    if (is_page_template() || is_page() || is_single()) {
            $classes[] = \'page-template-\' . sanitize_html_class( str_replace( \'.\', \'-\', get_current_template() ) );
    }
    return $classes;

}
你也会注意到我不想看到-page-template-name.php 所以我添加了sanitize_html_class( str_replace( \'.\', \'-\', get_current_template() )) 删除句点。

这离我们更近了一步,但是unfortunately it still doesn\'t retrieve the parent template name in that way when visiting single posts or subpages, 它只获取当前使用的模板。这在单篇文章页面上也不是很有用,因为它会呈现:page-template-single-php 而不是实际使用的单个模板,因为我有几个不同的模板。。。。。因此,为什么检索要在所有关联页面上显示的父模板名称最有用。

Any additional help is super appreciated!!! -- Its almost working!!!

结束

相关推荐

Get term SLUG by term ID

我有一个等级分类法叫做“tarefa”我必须显示子分类法中的所有帖子。我曾经get_term_children function 函数验证分类法父级是否具有子级。如果分类法父级有子级,我将按分类法子级查询帖子。问题是:我必须按分类法slug查询帖子,但函数get\\u term\\u children返回一个分类法ID数组。问题是:如何通过分类ID返回分类slug?