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.7.1
function in_category( $category, $post = null ) { if ( empty( $category ) ) { return false; } return has_category( $category, $post ); }