Как правильно добавить кастомную таксономию в WordPress: пошаговый гайд
Введение
Кастомные таксономии позволяют группировать контент по произвольным признакам, выходя за рамки стандартных категорий и меток. Правильная регистрация и настройка таксономии повышает SEO, упрощает администрирование и открывает новые возможности для разработки тем и плагинов.
В этой статье мы разберём каждый этап: от register_taxonomy до вывода терминов в шаблонах, а также покажем, как добавить метаполя и использовать их в запросах.
Регистрация кастомной таксономии
Базовый пример
Для начала создаём функцию, которая будет привязываться к хуку init. В ней вызываем register_taxonomy с нужными аргументами.
function mytheme_register_genre_taxonomy() { $labels = array( 'name' => _x( 'Жанры', 'taxonomy general name', 'mytheme' ), 'singular_name' => _x( 'Жанр', 'taxonomy singular name', 'mytheme' ), 'search_items' => __( 'Искать жанры', 'mytheme' ), 'all_items' => __( 'Все жанры', 'mytheme' ), 'parent_item' => __( 'Родительский жанр', 'mytheme' ), 'parent_item_colon' => __( 'Родительский жанр:', 'mytheme' ), 'edit_item' => __( 'Редактировать жанр', 'mytheme' ), 'update_item' => __( 'Обновить жанр', 'mytheme' ), 'add_new_item' => __( 'Добавить новый жанр', 'mytheme' ), 'new_item_name' => __( 'Название нового жанра', 'mytheme' ), 'menu_name' => __( 'Жанры', 'mytheme' ), ); $args = array( 'hierarchical' => true, // как категории 'labels' => $labels, 'show_ui' => true, 'show_admin_column' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'genre' ), ); register_taxonomy( 'genre', array( 'post' ), $args ); } add_action( 'init', 'mytheme_register_genre_taxonomy' ); В примере мы создаём иерархическую таксономию genre для записей post. При необходимости замените post на любой кастомный тип записи.
Почему важно использовать i18n
Все строки переводятся функциями _x() и __(). Это упрощает локализацию сайта и делает ваш код готовым к международным проектам.
Иерархические vs плоские таксономии
WordPress поддерживает два типа таксономий:
- Иерархические – работают как категории, позволяют задавать родитель‑дочерние отношения.
- Плоские – аналогичны меткам, не имеют вложенности.
Выбор зависит от структуры контента. Если вам нужна древовидная классификация (например, «Жанр → Поджанр»), используйте 'hierarchical' => true. Для простых тегов задайте false.
Пример плоской таксономии
register_taxonomy( 'brand', 'product', array( 'hierarchical' => false, 'label' => __( 'Бренд', 'mytheme' ), 'rewrite' => array( 'slug' => 'brand' ), ) ); Эта таксономия пригодится в оптимизации WooCommerce, где бренды часто используют как фильтры.
Метаполя для таксономий
Начиная с WordPress 4.4, у таксономий появились собственные метаполя, аналогичные post_meta. Они хранятся в таблице wp_termmeta и позволяют добавить произвольные свойства к термину.
Регистрация метаполя
Для удобного ввода используем хук genre_add_form_fields (для формы добавления) и genre_edit_form_fields (для редактирования).
function mytheme_add_genre_meta_fields( $taxonomy ) {?> Выберите цвет, который будет отображаться в админке.
term_id, ‘genre_color’, true );?>
<input type="color" id="genre_color" name="genre_color" value="" />
<?php } add_action( ‘genre_edit_form_fields’, ‘mytheme_edit_genre_meta_fields’, 10, 2 ); function mytheme_save_genre_meta( $term_id ) { if ( isset( $_POST[‘genre_color’] ) ) { update_term_meta( $term_id, ‘genre_color’, sanitize_hex_color( $_POST[‘genre_color’] ) ); } } add_action( ‘created_genre’, ‘mytheme_save_genre_meta’ ); add_action( ‘edited_genre’, ‘mytheme_save_genre_meta’ );
Теперь каждый жанр имеет собственный цвет, который можно вывести в шаблонах.
Получение метаполя в запросах
Метаполя участвуют в WP_Term_Query через параметр meta_query:
$terms = get_terms( array( 'taxonomy' => 'genre', 'meta_query' => array( array( 'key' => 'genre_color', 'value' => '#ff0000', 'compare' => '=', ), ), ) ); Такой запрос полезен, когда нужно отобразить только термины с определённым цветом, например, в интеграции с BunnyCDN, где каждый регион может иметь свой цветовой маркер.
Шаблоны вывода и интеграция
WordPress ищет файлы шаблонов в следующем порядке: taxonomy-{taxonomy}-{term}.php → taxonomy-{taxonomy}.php → taxonomy.php → archive.php → index.php. Создайте отдельный файл taxonomy-genre.php, если хотите уникальное оформление для жанров.
Пример шаблона
<?php get_header();?> <main class="site-main"> <h1 class="page-title"> 'post', 'tax_query' => array( array( 'taxonomy' => 'genre', 'field' => 'slug', 'terms' => get_queried_object()->slug, ), ), ) ); if ( $posts->have_posts() ) : while ( $posts->have_posts() ) : $posts->the_post(); get_template_part( 'template-parts/content', get_post_format() ); endwhile; wp_reset_postdata(); else: echo '<p>Записей нет.</p>'; endif;?> </main> <?php get_footer();?> Шаблон использует метаполе genre_color для стилизации заголовка.
Связь с другими оптимизациями
Если ваш сайт обслуживает более 100 000 посетителей в день, не забудьте кешировать запросы к таксономиям. Подробнее о масштабировании читайте в статье Как подготовить WordPress к высокой нагрузке.
Заключение
Кастомные таксономии – мощный инструмент, который при правильной реализации улучшает структуру сайта, ускоряет поиск и открывает новые возможности для дизайна. Следуйте рекомендациям из этой статьи, используйте метаполя для хранения дополнительной информации и не забывайте о кешировании при высокой нагрузке.
📚 Читайте также:
- 🔗 Как подготовить WordPress к высокой нагрузке: 100 000 посетителей в день
- 🔗 Переход Apache → Nginx для WordPress: полное руководство и практические примеры
- 🔗 Elasticsearch + WordPress: полное руководство по настройке быстрого поиска (2026)
- 🔗 Оптимизация WooCommerce товары: ускоряем продуктовые страницы за 5 шагов
❓ Часто задаваемые вопросы
Можно ли добавить таксономию к нескольким типам записей одновременно?
Да, в параметре object_type функции register_taxonomy укажите массив типов, например: array('post','product').
Как сделать таксономию доступной в REST API?
Добавьте в аргументы register_taxonomy параметр 'show_in_rest' => true и при необходимости задайте rest_base.
Можно ли задать собственный slug для термина при сохранении?
Да, используйте фильтр term_link или задайте 'rewrite' => array('slug' => 'my-slug') при регистрации таксономии.
Как вывести список терминов с их метаполями в виде списка?
Получите термины через get_terms, а внутри цикла foreach используйте get_term_meta для вывода нужных полей.