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