WordPress как на ладони
wordpress jino

in_category() WP 2.2

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

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

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

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

Работает на основе: has_category(), has_term()
✈ 1 раз = 0.003672с = очень медленно | 50000 раз = 1.00с = очень быстро PHP 7.1.5, WP 4.8.1

Хуков нет.

Возвращает

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 Древовидная проверка принадлежности к термину

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

if( has_term( 11, 'taxonomy', $post->ID ) || post_is_in_descendant_term( 11, 'taxonomy', $post->ID ) ){
	// Текущая запись в термине 11 или в его дочернем термине
}

function post_is_in_descendant_term( $cats, $tax, $_post = null ){
	foreach ( (array) $cats as $cat ) {
		// get_term_children() accepts integer ID only
		$descendants = get_term_children( (int) $cat, $tax );
		if ( $descendants && has_term( $descendants, $tax, $_post ) )
			return true;
	}
	return false;
}

Код in category: wp-includes/category-template.php WP 4.8.2

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

	return has_category( $category, $post );
}

Cвязанные функции

Из метки: Условные теги (все)

Еще из раздела: Рубрики

in_category 25 комментариев
Полезные 3 Вопросы 2 Все
  • Евгений

    Добрый день, в файле single вручную добавлен баннер в виде изображения, например site.jpg. Данный баннер показывается сверху на всех записях сайта. Нужно сделать так, чтоб этот баннер не показывался на всех записях только из одной рубрики. Начинаю делать, не получается присобачить туда img с display none хотя бы. Помогите разобраться.

  • Миша cайт: dolinacoda.ru

    Громадное спасибо, все для таких чайников как я laugh

    1
  • Александр

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

Здравствуйте, !

Ваш комментарий