WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

body_class() WP 2.8

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

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

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

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

Хуков нет.

Возвращает

Выводит на экран список 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

меню

Примеры

#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 {
	/* стили для всех страниц, когда пользователь авторизован */
}

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

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

Получим:

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

#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;
}

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

#3.1. Добавим ярлык категории записи в классы

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

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;
}

#3.2. Добавим имя родительской страницы в классы 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;
}

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

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

В примере 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-includes/post-template.php WP 5.2.2

<?php
function body_class( $class = '' ) {
	// Separates class names with a single space, collates class names for body element
	echo 'class="' . join( ' ', get_body_class( $class ) ) . '"';
}

Cвязанные функции

Из метки: Оформление (верстка классы стили)

Еще из раздела: Другие функции темы

Еще из тегов шаблона: Записи: посты, страницы, ...

14 комментов
Полезные 1 Все
  • Евгений cайт: how-to-foto.ru

    Чиню чужой шаблон. body_class() выдает кроме классов еще и
    body style="overflow-x: hidden;" class="...
    в результате горизонтальная полоса прокрутки отсутствует. Никак не могу найти, где эту напасть прикрутили.

    Ответить7.8 лет назад #
    • Kama7528

      Я вам искренне сочувствую - нет ничего хуже чем ковырять чужие ляпы dash3

      Попробуйте удалить все фильтры у body_class, используя remove_all_filters(), чтобы убедится что эта гадость через фильтр цепляется.

      1
      Ответить7.8 лет назад #
  • chdamir cайт: chdamir.ru

    У мну с аглицким напряженка, тк валенок из деревни. ) Не могу понять пример из кодекса Add Sidebar Classes.

    1
    Ответить7.2 лет назад #
  • chdamir cайт: chdamir.ru

    Наткнулся на один простой вариантик решения своего вопроса (см.комменты выше).
    Twenty Eleven 1.3 + WP 3.3.1
    Полез в functions.php за другим, а там в самом конце как раз этот класс singular и задается. Отключил его нах. Ну, там еще в шаблоне сингл, сайдбар не подключается, но это одну строку из шаблона паге капнуть. Вроде, работает.
    Короче, всем спасибо.

    Ответить7.2 лет назад #
  • Aamonorias

    Мне кажется, что на этой странице не хватает очень многих функций. Я сейчас делаю свою тему с нуля, пишу body_class и приходится искать функции для проверки и присваивания класса.
    Например, у вас нет функции для проверки архива по дате. Вот она:

    is_date();

    В принципе, это не трудно было найти, но некоторые функции довольно нетривиальные, а когда нужно сделать много проверок, это отнимает время.
    Ощущение, что автор статьи поленился. Но все равно спасибо хотя бы за эту информацию.

    Ответить4.4 года назад #
    • Aamonorias

      Ещё на этой странице не написаны способы получения post ID, page ID, post type или name template page.

      Ответить4.4 года назад #
      • Aamonorias

        Кажется, я дико облажался, потому что у body_class() есть значения по дефолту. Прошу прощения за предыдущие комментарии.

        Ответить4.4 года назад #
        • Kama7528

          Мдя, уж... sarcastic Хорошо хоть извинились...

          Ответить4.4 года назад #
          • Aa

            Вышло недоразумение, т.к. про body_class() я прочитал в вашем блоге, но у вас не было информации о том, что функция содержит значения по умолчанию и берутся они из файла post-template.php, который находится в каталоге /wp-includes.
            В официальной же документации это всё есть, но это совсем другая история.
            Впредь буду внимательнее, ещё раз извиняюсь за грубости smile

            1
            Ответить4.3 года назад #
  • campusboy3384 cайт: www.youtube.com/c/wpplus

    В функции нет хуков.

    Но в тоже время 1 пример показывает, как подключиться к этой теме. Или я не так понимаю слово хук? smile

    Ответить3.1 года назад #
  • Леонид

    А как можно добавить свой body_class на все страницы, кроме страниц записей, то есть исключить body.single???

    Ответить1.4 года назад #
    • Леонид

      Тупо добавил в третий пример is_home и так далее))

      1
      Ответить1.4 года назад #
Здравствуйте, !     Войти . Зарегистрироваться