in_category()
Перевіряє, чи належить поточний (або вказаний) пост до зазначеної категорії (можна вказати кілька категорій). Умовний тег.
Перевіряється пряма приналежність посту до категорії, тобто. чи містить зазначена категорія поточний/вказаний пост. Якщо, наприклад, пост належить батьківській категорії або дочірній до зазначеної, функція поверне false.
Щоб перевірити ставлення посту до дерева категорій, використовуйте самописну функцію post_is_in_descendant_category() (див. приклад нижче).
Функцію можна використовувати:
- Всередині циклу WordPress.
- Або поза Цикла ВП, але тоді лише окремій сторінці запису – is_single() .
- Або можна використовувати будь-де, якщо вказати яку саме посаду потрібно перевірити.
(дуже повільно) | 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 або на сторінці посту.
Приклади
#1 Перевірка поточного поста всередині циклу WordPress.
in_category часто використовується всередині Цикл, щоб перевірити, чи належить пост до зазначеної категорії, якщо “так”, то зробити будь-які дії:
if ( in_category( 'pachyderms' ) ) { // дії, якщо пост належить до категорії 'pachyderms' } elseif ( in_category( [ '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 .
Для того щоб перевірити приналежність до дерева категорій, можна послідовно вказати в масиві всі назви категорій:
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 | Введено. |
З версії 2.7.0 | The $post parameter був added. |
Код in_category() in category WP 6.0.2
function in_category( $category, $post = null ) { if ( empty( $category ) ) { return false; } return has_category( $category, $post ); }