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 .

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

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.0The $post parameter був added.

Код in_category() WP 6.0.2

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

	return has_category( $category, $post );
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *