WooCommerce

Как программно получить категорию товара WooCommerce по его ID

M
Markabus
·
Фотореалистичный кадр сортировочного стола склада: три открытых крафтовых ящика с пустыми бирками, в среднем — настольная лампа с картонной биркой со штрихкодом на бечёвке, рядом смартфон с экраном редактирования товара, где в дереве категорий отмечена одна галочка — иллюстрация к статье о том, как получить категорию товара WooCommerce по его ID.

Категория товара нужна в коде чаще, чем кажется: подставить её в шаблон письма, показать в карточке заказа, сформировать условие для скидки или доставки, передать во внешнюю систему. Категории в 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 или самая вложенная.

Частые вопросы

Q.Почему get_the_terms() вызывает ошибку в цикле foreach?

Если у товара нет категорий, функция возвращает false, а при ошибке — WP_Error, а не массив. Перед перебором проверяйте empty() и is_wp_error() или используйте wc_get_product_terms(), которая всегда отдаёт массив.

Q.Как получить категорию вариации товара?

У вариаций категорий нет — они задаются родительскому товару. Получите его ID через $product->get_parent_id() или возьмите product_id из строки корзины или заказа и запрашивайте категории у него.

Q.Как получить ссылку на категорию товара?

get_term_link( $term_id, 'product_cat' ) вернёт URL категории по её ID или объекту. Для готового списка со ссылками на странице есть wc_get_product_category_list().

Q.Какую категорию считать главной, если их несколько?

Если стоит Yoast SEO — ту, что выбрана как основная (мета-поле _yoast_wpseo_primary_product_cat). Иначе разумный выбор — самая вложенная категория, она конкретнее родительской.

Источники

Предыдущая
Как убрать последний элемент из хлебных крошек WooCommerce
Следующая
Как скрыть кнопку «Обновить корзину» в WooCommerce и обновлять корзину автоматически

Читайте также

Фотореалистичный кадр стола приёмки товара: кожаный рюкзак стоит на почтовых весах, вдоль него растянута жёлтая рулетка, рядом штангенциркуль и крафтовая бирка со штрихкодом, слева монитор с админской карточкой товара — длинная форма с вкладками и полями — иллюстрация к статье о получении всех данных товара WooCommerce по его ID.WooCommerce
12 сентября 2026 г.

Как получить все данные товара WooCommerce по его ID: объект WC_Product и его методы

Название, цена, остаток, вес, картинки, атрибуты, произвольные поля — всё это отдаёт объект товара, который возвращает wc_get_product(). Шпаргалка по методам WC_Product по группам, разница между типами товаров, работа с вариациями, датами и ценами, а также способ получить все данные разом.

Читать →
Фотореалистичный кадр рабочего стола: на переднем плане проволочная магазинная корзинка с серым керамическим чайником на упаковочной бумаге, за ней открытый ноутбук с карточкой того же чайника, где под ценой контурная кнопка с иконкой корзины и стрелкой вместо обычной кнопки покупки — иллюстрация к статье о замене кнопки «В корзину» на «Перейти в корзину» для товаров, уже добавленных в корзину WooCommerce.WooCommerce
12 сентября 2026 г.

Кнопка «Перейти в корзину» вместо «В корзину», если товар уже добавлен: WooCommerce без правки шаблонов

Покупатель уже положил товар в корзину, а карточка по-прежнему предлагает «В корзину» — так появляются случайные дубли. Показываем, как заменить кнопку на «Перейти в корзину» для товаров, которые уже в корзине: хуками, без правки шаблонов, в карточке товара и в каталоге, с учётом Ajax-добавления и кеширования страниц.

Читать →
Фотореалистичный кадр сверху на прилавок небольшой лавки: планшет в подставке со страницей корзины, где у средней строки выделено поле количества, а блок итогов полупрозрачный с кольцом загрузки и под таблицей пустое место без кнопок, рядом плетёная корзинка с мылом, свечами и банкой джема, слева крафтовые пакеты и бечёвка — иллюстрация к статье о скрытии кнопки «Обновить корзину» и автообновлении корзины WooCommerce.WooCommerce
12 сентября 2026 г.

Как скрыть кнопку «Обновить корзину» в WooCommerce и обновлять корзину автоматически

Кнопка «Обновить корзину» — лишний шаг для покупателя: изменил количество, забыл нажать, и итог не пересчитался. Показываем, как заставить классическую корзину WooCommerce обновляться сама при изменении количества, спрятать кнопку одним CSS-правилом и почему в блочной корзине делать ничего не нужно.

Читать →