Категория товара нужна в коде чаще, чем кажется: подставить её в шаблон письма, показать в карточке заказа, сформировать условие для скидки или доставки, передать во внешнюю систему. Категории в WooCommerce — это обычная таксономия WordPress product_cat, поэтому получить их можно и стандартными функциями WordPress, и через объект товара. Ниже — рабочие варианты и подводные камни, о которых легко забыть: у товара может быть несколько категорий, их может не быть вовсе, а у вариации их нет никогда.
Способ 1: get_the_terms()
Базовая функция WordPress возвращает массив объектов WP_Term. Важно помнить, что при отсутствии категорий она вернёт false, а при ошибке — объект WP_Error, и перебирать такой результат циклом нельзя. Обёртка ниже всегда возвращает массив:
// Названия всех категорий товара; пустой массив, если категорий нет
function shop_get_product_cat_names( $product_id ) {
$terms = get_the_terms( $product_id, 'product_cat' );
if ( empty( $terms ) || is_wp_error( $terms ) ) {
return array();
}
return wp_list_pluck( $terms, 'name' );
}
$names = shop_get_product_cat_names( 256 ); // например: [ 'Светильники', 'Акция' ]
Для идентификаторов замените 'name' на 'term_id', для ярлыков — на 'slug'. Функция wp_list_pluck() вытаскивает одно поле из каждого объекта массива, так что отдельный цикл не нужен.
Способ 2: wc_get_product_terms()
У WooCommerce есть собственная обёртка, которая учитывает порядок категорий, заданный перетаскиванием в админке, и умеет сразу отдавать нужное поле:
$names = wc_get_product_terms( 256, 'product_cat', array( 'fields' => 'names' ) );
$ids = wc_get_product_terms( 256, 'product_cat', array( 'fields' => 'ids' ) );
$slugs = wc_get_product_terms( 256, 'product_cat', array( 'fields' => 'slugs' ) );
Результат — массив, при отсутствии категорий пустой. Если в шаблонах важно, чтобы категории шли в том же порядке, что и в админке, этот вариант предпочтительнее первого.
Способ 3: через объект товара
Когда объект товара уже есть под рукой — в хуках корзины, заказа, шаблонах — удобнее спросить его напрямую:
$product = wc_get_product( 256 );
if ( $product ) {
$cat_ids = $product->get_category_ids(); // массив ID категорий, например [ 12, 47 ]
}
Метод возвращает только идентификаторы; название и ссылку по ID даст get_term( $id, 'product_cat' ) и get_term_link( $id, 'product_cat' ). Проверка if ( $product ) обязательна: для несуществующего ID функция wc_get_product() вернёт false.
Вариативные товары
Категории назначаются родительскому товару, а вариации их не имеют. Если в руках ID вариации — например, из строки заказа или корзины, — сначала поднимитесь к родителю:
$product = wc_get_product( $id );
if ( $product && $product->is_type( 'variation' ) ) {
$product = wc_get_product( $product->get_parent_id() );
}
$cat_ids = $product ? $product->get_category_ids() : array();
В строках заказа и корзины родительский ID доступен и без этого: в корзине это $item['product_id'], в заказе — $item->get_product_id(), тогда как ID вариации лежит в variation_id.
Когда нужна одна «главная» категория
У товара может быть несколько категорий, а в шаблоне часто нужна одна. Брать просто первую из массива — рабочий, но непредсказуемый вариант: порядок зависит от функции и настроек. Более осмысленные стратегии:
- Главная категория из Yoast SEO. Плагин хранит её в мета-поле
_yoast_wpseo_primary_product_cat, и это тот же выбор, который влияет на хлебные крошки и ЧПУ. - Самая глубокая категория. Если товар отмечен и в «Светильниках», и в «Светильники → Настольные», обычно нужна вложенная — она конкретнее.
function shop_get_primary_product_cat( $product_id ) {
// 1. Главная категория, выбранная в Yoast SEO
$primary_id = (int) get_post_meta( $product_id, '_yoast_wpseo_primary_product_cat', true );
if ( $primary_id ) {
$term = get_term( $primary_id, 'product_cat' );
if ( $term && ! is_wp_error( $term ) ) {
return $term;
}
}
// 2. Иначе — самая глубокая по вложенности
$terms = get_the_terms( $product_id, 'product_cat' );
if ( empty( $terms ) || is_wp_error( $terms ) ) {
return null;
}
$deepest = null;
$max = -1;
foreach ( $terms as $term ) {
$depth = count( get_ancestors( $term->term_id, 'product_cat' ) );
if ( $depth > $max ) {
$max = $depth;
$deepest = $term;
}
}
return $deepest; // объект WP_Term или null
}
Функция возвращает объект термина, из которого берутся name, term_id, slug и ссылка через get_term_link( $term ). Если Yoast не установлен, мета-поле просто пустое, и срабатывает второй вариант.
Вывод списка категорий со ссылками
Если цель — показать категории на странице, не нужно собирать HTML вручную. WooCommerce делает это одной функцией:
echo wc_get_product_category_list( 256, ', ', '<span class="posted_in">Категории: ', '</span>' );
Именно её WooCommerce использует в блоке «Категории» на странице товара: она возвращает готовый список ссылок с нужным разделителем и обёрткой.
Коротко
Для списка категорий по ID товара используйте wc_get_product_terms() или get_the_terms() с проверкой на false и WP_Error; при наличии объекта товара — get_category_ids(). Для вариации сначала берите родителя. А когда нужна одна категория, определите заранее, какая считается главной: из Yoast или самая вложенная.
Частые вопросы
Если у товара нет категорий, функция возвращает false, а при ошибке — WP_Error, а не массив. Перед перебором проверяйте empty() и is_wp_error() или используйте wc_get_product_terms(), которая всегда отдаёт массив.
У вариаций категорий нет — они задаются родительскому товару. Получите его ID через $product->get_parent_id() или возьмите product_id из строки корзины или заказа и запрашивайте категории у него.
get_term_link( $term_id, 'product_cat' ) вернёт URL категории по её ID или объекту. Для готового списка со ссылками на странице есть wc_get_product_category_list().
Если стоит Yoast SEO — ту, что выбрана как основная (мета-поле _yoast_wpseo_primary_product_cat). Иначе разумный выбор — самая вложенная категория, она конкретнее родительской.
Источники
- 1.get_the_terms — WordPress Developer Referencehttps://developer.wordpress.org/reference/functions/get_the_terms/
- 2.wc_get_product_terms — WooCommerce Code Referencehttps://woocommerce.github.io/code-reference/namespaces/default.html#function_wc_get_product_terms
- 3.WC_Product::get_category_ids — WooCommerce Code Referencehttps://woocommerce.github.io/code-reference/classes/WC-Product.html#method_get_category_ids



