get_post_class

Получает css классы в виде массива, которые нужно использовать в записи для вывода в html теге .

Итоговый массив классов пропускается через фильтр post_class, используйте его, когда нужно изменить выводимые классы в зависимости от разных условий.

Чтобы сразу вывести классы на экран в виде строки, используйте post_class()
Где и какие классы добавляются
  • 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.
✈ 1 раз = 0.00616с = очень медленно | 50000 раз = 10.72с = медленно PHP 7.0.2, WP 4.4.1
Хуки из функции:
post_class
Возвращает

Массив в котором элементы это название классов.

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

get_post_class( $class, $post_id );
$class(строка/массив)
Классы, которые нужно добавить в список.
По умолчанию: ”
$post_id(число/WP_Post)
ID или объект записи, классы которой нужно получить.
По умолчанию: null

Примеры

#1 Демонстрация вывода

$classes = get_post_class();
print_r( $classes );

/*
Array
(
	[0] => post-219
	[1] => post
	[2] => type-post
	[3] => status-publish
	[4] => format-standard
	[5] => has-post-thumbnail
	[6] => hentry
	[7] => category-blog
	[8] => tag-novosti
)
*/

#2 Выведем все классы в виде строки

Этот код можно использовать как замену для post_class():

echo '<div class="' . join(' ', get_post_class() ) . '">';

#3 Добавим свой класс

$classes = get_post_class('foo bar');

// или можно массивом
$classes = get_post_class( array('foo', 'bar') );

/* 
Оба примера добавят в общий массив

Array
(
	[0] => foo
	[1] => bar
	[2] => post-19
)
*/

#4 Удалим ненужный класс

Допустим нам нужно избавиться от класса hentry, тогда перед вызовом get_post_class() или post_class() используйте такой фильтр:

add_filter( 'post_class', 'remove_hentry' );
function remove_hentry( $classes ) {
	$unset = array('hentry'); // можно добавить еще
	return array_diff( $classes, $unset );
}

Заметки

  • С версии 3.1 введена поддержка форматов постов.
  • С версии 4.2 введена поддержка таксономий.

Код из


wp-includes/post-template.php

WP 4.7.2

<?php
function get_post_class( $class = '', $post_id = null ) {
	$post = get_post( $post_id );

	$classes = array();

	if ( $class ) {
		if ( ! is_array( $class ) ) {
			$class = preg_split( '#s+#', $class );
		}
		$classes = array_map( 'esc_attr', $class );
	} else {
		// Ensure that we always coerce class to being an array.
		$class = array();
	}

	if ( ! $post ) {
		return $classes;
	}

	$classes[] = 'post-' . $post->ID;
	if ( ! is_admin() )
		$classes[] = $post->post_type;
	$classes[] = 'type-' . $post->post_type;
	$classes[] = 'status-' . $post->post_status;

	// 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[] = 'format-' . sanitize_html_class( $post_format );
		else
			$classes[] = 'format-standard';
	}

	$post_password_required = post_password_required( $post->ID );

	// Post requires password.
	if ( $post_password_required ) {
		$classes[] = 'post-password-required';
	} elseif ( ! empty( $post->post_password ) ) {
		$classes[] = 'post-password-protected';
	}

	// Post thumbnails.
	if ( current_theme_supports( 'post-thumbnails' ) && has_post_thumbnail( $post->ID ) && ! is_attachment( $post ) && ! $post_password_required ) {
		$classes[] = 'has-post-thumbnail';
	}

	// sticky for Sticky Posts
	if ( is_sticky( $post->ID ) ) {
		if ( is_home() && ! is_paged() ) {
			$classes[] = 'sticky';
		} elseif ( is_admin() ) {
			$classes[] = 'status-sticky';
		}
	}

	// hentry for hAtom compliance
	$classes[] = 'hentry';

	// All public taxonomies
	$taxonomies = get_taxonomies( array( 'public' => true ) );
	foreach ( (array) $taxonomies as $taxonomy ) {
		if ( is_object_in_taxonomy( $post->post_type, $taxonomy ) ) {
			foreach ( (array) get_the_terms( $post->ID, $taxonomy ) as $term ) {
				if ( empty( $term->slug ) ) {
					continue;
				}

				$term_class = sanitize_html_class( $term->slug, $term->term_id );
				if ( is_numeric( $term_class ) || ! trim( $term_class, '-' ) ) {
					$term_class = $term->term_id;
				}

				// 'post_tag' uses the 'tag' prefix for backward compatibility.
				if ( 'post_tag' == $taxonomy ) {
					$classes[] = 'tag-' . $term_class;
				} else {
					$classes[] = sanitize_html_class( $taxonomy . '-' . $term_class, $taxonomy . '-' . $term->term_id );
				}
			}
		}
	}

	$classes = array_map( 'esc_attr', $classes );

	/**
	 * Filters the list of CSS classes for the current post.
	 *
	 * @since 2.7.0
	 *
	 * @param array $classes An array of post classes.
	 * @param array $class   An array of additional classes added to the post.
	 * @param int   $post_id The post ID.
	 */
	$classes = apply_filters( 'post_class', $classes, $class, $post->ID );

	return array_unique( $classes );
}

Комментарии:


Оставить комментарий

Your email address will not be published. Required fields are marked *