in_category

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

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

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

in_category() можно использовать внутри Цикла WordPress или за пределами Цикла WordPress, но на отдельной странице поста (single.php). Или можно использовать где угодно, если указать какой именно пост нужно проверить.

Хуков нет.

Возвращает

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

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

if( in_category( $category, $post ) ){
	// ...
}
$category(строка/массив/число) (обязательный)
ID, название или слаг (альтернативное название)  категории, которую нужно проверить принадлежит ли ей пост. Также можно указать вперемешку несколько параметров в массиве.
По умолчанию: нет
$post(число/объект)
ID или объект поста. По умолчанию текущий пост определяется автоматически внутри Цикла WordPress или на странице поста.
По умолчанию: нет

Примеры

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

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

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

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

#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();
	// ...
}

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

#4 Древовидная проверка принадлежности к термину

Проверим входит ли пост в термин произвольной таксономии (будем проверять и дочерние термины к указанному):

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

	return has_category( $category, $post );
}