Как использовать функцию get_post_class() в WordPress: руководство для начинающих

GET_POST_CLASS() │ WP 2.7.0

Функция get_post_class() позволяет получить классы для элемента поста в виде массива. Классы помогают стильному оформлению и идентификации постов в темах WordPress.

Классы, которые могут быть добавлены

  1. has-post-thumbnail — добавляется, если у поста есть миниатюра.
  2. sticky — добавляется, если пост является «липким» (sticky).
  3. hentry — всегда добавляется к каждому посту.
  4. Классы для таксономий — если пост относится к какой-либо таксономии, добавляется класс формата {$taxonomy}-{$slug}, например, category-foo или my_custom_taxonomy-bar.
    • Особый случай для post_tag: класс будет иметь префикс tag- вместо post_tag-.

Все имена классов проходят фильтр post_class, после чего добавляется значение параметра $css_class, а в качестве последнего параметра передается ID поста.

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

Синтаксис

get_post_class( $css_class, $post );
  • $css_class (string|array) — строка или массив классов, которые нужно добавить в список классов. По умолчанию: ''.
  • $post (int|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():

Пример 3: Добавление собственных классов

// В виде строки
$classes = get_post_class( 'foo bar' );

// Или в виде массива
$classes = get_post_class( [ '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 );
}

Возвращаемое значение

Функция возвращает массив string[] — массив имен классов.

Изменения

  • С версии 2.7.0 — функция была введена.
  • С версии 4.2.0 — добавлены имена классов для пользовательских таксономий.

Полный код функции

function get_post_class( $css_class = '', $post = null ) {
    $post = get_post( $post );

    $classes = array();

    if ( $css_class ) {
        if ( ! is_array( $css_class ) ) {
            $css_class = preg_split( '#s+#', $css_class );
        }
        $classes = array_map( 'esc_attr', $css_class );
    } else {
        // Убедимся, что класс всегда является массивом.
        $css_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;

    // Формат поста.
    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 );

    // Если пост требует пароль.
    if ( $post_password_required ) {
        $classes[] = 'post-password-required';
    } elseif ( ! empty( $post->post_password ) ) {
        $classes[] = 'post-password-protected';
    }

    // Миниатюры постов.
    if ( current_theme_supports( 'post-thumbnails' ) && has_post_thumbnail( $post->ID ) && ! is_attachment( $post ) && ! $post_password_required ) {
        $classes[] = 'has-post-thumbnail';
    }

    // Липкие посты.
    if ( is_sticky( $post->ID ) ) {
        if ( is_home() && ! is_paged() ) {
            $classes[] = 'sticky';
        } elseif ( is_admin() ) {
            $classes[] = 'status-sticky';
        }
    }

    // hentry для соответствия hAtom.
    $classes[] = 'hentry';

    // Все публичные таксономии.
    $taxonomies = get_taxonomies( array( 'public' => true ) );

    $taxonomies = apply_filters( 'post_class_taxonomies', $taxonomies, $post->ID, $classes, $css_class );

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

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

    $classes = apply_filters( 'post_class', $classes, $css_class, $post->ID );

    return array_unique( $classes );
}

Теперь вы знаете, как использовать функцию get_post_class() для получения классов вашего поста в WordPress. Это полезно как для разработки тем, так и для повышения SEO-оптимизации вашего контента!

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *