# Функция IN_CATEGORY() │ WP 1.2.0
Функция in_category()
позволяет проверить, принадлежит ли текущая запись к одной из заданных категорий.
Эта функция сравнивает заданные категории с ID категорий, именами и слагами (URL-адресами) текущей записи. Если категория задана в виде целого числа, то проверка будет осуществляться только по ID категорий.
**Важно:** В версиях WordPress до 2.5 не поддерживались имена категорий, а до 2.7 — слаги. В версиях до 2.7 можно было проверять только одну категорию: in_category( $single_category )
. До версии 2.7 данную функцию можно было использовать только в цикле WordPress. Начиная с версии 2.7, функцию можно использовать в любом месте, если указать ID записи или объект записи.
Для получения дополнительной информации об этой и подобных функциях обратитесь к статье о **Условных тегах** в Руководстве разработчика тем.
### Время выполнения функции
- 1 раз — 0.003672 сек (медленно)
- 50000 раз — 1.00 сек (быстро)
- PHP 7.1.5, WP 4.8.1
### Возвращаемое значение
Функция возвращает true
, если текущая запись принадлежит хотя бы к одной из заданных категорий.
## Использование
```php
in_category( $category, $post );
Параметры
$category
(int|string|int[]|string[]) — (обязательный) ID категории, ее имя, слаг или массив таких значений для проверки.$post
(int|WP_Post) — запись, которую нужно проверить.- По умолчанию: текущая запись.
Примеры использования
Пример 1: Проверка текущей записи в цикле WordPress
Эта функция часто используется внутри цикла, чтобы проверить, принадлежит ли запись к заданной категории, и если да — выполнить какое-то действие:
if ( in_category( 'пачyderms' ) ) {
// действия, если запись принадлежит категории 'пачyderms'
} elseif ( in_category( [ 'Тропические птицы', 'малые млекопитающие' ] ) ) {
// действия, если запись принадлежит категории 'Тропические птицы' или 'малые млекопитающие'
} else {
// если ни одно из предыдущих условий не выполнено
}
Совет: Лучший способ — задавать для проверки не имена, а ID категорий.
Пример 2: Проверка текущей записи вне цикла
На странице записи (обычно в файле single.php
) проверку можно выполнить вне цикла:
if ( in_category('фрукты') ) {
include 'single-fruit.php';
} elseif ( in_category('овощи') ) {
include 'single-vegetables.php';
} else {
// Цикл WordPress начинается ниже
if ( have_posts() ) : while ( have_posts() ) : the_post();
// ...
}
Пример 3: Проверка, принадлежит ли запись к текущей или вложенной категории
Иногда нам необходимо проверить, принадлежит ли запись к категории и ее подкатегориям. Например, если у нас есть ID категории 60, а запись принадлежит категории 70, которая является дочерней к категории 60. В таком случае in_category()
вернет false
, но иногда нам нужно, чтобы она вернула true
.
Чтобы проверить, принадлежит ли запись к категории и ее вложенным категориям, вы можете последовательно указать все имена категорий в массиве:
if( in_category( [ 'Малина', 'Яблоки', 'Бананы', 'Груши', 'Сливы' ] ) ) {
// Действие, если условие выполнено
}
Этот подход не совсем удобен: если мы добавим новую подкатегорию к категории «Фрукты», нам также нужно обновить массив для проверки.
Чтобы избежать таких проблем, можно использовать такую проверку:
// Проверка, принадлежит ли запись к категории "Фрукты" или любым вложенным категориям.
if (
in_category( 11 ) ||
post_is_in_descendant_category( 11 )
) {
// Здесь все "фрукты"
}
Еще один вариант, хоть и менее предпочтительный, — это указать имена:
$term = get_term_by( 'name', 'фрукты', 'category' );
$is_in_descendant = false;
if ( $term ) {
$is_in_descendant = post_is_in_descendant_category( $term->term_id );
}
Вот реализация функции post_is_in_descendant_category()
:
function post_is_in_descendant_category( $cats_ids, $_post = null ) {
foreach( (array) $cats_ids as $cat_id ) {
// get_term_children() принимает только ID в виде целого числа
$descendants = get_term_children( (int) $cat_id, 'category' );
if ( $descendants && in_category( $descendants, $_post ) ) {
return true;
}
}
return false;
}
Используйте для проверки, принадлежит ли запись к одной категории:
post_is_in_descendant_category( 25 );
Используйте для проверки, принадлежит ли запись к массиву родительских категорий или любым их подкатегориям:
post_is_in_descendant_category( [ 25, 28, 124, 297, 298, 299 ] );
Пример 4: Проверка на принадлежность к термину таксономии
Проверим, является ли запись частью термина пользовательской таксономии (также проверим дочерние термины к указанному):
if (
has_term( 11, 'taxonomy', $post->ID ) ||
post_is_in_descendant_term( 11, 'taxonomy', $post->ID )
) {
// Текущая запись в термине 11 или его дочернем термине
}
Функция post_is_in_descendant_term()
:
function post_is_in_descendant_term( $term_ids, $taxonomy = 'category', $post = null ) {
foreach( (array) $term_ids as $term_id ) {
$descendants = get_term_children( (int) $term_id, $taxonomy );
if( $descendants && has_term( $descendants, $taxonomy , $post ) ) {
return true;
}
}
return false;
}
Изменения
С версии 1.2.0. В версии 2.7.0 добавлен параметр $post
.
Код IN_CATEGORY()
function in_category( $category, $post = null ) {
if ( empty( $category ) ) {
return false;
}
return has_category( $category, $post );
}
Связанные функции
Условные теги:
cat_is_ancestor_of()
category_exists()
comments_open()
email_exists()
has_block()
has_category()
has_custom_header()
has_excerpt()
has_nav_menu()
has_post_thumbnail()
has_shortcode()
has_tag()
has_term()
have_comments()
have_posts()
Таксономии:
get_the_term_list()
single_tag_title()
single_term_title()
tag_description()
term_description()
the_taxonomies()
the_terms()
wp_generate_tag_cloud()
wp_tag_cloud()
Теперь вы знаете, как использовать функцию in_category()
для проверки принадлежности записи к категориям. Это полезная возможность, которая может значительно упростить управление контентом вашего сайта на WordPress.