Категории, метки и атрибуты
Товары группируют тремя способами: категории («Кружки», «Тарелки»), метки («подарок», «новинка») и атрибуты («Цвет: белый»). Всё это таксономии WordPress, а отдельное значение — категория «Кружки», цвет «белый» — называется термином.
Таксономии
| Что | Таксономия | Где в панели |
|---|---|---|
| Категории | product_cat | «Товары → Категории» |
| Метки | product_tag | «Товары → Метки» |
| Глобальный атрибут «Цвет» | pa_color | «Товары → Атрибуты» |
Создайте в панели категорию «Кружки» с ярлыком mugs и отнесите к ней кружку.
Категории товара
// wp-content/plugins/acme-shop/includes/products.php
add_action('woocommerce_single_product_summary', function () {
global $product;
$names = wc_get_product_terms($product->get_id(), 'product_cat', ['fields' => 'names']);
if ($names) {
echo '<p>Раздел: ' . esc_html(implode(', ', $names)) . '</p>';
}
}, 7);Функция wc_get_product_terms() возвращает термины товара в указанной таксономии. С параметром fields => names это массив названий, без него — массив объектов WP_Term с полями term_id, name, slug. Под названием товара появится строка «Раздел: Кружки».
Проверка категории
if (has_term('mugs', 'product_cat', $product->get_id())) {
echo '<p>Можно мыть в посудомоечной машине.</p>';
}Функция has_term() принимает ярлык, название или идентификатор термина. Так показывают блок только для товаров одной категории.
Привязка в коде
// wp-content/plugins/acme-shop/scripts/assign-category.php
$term = wp_insert_term('Тарелки', 'product_cat', ['slug' => 'plates']);
$product = wc_get_product(18);
$product->set_category_ids([$term['term_id']]);
$product->save();wp_insert_term() создаёт категорию и возвращает массив с её идентификатором. set_category_ids() заменяет список категорий товара. Для меток есть такая же пара get_tag_ids() и set_tag_ids().
Атрибуты: глобальные и собственные
Глобальный атрибут создают один раз в «Товары → Атрибуты» и используют у многих товаров; по нему можно фильтровать каталог. У атрибута с ярлыком color таксономия называется pa_color. Собственный атрибут вводят прямо в редакторе товара, и он существует только у этого товара.
Чтение атрибута
// wp-content/plugins/acme-shop/includes/products.php
add_action('woocommerce_single_product_summary', function () {
global $product;
$color = $product->get_attribute('pa_color');
if ($color !== '') {
echo '<p>Цвет: ' . esc_html($color) . '</p>';
}
}, 21);Метод get_attribute() возвращает значения строкой через запятую: «Белый, Синий». Он работает и для глобальных, и для собственных атрибутов. Массив значений глобального атрибута даёт wc_get_product_terms($product->get_id(), 'pa_color', ['fields' => 'names']).
Список категорий
$categories = get_terms([
'taxonomy' => 'product_cat',
'hide_empty' => true,
]);
foreach ($categories as $category) {
printf('<a href="%s">%s</a> ', esc_url(get_term_link($category)), esc_html($category->name));
}Код выводит ссылки на все категории, в которых есть товары. Такой блок удобно подключить к хуку woocommerce_before_shop_loop.
Частая ошибка
Глобальный атрибут ищут по имени без приставки: wc_get_product_terms($id, 'color') возвращает пустой массив. Таксономия атрибута всегда начинается с pa_. Точное имя видно в адресе страницы «Настроить термины» в «Товары → Атрибуты»: taxonomy=pa_color.