it-roy-ru.com

Почему is_page_template () не добавляет класс тела?

Я хочу условно добавить класс тела в зависимости от того, какой шаблон используется.

Я не могу понять, почему следующий код не работает ...

function damsonhomes_body_classes( $classes ) {

  if (is_page_template('single.php')) {

    $classes[] = 'sans-hero';

  }

  return $classes;

}

add_filter( 'body_class', 'damsonhomes_body_classes');

Спасибо всем

2
richerimage

Функция is_page_template() - это неправильная функция, используемая в этом случае, поскольку она проверяет шаблоны страниц , а single.php - это обычный шаблон, а не специфичный для страницы, обычно предназначенный для сообщений.

Функция, которую вы, вероятно, хотите использовать вместо этого: is_single( $optional_posttype ) , которая будет искать единственное представление типа сообщения, по умолчанию post.

if( is_single() ) {
    /** ... **/
}

Вы также можете проверить по базовому имени, если вы действительно хотели:

global $template;
$template_slug = basename( $template );

if( 'single.php' === $template_slug ) {
 /** ... **/
}
3
Howdy_McGee

Обратите внимание, что single.php - это файл шаблона для одного сообщения, который вы обычно не используете для страниц.

Также обратите внимание, что get_body_class() уже добавляет некоторую информацию относительно текущего шаблона страницы:

if ( is_page_template() ) {
    $classes[] = "{$post_type}-template";

    $template_slug  = get_page_template_slug( $post_id );
    $template_parts = explode( '/', $template_slug );

    foreach ( $template_parts as $part ) {
        $classes[] = "{$post_type}-template-" . sanitize_html_class(
          str_replace( array( '.', '/' ), '-', basename( $part, '.php' ) ) );
    }
    $classes[] = "{$post_type}-template-" . sanitize_html_class(
        str_replace( '.', '-', $template_slug ) );
} else {
    $classes[] = "{$post_type}-template-default";
}

Если вы хотели указать single.php, то во многих случаях нам не нужно добавлять для этого собственный класс body, потому что get_body_class() уже добавляет следующие классы в этом случае:

if ( is_single() ) {
    $classes[] = 'single';
    if ( isset( $post->post_type ) ) {
        $classes[] = 'single-' . sanitize_html_class( $post->post_type, $post_id );
        $classes[] = 'postid-' . $post_id;

        // Post Format
        if ( post_type_supports( $post->post_type, 'post-formats' ) ) {
            $post_format = get_post_format( $post->ID );

            if ( $post_format && !is_wp_error($post_format) )
                $classes[] = 'single-format-' . sanitize_html_class( $post_format );
            else
                $classes[] = 'single-format-standard';
        }
    }
}

Поэтому я бы сказал, что в большинстве случаев классы тела по умолчанию являются достаточными.

2
birgire