将分类术语添加到单个 CPT 页面会从常规页面中删除正文 类

Adding taxonomy term to single CPT pages removes body classes from regular pages

我想为单个 CPT 页面添加分类术语,所以我使用以下代码做到了:

//* Add CPT taxonomy terms to body class
function add_taxonomy_to_single( $classes ) {
  if ( is_single() ) {
    global $post;
    $my_terms = get_the_terms( $post->ID, 'skill' );
    if ( $my_terms && ! is_wp_error( $my_terms ) ) {
      foreach ($my_terms as $term) {
        $classes[] = $term->slug;
      }
    }
    return $classes;
  }
}
add_filter( 'body_class', 'add_taxonomy_to_single' );

它适用于预期的单个 CPT 页面,如下所示。 "selected-works" 是分类术语。

<body data-rsssl="1" class="project-template-default single single-project postid-4829 logged-in woocommerce-js selected-works chrome">

但是,不幸的是,它也影响了常规页面(不是单个页面)。对于常规页面,它从 body.

中删除了所有 类
<body data-rsssl="1" class="chrome">

如何更改代码,使其只影响单个 CPT 页面而不影响其他页面?

使用 is_singular( 'your_cpt_name' ); 而不是 is_single() 并像下面一样在其中传递 CPT Name

//* Add CPT taxonomy terms to body class
function add_taxonomy_to_single( $classes ) {
  if ( is_singular('your_cpt_name') ) {
    global $post;
    $my_terms = get_the_terms( $post->ID, 'skill' );
    if ( $my_terms && ! is_wp_error( $my_terms ) ) {
      foreach ($my_terms as $term) {
        $classes[] = $term->slug;
      }
    }
    return $classes;
  }
}
add_filter( 'body_class', 'add_taxonomy_to_single' );

从我的评论中添加一个答案:

您需要将 return $classes 移出 if 语句:

//* Add CPT taxonomy terms to body class
function add_taxonomy_to_single( $classes ) {
  if ( is_single() ) {
    global $post;
    $my_terms = get_the_terms( $post->ID, 'skill' );
    if ( $my_terms && ! is_wp_error( $my_terms ) ) {
      foreach ($my_terms as $term) {
        $classes[] = $term->slug;
      }
    }
  }

return $classes;

}
add_filter( 'body_class', 'add_taxonomy_to_single' );

原因是 body_class 过滤器挂钩在页面加载时获得 运行,因此当您将 $classes 传递给过滤器函数时,如果 if语句不满足,除非 returnif 之外,$classes 参数永远不会返回到原始过滤器。