post_class()
Выводит селекторы CSS (классы) всячески характеризующее пост/запись. Используется для упрощения верстки шаблона.
Это тег шаблона, который призван упростить работу разработчиков тем для WordPress. Функция используется внутри HTML тега и снабжает его CSS классами описывающими пост, на котором в данный момент находится посетитель. Например,
class="post post-4564 category-48"
post_class() принято использовать в таких файлах шаблона как index.php
, single.php
и т.п. для контейнеров выводящих информацию о посте (<div id="post">
или <div id="post-123">
). Для страниц где используется Циклический вывод, функцию нужно использовать внутри цикла.
Если необходимо получить результат функции, а не выводить его на экран, то используйте функцию get_post_class(). Только в этом случае вы получите массив классов. а не строку!
Существует очень похожая функция body_class(), которая также выводит css классы, но для тега <body>, т.е. для всей страницы.
Где и какие классы добавляются
-
hentry
,post-{$post_id}
,type-{$post_type}
,status-{$post_status}
,{$post_type}
— выводятся для всех записей. Части в скобках заменяются на соответствующую переменную текущей записи;
{$post_type} НЕ выводится в админке... -
sticky
— если это прилепленный пост, выводится только на странице is_home(). В админке выводитсяstatus-sticky
; -
has-post-thumbnail
— если у записи есть миниатюра; -
format-{формат записи}
— если включена поддержка форматов. Если формат не указан то выведетformat-standart
. -
post-password-required
— для записей защищенных паролем. {$taxonomy}-{$slug}
— если запись принадлежит таксономии. $taxonomy замениться названим таксы, а $slug названием термина (элемента таксономии). Например:category-blog
;
Исключением тут является таксономияpost_tag
для нее префикс будетtag-
, а неpost_tag-
. Например:tag-novosti
.
Хуков нет.
Возвращает
null
. Текст, сформированный атрибут class для html тега.
Использование
<div <?php post_class(); ?>>
- $class(строка/массив)
- Один или несколько классов, которые нужно добавить к остальным. Классы нужно разделять пробелом.
По умолчанию: '' - $post_id(число)
- ID поста, к которому будет относится работа функции.
По умолчанию: текущий пост в цикле ($post->ID)
Примеры
#1 Использование за пределами цикла
Если нужно получить классы нужного нам поста для текущей страницы, а не поста который определился как текущий, то функции можно передать второй параметр содержащий ID нужного нам поста:
<?php post_class('',$post_id); ?>
#2 Базовый пример
Применим функцию к HTML контейнеру, содержащему данные поста:
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
В результате мы получи нечто подобное (пусть пост находится в категории Танцы (dancing)):
<div id="post-4564" class="post post-4564 category-48 category-dancing logged-in">
Для данного примера, в CSS нужно использовать следующие селекторы:
.post { /* стили для всех постов */ } .post-4564 { /* стили только для поста в ID 4564 */ } .category-dancing { /* стили для всех постов из категории dancing */ }
#3 Добавка новых классов
Функция занимает атрибут HTML тега "class", потому если нам нужно добавить свой класс к тегу, добавлять его нужно через функци, просто прописав его в параметр функции:
<div id="post-<?php the_ID(); ?>" <?php post_class('class-name'); ?>>
В результате мы получим
<div id="post-4564" class="class-name post post-4564 category-48 category-dancing logged-in">
#4 Добавка классов через фильтр
Чтобы добавить название всех категорий к которым относится пост, как классы, можно использовать такой хак:
// добавка названий категорий в виде классов в функции body class и post class 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');
Список изменений
С версии 2.7.0 | Введена. |
Код post_class() post class WP 6.8
function post_class( $css_class = '', $post = null ) { // Separates classes with a single space, collates classes for post DIV. echo 'class="' . esc_attr( implode( ' ', get_post_class( $css_class, $post ) ) ) . '"'; }