in_category()
Проверяет принадлежит ли текущий (или указанный) пост к указанной категории (можно указать несколько категорий). Условный тег.
Проверяется прямая принадлежность поста к категории, т.е. содержит ли указанная категория текущий/указанный пост. Если, например, пост принадлежит родительской категории или дочерней к указанной, то функция вернет false.
Чтобы проверить отношение поста к дереву категорий используйте самописную функцию post_is_in_descendant_category() (пример ниже).
Функцию можно использовать:
- Внутри Цикла WordPress.
- Или за пределами Цикла ВП, но тогда только на отдельной странице записи - is_single().
- Или можно использовать где угодно, если указать какой именно пост нужно проверить.
Хуков нет.
Возвращает
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. Но 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 | Введена. |
| С версии 2.7.0 | The $post parameter was added. |
Код in_category() in category WP 6.9.4
function in_category( $category, $post = null ) {
if ( empty( $category ) ) {
return false;
}
return has_category( $category, $post );
}