Как получить текущую таксономию в WordPress с помощью get_term_by()
В WordPress таксономии (например, категории или метки) часто используются для фильтрации контента и построения страниц архивов. Чтобы в шаблоне получить «текущую» таксономию (термин) — например, по slug из URL — удобно использовать функцию get_term_by(). Она возвращает объект WP_Term, из которого можно достать нужные свойства: имя, slug, описание и другие параметры.
Базовый пример: получение термина из текущего запроса
Предположим, у вас есть страница таксономии, и WordPress передаёт параметры через get_query_var(). Тогда получить термин можно так:
<?php
$taxonomy = get_term_by(
'slug',
get_query_var('term'),
get_query_var('taxonomy')
);
?>
Переменная $taxonomy будет содержать объект вида WP_Term. Пример структуры:
WP_Term Object
(
[term_id] => 11
[name] => Обувь
[slug] => vzuttya
[term_group] => 0
[term_taxonomy_id] => 11
[taxonomy] => wpsc_product_category
[description] => Обувь на все случаи жизни
[parent] => 0
[count] => 17
[filter] => raw
)
Как вывести свойства термина
Так как возвращается объект, свойства доступны через ->. Например:
<?php
if ( ! empty($taxonomy) && ! is_wp_error($taxonomy) ) {
echo '<strong>Имя:</strong> ' . esc_html($taxonomy->name) . '<br>';
echo '<strong>Slug:</strong> ' . esc_html($taxonomy->slug) . '<br>';
echo '<strong>Описание:</strong> ' . esc_html($taxonomy->description);
}
?>
Важно: всегда проверяйте, что термин действительно найден, и используйте экранирование (например, esc_html()) перед выводом.
Сигнатура функции get_term_by()
Функция принимает несколько параметров:
get_term_by( $field, $value, $taxonomy, $output, $filter );
$field (строка, обязательно) — по какому полю искать термин в базе.
$value (строка/число, обязательно) — значение, которое нужно найти.
$taxonomy (строка) — название таксономии (например, category, post_tag или ваша произвольная).
$output (строка) — формат возвращаемых данных: OBJECT, ARRAY_A, ARRAY_N.
$filter (строка) — тип фильтрации (по умолчанию raw).
По каким полям можно искать термин
В $field можно передать один из вариантов:
slug — поиск по slug (удобно для URL).
name — поиск по названию.
term_taxonomy_id — поиск по идентификатору связки термина и таксономии.
id — поиск по ID термина.
Пример: поиск по id (часто самый надёжный вариант)
Если у вас есть ID термина (например, из метаданных или из предыдущего запроса), лучше искать по id:
<?php
$term_id = 11;
$taxonomy_name = 'wpsc_product_category';
$term = get_term_by('id', $term_id, $taxonomy_name);
if ( $term && ! is_wp_error($term) ) {
echo '<h4>' . esc_html($term->name) . '</h4>';
}
?>
Так вы избегаете неоднозначностей, которые иногда возникают при поиске по name.
Параметр $output: объект или массив
По умолчанию функция возвращает объект (OBJECT). Но можно вернуть массив:
OBJECT — объект WP_Term.
ARRAY_A — ассоциативный массив.
ARRAY_N — индексированный массив.
Пример с ARRAY_A:
<?php
$term = get_term_by(
'slug',
get_query_var('term'),
get_query_var('taxonomy'),
'ARRAY_A'
);
if ( ! empty($term) ) {
echo '<strong>Имя:</strong> ' . esc_html($term['name']);
echo '<br><strong>Slug:</strong> ' . esc_html($term['slug']);
}
?>
Параметр $filter: как WordPress обработает поля
По умолчанию используется raw, то есть данные возвращаются без дополнительной фильтрации. Возможные варианты:
raw — просто возвращает значение.
edit — применяет esc_html() для description и esc_attr() для остальных полей.
db
slug
rss
attribute
js
На практике чаще всего достаточно raw, а экранирование делайте перед выводом в шаблоне.
Когда лучше использовать get_term() вместо get_term_by()
Есть важный нюанс: если вы ищете термин по id, результат обычно получается быстрее и предсказуемее. Кроме того, get_term() использует объектный кэш всегда, а get_term_by() при поиске не по ID может обращаться к базе напрямую, даже если кэш существует.
Если у вас есть возможность — используйте get_term() или передавайте в get_term_by() $field = 'id'.
Полный пример для шаблона: вывод заголовка и описания текущей таксономии
Ниже пример, который можно вставлять в шаблон (например, archive.php или шаблон таксономии). Он аккуратно обрабатывает ситуацию, когда термин не найден:
<?php
$taxonomy_slug = get_query_var('taxonomy');
$term_slug = get_query_var('term');
$term = get_term_by('slug', $term_slug, $taxonomy_slug);
if ( $term && ! is_wp_error($term) ) {
echo '<div class="list-group">';
echo '<div class="list-group-item">';
echo '<h4>' . esc_html($term->name) . '</h4>';
echo '</div>';
if ( ! empty($term->description) ) {
echo '<div class="list-group-item">';
echo '<div>' . wp_kses_post($term->description) . '</div>';
echo '</div>';
}
echo '</div>';
} else {
echo '<p>Термин не найден.</p>';
}
?>
Итоги
Чтобы получить текущую таксономию в WordPress, используйте get_term_by() и извлекайте данные из объекта WP_Term. Практические рекомендации простые:
- Ищите по
slug, если данные берутся из URL.
- Ищите по
id, если ID доступен — это надёжнее.
- Проверяйте результат на пустоту и
is_wp_error().
- Экранируйте вывод (например,
esc_html() или wp_kses_post() для описаний).
Если хотите, могу адаптировать пример под конкретную таксономию (например, category, post_tag или вашу кастомную) и под ваш шаблон (archive.php, single.php, кастомный page template).