Функция IN_CATEGORY() в WordPress: проверка принадлежности записи к категориям

# Функция IN_CATEGORY() │ WP 1.2.0

Функция in_category() позволяет проверить, принадлежит ли текущая запись к одной из заданных категорий.

Эта функция сравнивает заданные категории с ID категорий, именами и слагами (URL-адресами) текущей записи. Если категория задана в виде целого числа, то проверка будет осуществляться только по ID категорий.

**Важно:** В версиях WordPress до 2.5 не поддерживались имена категорий, а до 2.7 — слаги. В версиях до 2.7 можно было проверять только одну категорию: in_category( $single_category ). До версии 2.7 данную функцию можно было использовать только в цикле WordPress. Начиная с версии 2.7, функцию можно использовать в любом месте, если указать ID записи или объект записи.

Для получения дополнительной информации об этой и подобных функциях обратитесь к статье о **Условных тегах** в Руководстве разработчика тем.

### Время выполнения функции

- 1 раз — 0.003672 сек (медленно)
- 50000 раз — 1.00 сек (быстро)
- PHP 7.1.5, WP 4.8.1

### Возвращаемое значение

Функция возвращает true, если текущая запись принадлежит хотя бы к одной из заданных категорий.

## Использование

```php
in_category( $category, $post );

Параметры

  • $category (int|string|int[]|string[]) — (обязательный) ID категории, ее имя, слаг или массив таких значений для проверки.
  • $post (int|WP_Post) — запись, которую нужно проверить.
    • По умолчанию: текущая запись.

Примеры использования

Пример 1: Проверка текущей записи в цикле WordPress

Эта функция часто используется внутри цикла, чтобы проверить, принадлежит ли запись к заданной категории, и если да — выполнить какое-то действие:

if ( in_category( 'пачyderms' ) ) {
    // действия, если запись принадлежит категории 'пачyderms'
} elseif ( in_category( [ 'Тропические птицы', 'малые млекопитающие' ] ) ) {
    // действия, если запись принадлежит категории 'Тропические птицы' или 'малые млекопитающие'
} else {
    // если ни одно из предыдущих условий не выполнено
}

Совет: Лучший способ — задавать для проверки не имена, а ID категорий.

Пример 2: Проверка текущей записи вне цикла

На странице записи (обычно в файле single.php) проверку можно выполнить вне цикла:

if ( in_category('фрукты') ) {
    include 'single-fruit.php';
} elseif ( in_category('овощи') ) {
    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( [ 'Малина', 'Яблоки', 'Бананы', 'Груши', 'Сливы' ] ) ) {
    // Действие, если условие выполнено
}

Этот подход не совсем удобен: если мы добавим новую подкатегорию к категории «Фрукты», нам также нужно обновить массив для проверки.

Чтобы избежать таких проблем, можно использовать такую проверку:

// Проверка, принадлежит ли запись к категории "Фрукты" или любым вложенным категориям.
if (
    in_category( 11 ) ||
    post_is_in_descendant_category( 11 )
) {
    // Здесь все "фрукты"
}

Еще один вариант, хоть и менее предпочтительный, — это указать имена:

$term = get_term_by( 'name', 'фрукты', 'category' );

$is_in_descendant = false;
if ( $term ) {
    $is_in_descendant = post_is_in_descendant_category( $term->term_id );
}

Вот реализация функции post_is_in_descendant_category():

function post_is_in_descendant_category( $cats_ids, $_post = null ) {
    foreach( (array) $cats_ids as $cat_id ) {
        // get_term_children() принимает только ID в виде целого числа
        $descendants = get_term_children( (int) $cat_id, 'category' );

        if ( $descendants && in_category( $descendants, $_post ) ) {
            return true;
        }
    }

    return false;
}

Используйте для проверки, принадлежит ли запись к одной категории:

post_is_in_descendant_category( 25 );

Используйте для проверки, принадлежит ли запись к массиву родительских категорий или любым их подкатегориям:

post_is_in_descendant_category( [ 25, 28, 124, 297, 298, 299 ] );

Пример 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 добавлен параметр $post.

Код IN_CATEGORY()

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

    return has_category( $category, $post );
}

Связанные функции

Условные теги:

  • cat_is_ancestor_of()
  • category_exists()
  • comments_open()
  • email_exists()
  • has_block()
  • has_category()
  • has_custom_header()
  • has_excerpt()
  • has_nav_menu()
  • has_post_thumbnail()
  • has_shortcode()
  • has_tag()
  • has_term()
  • have_comments()
  • have_posts()

Таксономии:

  • get_the_term_list()
  • single_tag_title()
  • single_term_title()
  • tag_description()
  • term_description()
  • the_taxonomies()
  • the_terms()
  • wp_generate_tag_cloud()
  • wp_tag_cloud()

Теперь вы знаете, как использовать функцию in_category() для проверки принадлежности записи к категориям. Это полезная возможность, которая может значительно упростить управление контентом вашего сайта на WordPress.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *