body_class()WP 2.8.0

Выводит css классы относящиеся к текущей странице. Предназначен для использования в теге <body>.

Эта функция может пригодиться разработчикам тем, чтобы эффективнее использовать CSS селекторы. Она дописывает к тегу body различные классы, в зависимости от того на какой странице находится посетитель, залогинен он или нет и т.д. (например, class="home logged-in").

Чтобы добавить дополнительные классы используйте параметр $class или фильтр body_class (см. примеры):

Смотрите хук body_class

Работает на основе: get_body_class()
1 раз — 0.000176 сек (быстро) | 50000 раз — 3.11 сек (быстро) | PHP 7.0.14, WP 4.7

Хуков нет.

Возвращает

null. Выводит на экран список css классов.

Использование

<body <?php body_class( $class ) ?>>
$class(строка/массив)
Список дополнительных классов, которые нужно добавить к базовому списку. При добавлении нескольких классов разделяйте их пробелом.
По умолчанию: ''

Функция может выводить следующий список классов

Аргумент class может содержать сразу несколько значений из этого списка.

rtl                — is_rtl()
home               — is_front_page()
blog               — is_home()
privacy-policy     — is_privacy_policy()
archive            — is_archive()
date               — is_date()
error404           — is_404()

// is_search()
search             — is_search()
search-results     — есть результаты
search-no-results  — нет результатов

// is_singular()
single                — is_single()
single-(post_type)    — is_single() && $post->post_type
postid-(post_id)      — is_single() && $post->post_type

// post-formats
single-format-(post_format)  — get_post_format()
single-format-standard       — ! get_post_format()

// is_page()
page                    — is_page()
page-id-(page_id)       — is_page()
page-parent             — дочерняя страница
page-child              — $post->post_parent
parent-pageid-(id)      — $post->post_parent
page-template page-template-(название файла шаблона)   — is_page_template()

// is_attachment()
attachment              — is_attachment()
attachmentid-(id)       — is_attachment()
attachment-(mime-тип)   — is_attachment()

// is_post_type_archive()
post-type-archive              — is_post_type_archive()
post-type-archive-(post_type)  — is_post_type_archive()

// is_author()
author                         — is_author()
author-(user_nicename)         — is_author()

// terms: is_category(), is_tag(), is_tax()
category
category-(slug)
category-(id)
tag
tag-(slug)
tag-(id)
tax-(taxonomy)
term-(term slug)
term-(id)

// is_paged()
paged                            — is_paged()
paged-(page number)
single-paged-(page number)
page-paged-(page number)
category-paged-(page number)
tag-paged-(page number)
date-paged-(page number)
author-paged-(page number)
search-paged-(page number)

// Other
logged-in              — is_user_logged_in()
admin-bar              — is_admin_bar_showing()
no-customize-support   — is_admin_bar_showing()

custom-background      — current_theme_supports( 'custom-background' )

wp-custom-logo         — has_custom_logo()
wp-embed-responsive    — current_theme_supports( 'responsive-embeds' )

Где, какие классы выводятся

Для вывода классов используются условные теги. Ниже зависимость добавляемого в список класса, от срабатывания условного тега:

is_front_page()home

is_home()blog

is_attachment()attachment

is_404()error404

is_user_logged_in()logged-in

is_admin_bar_showing()admin-bar no-customize-support

is_search()search

  • Есть найдено: search-results.
  • Если не найдено: search-no-results.

is_single()single postid-(ID поста)

  • Если пост: single-post
  • Если произвольный типа поста: single-(тип поста)
  • Если поддерживаются форматы постов: single-format-{формат} или single-format-standard
  • Если вложение (прикрепленные файлы): attachment single-attachment attachmentid-{ID} attachment-mime-type

is_page()page page-id-{ID страницы}

  • Родительская страница: page-parent
  • Дочерняя страница: page-child parent-pageid-{ID}
  • Шаблон страницы:
    • Шаблон указан: page-template page-template-{имя файла}-php
    • Шаблон не указан: page-template-default

is_archive()archive

  • По дате:date
  • Тип поста: post-type-archive post-type-archive-{тип поста}
  • Автор: author author-{имя}
  • Рубрики: category category-{ярлык}
  • Метки: tag tag-{ярлык}
  • Таксономия: tax-{таксономия} term-{ярлык термина} term-{ID}
  • Архив формата постов: tax-post_format term-post-format-{формат} term-{ID}

is_paged()paged paged-{номер страницы}

  • Пост: single-paged-{номер страницы}
  • Страница: page-paged-{номер страницы}
  • Рубрика: category-paged-{номер страницы}
  • Метка: tag-paged-{номер страницы}
  • Архив по дате: date-paged-{номер страницы}
  • Архив автора: author-paged-{номер страницы}
  • Поиск: search-paged-{номер страницы}
  • Произвольный тип записи: post-type-paged-{номер страницы}

Если есть настраиваемый фон

  • custom-background
    Делается такая проверка:
    if ( get_theme_mod( 'background_color' ) || get_background_image() )

is_rtl()rtl

Примеры

0

#1 Применение

Пример, показывающий как применяется функция:

<body <?php body_class(); ?>>

В результате, в HTML коде мы получим следующее:

<body class="page page-id-2 page-template page-template-default logged-in">

А в сss описываться это будет так:

.page {
	/* стили для постоянной страницы */
}
.page-id-2 {
	/* стили для постоянной страницы с ID=2 */
}
.logged-in {
	/* стили для всех страниц, когда пользователь авторизован */
}
0

#2 Добавим свой, произвольный класс:

<body <?php body_class('class-name'); ?>>

Получим:

<body class="class-name post post-id-24">
0

#3 Добавка классов через фильтр body_class

Классы можно добавить с применением условий.

Добавим класс только для постоянных страниц - is_page(). Для этого воспользуемся фильтром body_class. Код можно вставить в файл темы function.php:

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

	// добавим класс 'class-name' в массив классов $classes
	if( is_page() )
		$classes[] = 'it_is_page';

	return $classes;
}

Это только демонстрация: для постоянных страниц уже есть уникальный класс.

0

#4 Добавим ярлык категории записи в классы {#post-cat-class}

Добавим слаг категории как класс для страниц постов. Слаг категории будет тот, к которому относится пост:

add_filter( 'post_class', 'category_id_class' );
add_filter( 'body_class', 'category_id_class' );
function category_id_class( $classes ) {

	if( is_single() ){
		global $post;

		foreach( get_the_category($post->ID) as $category )
			$classes[] = $category->name;
	}

	return $classes;
}
0

#5 Добавим имя родительской страницы в классы body

Этот пример добавляет ярлык родительской страницы в классы body, когда мы находимся на дочерней странице:

add_filter( 'body_class', 'add_page_parent_to_body_class' );
function add_page_parent_to_body_class( $classes ){
	global $post;

	if( is_page() && $post->post_parent ){
		$post_data = get_post( $post->post_parent );
		$classes[] = 'parent_page-' . $post_data->post_name;
	}

	return $classes;
}

Это только демонстрация: для родительских страниц уже есть уникальный класс.

0

#6 Добавим класс только, когда показывается сайдбар

В примере 3 было показано, как добавлять дополнительные CSS классы через фильтр body_class. Ниже пример демонстрирует как добавить новый класс только когда показывается сайдбар:

add_action( 'get_sidebar', 'sidebars_body_classes' );
add_action( 'wp_head',     'sidebars_body_classes__ob_start' );
add_action( 'wp_footer',   'sidebars_body_classes__ob_end' );

# Запоминаем классы
function sidebars_body_classes( $name = '' ){

	static $classes = 'withsidebar';

	if( $name ){
		$classes .= " sidebar-$name";
	}

	return $classes;
}

# Включим вывод в буфер
function sidebars_body_classes__ob_start(){
	ob_start();
}

# Добавляем классы к body
function sidebars_body_classes__ob_end(){

	$html = ob_get_clean();

	if( $classes = sidebars_body_classes() ){
		echo str_replace( '<body class="', "<body class=\"$classes ", $html );
	}

	echo $html;
}

Список изменений

С версии 2.8.0 Введена.

Код body_class() WP 6.4.3

function body_class( $css_class = '' ) {
	// Separates class names with a single space, collates class names for body element.
	echo 'class="' . esc_attr( implode( ' ', get_body_class( $css_class ) ) ) . '"';
}