Функция GET_BODY_CLASS() в WordPress: как использовать и настраивать

Функция GET_BODY_CLASS() в WordPress

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

Основная информация

  • Версия: 2.8.0
  • Время выполнения: 1 раз — 0.000142 сек (бесплатно), 50000 раз — 2.53 сек (бесплатно) | PHP 7.0.2, WP 4.4.2

Хуки функции

  • body_class — хук, который позволяет добавлять дополнительные классы к элементу body.

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

Функция возвращает массив строк, содержащий имена классов.

Применение

Вы можете использовать функцию следующим образом:

get_body_class( $css_class );
  • $css_class (string|array) — строка или массив с названиями классов, которые вы хотите добавить к классу body.
  • По умолчанию: пустая строка ('').

Примеры использования

Пример 1: Получение классов по умолчанию

$body_class = get_body_class();
print_r( $body_class );

Вывод:

Array
(
    [0] => page
    [1] => page-id-19
    [2] => page-template-default
    [3] => logged-in
)

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

$body_class = get_body_class( 'my class' );
print_r( $body_class );

Вывод:

Array
(
    [0] => page
    [1] => page-id-19
    [2] => page-template-default
    [3] => logged-in
    [4] => my
    [5] => class
)

Пример 3: Использование хука body_class

Если вам нужно добавить роль пользователя к классам, которые выводятся через body_class(), можно сделать это следующим образом:

add_filter( 'body_class', function( $classes ) {
    if ( is_user_logged_in() ) {
        $classes[] = implode( ' ', wp_get_current_user()->roles );
    }
    return $classes;
} );

body_class();

Вывод:

class="page-id-19 page-template-default logged-in admin-bar no-customize-support administrator"

(где "administrator" добавляется в конец)

Заметки

  • Глобальная переменная. WP_Query. $wp_query — объект запроса WordPress.

Изменения

С версии 2.8.0. Функция была введена.

Код функции GET_BODY_CLASS()

Ниже приведён полный код функции get_body_class():

function get_body_class( $css_class = '' ) {
global $wp_query;

$classes = array();

if ( is_rtl() ) {
    $classes[] = 'rtl';
}

if ( is_front_page() ) {
    $classes[] = 'home';
}
if ( is_home() ) {
    $classes[] = 'blog';
}
if ( is_privacy_policy() ) {
    $classes[] = 'privacy-policy';
}
if ( is_archive() ) {
    $classes[] = 'archive';
}
if ( is_date() ) {
    $classes[] = 'date';
}
if ( is_search() ) {
    $classes[] = 'search';
    $classes[] = $wp_query->posts ? 'search-results' : 'search-no-results';
}
if ( is_paged() ) {
    $classes[] = 'paged';
}
if ( is_attachment() ) {
    $classes[] = 'attachment';
}
if ( is_404() ) {
    $classes[] = 'error404';
}

if ( is_singular() ) {
    $post      = $wp_query->get_queried_object();
    $post_id   = $post->ID;
    $post_type = $post->post_type;

    if ( is_page_template() ) {
        $classes[] = "{$post_type}-template";

        $template_slug  = get_page_template_slug( $post_id );
        $template_parts = explode( '/', $template_slug );

        foreach ( $template_parts as $part ) {
            $classes[] = "{$post_type}-template-" . sanitize_html_class( str_replace( array( '.', '/' ), '-', basename( $part, '.php' ) ) );
        }
        $classes[] = "{$post_type}-template-" . sanitize_html_class( str_replace( '.', '-', $template_slug ) );
    } else {
        $classes[] = "{$post_type}-template-default";
    }

    if ( is_single() ) {
        $classes[] = 'single';
        if ( isset( $post->post_type ) ) {
            $classes[] = 'single-' . sanitize_html_class( $post->post_type, $post_id );
            $classes[] = 'postid-' . $post_id;

            // Формат поста.
            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[] = 'single-format-' . sanitize_html_class( $post_format );
                } else {
                    $classes[] = 'single-format-standard';
                }
            }
        }
    }

    if ( is_attachment() ) {
        $mime_type   = get_post_mime_type( $post_id );
        $mime_prefix = array( 'application/', 'image/', 'text/', 'audio/', 'video/', 'music/' );
        $classes[]   = 'attachmentid-' . $post_id;
        $classes[]   = 'attachment-' . str_replace( $mime_prefix, '', $mime_type );
    } elseif ( is_page() ) {
        $classes[] = 'page';
        $classes[] = 'page-id-' . $post_id;

        if ( get_pages(
            array(
                'parent' => $post_id,
                'number' => 1,
            )
        ) ) {
            $classes[] = 'page-parent';
        }

        if ( $post->post_parent ) {
            $classes[] = 'page-child';
            $classes[] = 'parent-pageid-' . $post->post_parent;
        }
    }
} elseif ( is_archive() ) {
    if ( is_post_type_archive() ) {
        $classes[] = 'post-type-archive';
        $post_type = get_query_var( 'post_type' );
        if ( is_array( $post_type ) ) {
            $post_type = reset( $post_type );
        }
        $classes[] = 'post-type-archive-' . sanitize_html_class( $post_type );
    } elseif ( is_author() ) {
        $author    = $wp_query->get_queried_object();
        $classes[] = 'author';
        if ( isset( $author->user_nicename ) ) {
            $classes[] = 'author-' . sanitize_html_class( $author->user_nicename, $author->ID );
            $classes[] = 'author-' . $author->ID;
        }
    } elseif ( is_category() ) {
        $cat       = $wp_query->get_queried_object();
        $classes[] = 'category';
        if ( isset( $cat->term_id ) ) {
            $cat_class = sanitize_html_class( $cat->slug, $cat->term_id );
            if ( is_numeric( $cat_class ) || ! trim( $cat_class, '-' ) ) {
                $cat_class = $cat->term_id;
            }

            $classes[] = 'category-' . $cat_class;
            $classes[] = 'category-' . $cat->term_id;
        }
    } elseif ( is_tag() ) {
        $tag       = $wp_query->get_queried_object();
        $classes[] = 'tag';
        if ( isset( $tag->term_id ) ) {
            $tag_class = sanitize_html_class( $tag->slug, $tag->term_id );
            if ( is_numeric( $tag_class ) || ! trim( $tag_class, '-' ) ) {
                $tag_class = $tag->term_id;
            }

            $classes[] = 'tag-' . $tag_class;
            $classes[] = 'tag-' . $tag->term_id;
        }
    } elseif ( is_tax() ) {
        $term = $wp_query->get_queried_object();
        if ( isset( $term->term_id ) ) {
            $term_class = sanitize_html_class( $term->slug, $term->term_id );
            if ( is_numeric( $term_class ) || ! trim( $term_class, '-' ) ) {
                $term_class = $term->term_id;
            }

            $classes[] = 'tax-' . sanitize_html_class( $term->taxonomy );
            $classes[] = 'term-' . $term_class;
            $classes[] = 'term-' . $term->term_id;
        }
    }
}

if ( is_user_logged_in() ) {
    $classes[] = 'logged-in';
}

if ( is_admin_bar_showing() ) {
    $classes[] = 'admin-bar';
    $classes[] = 'no-customize-support';
}

if ( current_theme_supports( 'custom-background' )
    && ( get_background_color() !== get_theme_support( 'custom-background', 'default-color' ) || get_background_image() ) ) {
    $classes[] = 'custom-background';
}

if ( has_custom_logo() ) {
    $classes[] = 'wp-custom-logo';
}

if ( current_theme_supports( 'responsive-embeds' ) ) {
    $classes[] = 'wp-embed-responsive';
}

$page = $wp_query->get( 'page' );

if ( ! $page || $page < 2 ) {
    $page = $wp_query->get( 'paged' );
}

if ( $page && $page > 1 && ! is_404() ) {
    $classes[] = 'paged-' . $page;

    if ( is_single() ) {
        $classes[] = 'single-paged-' . $page;
    } elseif ( is_page() ) {
        $classes[] = 'page-paged-' . $page;
    } elseif ( is_category() ) {
        $classes[] = 'category-paged-' . $page;
    } elseif ( is_tag() ) {
        $classes[] = 'tag-paged-' . $page;
    } elseif ( is_date() ) {
        $classes[] = 'date-paged-' . $page;
    } elseif ( is_author() ) {
        $classes[] = 'author-paged-' . $page;
    } elseif ( is_search() ) {
        $classes[] = 'search-paged-' . $page;
    } elseif ( is_post_type_archive() ) {
        $classes[] = 'post-type-paged-' . $page;
    }
}

if ( ! empty( $css_class ) ) {
    if ( ! is_array( $css_class ) ) {
        $css_class = preg_split( '#s+#', $css_class );
    }
    $classes = array_merge( $classes, $css_class );
} else {
    // Гарантируем, что класс всегда будет массивом
    $css_class = array();
}

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

/**
 * Фильтрует список имен классов для CSS для текущего поста или страницы.
 * 
 * @since 2.8.0
 * 
 * @param string[] $classes   Массив имен классов body.
 * @param string[] $css_class Массив дополнительных имен классов, добавленных к body.
 */
$classes = apply_filters( 'body_class', $classes, $css_class );

return array_unique( $classes );

}

Теперь у вас есть понятное руководство по функции get_body_class(), которое поможет вам использовать её в ваших проектах на WordPress!

Leave a Reply

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