WordPress как на ладони
wordpress jino

body_class() WP 2.8 body class

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

В темах WordPress можно использовать Тег Шаблона body_class(), который может пригодится разработчикам тем, чтобы эффективнее использовать CSS селекторы. Функция body_class() дописывает к тегу 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(строка/массив)
Название одного или нескольких классов, которые нужно добавить к списку, выводимых функцией классов. При добавлении нескольких классов разделяйте их пробелом.
По умолчанию: нет

Список классов, выводимых body_class

Функция может выводить следующий список классов (аргумент class может содержать как одно, так и несколько значений из этого списка):

  • rtl
  • home
  • blog
  • archive
  • date
  • search
  • paged
  • attachment
  • error404
  • single postid-(id)
  • page-id-(page_id)
  • attachmentid-(id)
  • attachment-(mime-тип)
  • author
  • author-(user_nicename)
  • category
  • category-(slug)
  • tag
  • tag-(slug)
  • page-parent
  • page-child parent-pageid-(id)
  • page-template page-template-(название файла шаблона)
  • search-results
  • search-no-results
  • logged-in
  • paged-(номер страницы)
  • single-paged-(номер страницы)
  • page-paged-(номер страницы)
  • category-paged-(номер страницы)
  • tag-paged-(номер страницы)
  • date-paged-(номер страницы)
  • author-paged-(номер страницы)
  • search-paged-(номер страницы)
  • tax-(название таксономии) (с версии 3.1)
  • term-(название термина) (с версии 3.1)
  • admin-bar (с версии 3.1)

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

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

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. Добавим ярлык категории записи в классы

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

function category_id_class($classes) {
	global $post;
	foreach( get_the_category($post->ID) as $category )
		$classes[] = $category->category_nicename;
	return $classes;
}
add_filter('post_class', 'category_id_class');
add_filter('body_class', 'category_id_class');

Пример не очень удачный, потому что грузовой, для такого пустяка как добавить класс. Этот пример, больше подходит для демонстрации возможностей.

#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. Ниже пример демонстрирует, как добавить новый класс, только когда показывается сайдбар. Этот код нужно вставить в файл темы functions.php:

add_action('wp_head', create_function("",'ob_start();') );
add_action('get_sidebar', 'my_sidebar_class');
add_action('wp_footer', 'my_sidebar_class_replace');

function my_sidebar_class($name=''){
  static $class="withsidebar";
  if(!empty($name))$class.=" sidebar-{$name}";
  my_sidebar_class_replace($class);
}

function my_sidebar_class_replace($c=''){
  static $class='';
  if(!empty($c)) $class=$c;
  else {
	echo str_replace('<body class="','<body class="'.$class.' ',ob_get_clean());
	ob_start();
  }
}

Пример взят из кодекса. На мой взгляд не очень удачно решение. Но если кому-то очень надо, то может пригодится, пожалуй.

Код из wp-includes/post-template.php WP 4.7.2

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

Связанные Функции

Из метки: Оформление

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

body_class 13 комментариев
  • Евгений cайт: how-to-foto.ru
    @

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

    Ответить5.4 лет назад #
    • Kama4081

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

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

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

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

    Ответить4.8 года назад #
  • chdamir cайт: chdamir.ru

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

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

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

    is_date();

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

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

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

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

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

        Ответить2 года назад #
        • Kama4081

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

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

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

            Ответить2 года назад #
  • campusboy1237 cайт: wp-plus.ru
    @

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

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

  • avense4 cайт: videovegas.ru
    @

    Предназначен для использования в тете
    Исправьте ошибку пожалуйста.

    Ответить28 дней назад #

Здравствуйте, !

Ваш комментарий