WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

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, название или ярлык (slug) категории, которую нужно проверить принадлежит ли ей пост.

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

$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 или в его дочернем термине
}

Функция 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;
}

Код in category: wp-includes/category-template.php VER 5.1.1

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

	return has_category( $category, $post );
}

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

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

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

Еще из тегов шаблона: Таксономии: рубрики, метки, ...

23 коммента
Полезные 3 Все
  • Димка

    Спасибо огромное! Долго искал что-то на подобии функции post_is_in_descendant_category и нашел у вас. И именно точно мне было нужно!

    Ответить7.3 лет назад #
  • ed. cайт: wot-shot.com

    "ткущую категории" - очепятка

    Ответить6.8 лет назад #
  • Zuenf

    Как узнать id текущей категории?

    Ответить6.5 лет назад #
    • Kama7376

      В админ-панели, на странице редактирования категорий, наводите мышь на ссылку "редактировать" и смотрите куда ведет УРЛ, там можно увидеть ID категории.

      Ответить5.3 лет назад #
  • Антон

    Здравствуйте. Сделал таким образом:

    <?php
    if ( in_category( '32' )) {
    	здесь текст и ссылка
    } else {
    	// если никакие из предыдущих условий не выполнены.
    }
    ?>

    32-это Id категории. После сохранения выбило ошибку:

    Parse error: syntax error, unexpected '}'

    Редактировал content-single.php

    Ответить5.2 лет назад #
    • Kama7376

      По этому коду все правильно, ошибок нет. Проверьте еще раз открывающие и закрывающие {}

      Ответить5.2 лет назад #
      • Антон

        Проверял и так, и так - разницы не было. Либо не работало, либо выдавало ошибку. Но на другом сайте уже нашел рабочую версию.

        Ответить5.2 лет назад #
  • Евгений

    Здравствуйте!
    Есть такой код:

    <?php if (in_category(array ('2', '3', '8', '16'))) { ?>

    Соответственно выводятся записи из указанных категорий. А если добавить новую категорию (рубрику), то автоматом записи уже не будут выводиться, пока не пропишешь вновь добавленную категорию.
    Вопрос: как с помощью этой функции вывести ВСЕ категории за исключением "Без рубрики", а не только прописанные мной? Спасибо.

    Ответить4.9 года назад #
    • WP_Panda158 cайт: wp-panda.com
      <?php if ( !in_category('1') ) { ?>

      где: 1 - id категории из которой выводить не надо

      Ответить4.9 года назад #
  • @ Артем

    Добрый день! Я так понимаю что in_category() не работает для таксономий? Подскажите пожалуйста какую функцию тогда использовать для произвольных типов записи, или как быть с этой функцией, дайте пожалуйста наводку куда копать, за ранее спасибо! smile

    Ответить4.7 года назад #
    • Kama7376

      Вам нужна функция has_term()

      Синтаксис:

      has_term( $term = '', $taxonomy = '', $post = null )

      Пример:

      if( has_term(array('comedy','history'), 'video', 59) )
      	echo "Запись с ID=59 имеет термины `comedy` и `history` в таксономии `video`";
      Ответить4.7 года назад #
      • @ Артем

        Спасибо Тимур! Я так понял что has_term() работает только с данной рубрикой? с родителем работать не хочет, я думаю что решение все же есть какое-то, только какое, не подскажите? Можно конечно в массив занести, но если добавить новые рубрики то их тоже нужно будет дописывать в массив, хотелось бы уже с родителем разобраться ))

        я пробовал условие типа:

        <?php if( has_term('child-category', 'ad_cat') || post_is_in_descendant_category( 18 ) ) {
        	echo "Запись имеет термин";
        } ?>

        но вот с || post_is_in_descendant_category( 8 ) вообще все ломается если условие ложное, но а если находится в рубрике child-category то все нормально, но зайти в другую подрубрику в родительской с ID 18 то все ломается smile

        У Вас есть какие-то идеи? Буду признателен)

        Ответить4.7 года назад #
        • Kama7376

          has_term() - это тоже самое что in_category().

          in_category() тоже не работает с родителями в описании написано же...

          Проверяется прямая принадлежность поста к категории, т.е. содержит ли указанная категория текущий/указанный пост. Если, например, пост принадлежит родительской категории или дочерней к указанной, то функция вернет false.
          rtfm Ответ на ваш вопрос уже есть! Вы просто не так думаете как-то. Используйте post_is_in_descendant_category(), только замените в коде этой функции in_category() - это же очевидно! ``` if( has_term( 11, 'taxonomy', $post->ID ) || post_is_in_descendant_term( 11, 'taxonomy' ) ){ // Текущая запись в термине 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; } ```
          Ответить4.7 года назад #
          • @ Артем

            Все спасибо большое, работает. Я так делал, но я же говорю что ломалось все, но я потом включил показ ошибок пхп и тут я понял что функция не определена, ну и ваш последний комментарий помог smile. Короче во всем виновата не внимательность и это точно rtfm
            Еще раз спасибо за подробный ответ smile

            Ответить4.7 года назад #
  • Александр

    Доброе время суток!
    Для слайдера у меня создана рубрика, в которой находятся записи с миниатюрами. Рубрика создана исключительно для слайдера, и мне бы не хотелось, чтобы она показывалась как обычная рубрика с постами. Можно ли сделать так, чтобы при открытии одной из этих записей, запрашивалась 404 страница и она же выводилась?

    Ответить4.7 года назад #
    • Kama7376

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

      Ответить4.7 года назад #
  • Ксения

    Безграничная благодарность вам за post_is_in_descendant_category - такое красивое решение. Спасибо.

    Ответить3 года назад #
  • Александр

    Приветствую.

    Мне нужно вывести класс ВО ВСЕХ публикациях в САМОМ НИЗУ статьи. Знаю как вывести класс в отдельно взятой категории.

    function my_class ($content){
    	if(in_category(8) && !is_page()) { // надо указать id рубрики
    		$menu_content = $content;
    		$menu_content .= 'свой класс'; // в одинарных кавычках указываем класс
    		return $menu_content;
    	}
    	else {
    		return $content;
    	}
    }
    add_filter('the_content', 'my_class');

    Подскажите как вывести во всех категориях?
    Заранее благодарен.

    Ответить2.8 года назад #
    • campusboy3301 cайт: www.youtube.com/c/wpplus

      Мне нужно вывести класс ВО ВСЕХ публикациях в САМОМ НИЗУ статьи.

      Подскажите как вывести во всех категориях?

      Так в публикациях или всё же в рубриках? Что подразумевается под публикациями: страницы или записи?

      Если надо во всех рубриках, то просто вместо in_category(8) впишите is_category().

      1
      Ответить2.8 года назад #
  • Роман

    только что произвел поиск по всем файлам вородпресса не нашёл "post_is_in_descendant_category" в ласт версии нет такой функиции как теперь проверяется то же самое?

    Ответить2.6 года назад #
    • Дмитрий К

      Обратите внимание на этот текст в статье:

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

      Ее нужно вставить в functions.php

      1
      Ответить2.5 года назад #
Здравствуйте, !     Войти . Зарегистрироваться