Как правильно добавить кастомную таксономию в WordPress: пошаговый гайд

white and blue printer paper

Введение

Кастомные таксономии позволяют группировать контент по произвольным признакам, выходя за рамки стандартных категорий и меток. Правильная регистрация и настройка таксономии повышает 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 к высокой нагрузке.

Заключение

Кастомные таксономии – мощный инструмент, который при правильной реализации улучшает структуру сайта, ускоряет поиск и открывает новые возможности для дизайна. Следуйте рекомендациям из этой статьи, используйте метаполя для хранения дополнительной информации и не забывайте о кешировании при высокой нагрузке.

❓ Часто задаваемые вопросы

Можно ли добавить таксономию к нескольким типам записей одновременно?

Да, в параметре 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 для вывода нужных полей.