in_category()WP 1.2.0

Проверяет принадлежит ли текущий (или указанный) пост к указанной категории (можно указать несколько категорий). Условный тег.

Проверяется прямая принадлежность поста к категории, т.е. содержит ли указанная категория текущий/указанный пост. Если, например, пост принадлежит родительской категории или дочерней к указанной, то функция вернет false.

Чтобы проверить отношение поста к дереву категорий используйте самописную функцию post_is_in_descendant_category() (см. пример ниже).

Функцию можно использовать:

  • Внутри Цикла WordPress.
  • Или за пределами Цикла ВП, но тогда только на отдельной странице записи - is_single().
  • Или можно использовать где угодно, если указать какой именно пост нужно проверить.
Работает на основе: has_category(), has_term()
1 раз — 0.003672 сек (очень медленно) | 50000 раз — 1.00 сек (очень быстро) | PHP 7.1.5, WP 4.8.1

Хуков нет.

Возвращает

true|false. true, если условие выполняется и false, если нет.

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

if( in_category( $category, $post ) ){
	// ...
}
$category(строка/массив/число) (обязательный)

ID, название или ярлык (slug) категории, которую нужно проверить принадлежит ли ей пост.

Можно указать несколько параметров в массиве вперемешку.

$post(число/объект)
ID или объект поста. По умолчанию текущий пост определяется автоматически внутри Цикла WordPress или на странице поста.

Примеры

0

#1 Проверка текущего поста внутри Цикла WordPress.

in_category часто используется внутри Цикла, чтобы проверить относится ли пост к указанной категории, если "да", то сделать какие-либо действия:

if ( in_category( 'pachyderms' ) ) {
	// действия, если пост относится к категории 'pachyderms'
}
elseif ( in_category( [ 'Tropical Birds', 'small-mammals' ] ) ) {
	// действия, если пост относится к одной из категорий 'Tropical Birds', 'small-mammals'
}
else {
	// если никакие из предыдущих условий не выполнены.
}

П.С. Лучше указывать не названия, а ID категории для проверок

0

#2 Проверка текущего поста за пределами Цикла.

На странице поста (обычно это файл шаблона single.php) проверку можно выполнять за пределами Цикла:

if ( in_category('fruit') ) {
	include 'single-fruit.php';
}
elseif ( in_category('vegetables') ) {
	include 'single-vegetables.php';
}
else {
	// Ниже начинается Цикл WordPress
	if ( have_posts() ) : while ( have_posts() ) : the_post();
	// ...
}
0

#3 Проверка принадлежности поста к текущей или вложенной в текущую категории

Бывают случаи, когда нужно проверить относиться ли пост к дереву категорий. Например, мы указываем в проверке ID категории 60, а пост принадлежит категории 70, которая является дочерней к категории 60. Но in_category() вернет в данном случае false, а иногда нужно чтобы вернула true.

Для того, чтобы проверить принадлежность к дереву категорий, можно последовательно указать в массиве все названия категорий:

if( in_category( array( 'Малина', 'Яблоки', 'Бананы', 'Груши', 'Сливы' ) )) {
	// Действие если выполнено условие
}

Такой подход проверки, совершенно не гибкий, потому что если мы добавим новую подкатегорию к категории "Фрукты", нам так же нужно будет добавить её и в массив, для проверки.

Чтобы избежать таких сложностей можно воспользоваться такой проверкой:

// Проверка принадлежности поста к категории "Фрукты" или любой вложенной в эту категорию категории.
if (
	in_category( 11 )
	||
	post_is_in_descendant_category( 11 )
) {
	// Здесь все "фрукты"
}

Также, менее желательный, но вариант - указать названия:

post_is_in_descendant_category( get_term_by( 'name', 'fruit', 'category' ) )

А вот сама функция post_is_in_descendant_category():

function post_is_in_descendant_category( $cats, $_post = null ){

	foreach( (array) $cats as $cat ){

		// get_term_children() accepts integer ID only
		$descendants = get_term_children( (int) $cat, 'category' );

		if( $descendants && in_category( $descendants, $_post ) ){
			return true;
		}
	}

	return false;
}
0

#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 The $post parameter was added.

Код in_category() WP 6.1.1

function in_category( $category, $post = null ) {
	if ( empty( $category ) ) {
		return false;
	}

	return has_category( $category, $post );
}