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

Список изменений

С версии 1.2.0 Введена.

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

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

	return has_category( $category, $post );
}

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

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

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

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

25 комментов
Полезные 4 Все
  • Миша dolinacoda.ru

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

    1
    Ответить2.9 года назад #
  • Есть небольшая проблема, post_is_in_descendant_category относится только к дочерним рубрикам, а к дочерним дочерних не относится, как это можно исправить?
    Пример:
    Есть рубрики:

    • папа 1
    • папа 2
      • дочь 1 - post_is_in_descendant_category тут работает
      • дочь 2 - post_is_in_descendant_category тут не работает
        • её сын 1 - post_is_in_descendant_category тут не работает
        • её сын 2 - post_is_in_descendant_category тут не работает
      • дочь 3 - post_is_in_descendant_category тут работает
    • папа 3

    Использую в шаблоне category.php

    get_header();
    $papa_id = get_cat_ID('папа2');
    if ( is_category( $papa_id ) || post_is_in_descendant_category( $papa_id ) ) {
    	include(TEMPLATEPATH.'/one-temp.php');
    }
    else {
    	include(TEMPLATEPATH.'/two-temp.php');
    }
    get_footer();
    Ответить3 мес назад #
    • Вопрос решен: в Функции нужно было поменять in_category на is_category и все работает smile

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