加载特定 WordPress 页面模板时无法将特定类名注入正文标签

Unable to inject a specific classname to body tag when a specific WordPress page template loads

我有一个 wordpress 网站,其中有一个自定义主题,我可以在其中为每个网页创建模板部分。当特定页面模板(例如:abc.php) 负载。

首先我在 header.php 中使用了下面的代码,但没有用。

<body <?php if ( is_page_template( 'template-parts/page/abc.php' ) ) { body_class( 'abc' ); } else { body_class(); } ?>> 

然后我将波纹管代码添加到 functions.php 但它也不起作用。

add_filter( 'body_class','abc_class' );
function abc_class( $classes ) {

    if ( is_page_template( 'template-parts/page/abc.php' ) ) {
        $classes[] = 'abc';
    }

    return $classes;

}

我不明白我在这里做错了什么。我该如何解决这个问题?

首先,is_page_template() 函数适用于 WP 模板,我的意思是文件开头有

/*
 * Template name: Your Super Template
 */

所以,函数returns true 是一个实际显示此模板的页面。我会告诉你更多,你甚至不必添加自定义正文 类 因为函数 body_class() 为每个页面模板添加特定的唯一 类 :)

其次,页面模板可以在主题目录本身或一级子目录中,所以

<body <?php if ( is_page_template( 'abc.php' ) ) { body_class( 'abc' ); } else { body_class(); } ?>> 

<body <?php if ( is_page_template( 'page-templates/abc.php' ) ) { body_class( 'abc' ); } else { body_class(); } ?>> 

你的模板在2级子目录,所以它实际上不是一个页面模板,它是一个模板部分。

所以,用两个词来说,函数 is_page_template() 适用于页面模板,但不适用于模板部分

我能够在 functions.php 中添加以下内容,以便它在每次特定页面时获取 slug 并将其注入正文 class负载。

add_filter( 'body_class', function( $classes ) {
if ( is_page() ){
    $slug = get_queried_object()->post_name;
    return array_merge( $classes, array( $slug ) );
}
    return $classes;
} );