Что такое коллекция атрибутов в WooCommerce и зачем она нужна
Коллекция атрибутов — это набор характеристик, которые можно назначить товарам для удобства фильтрации, поиска и управления. Обычно WooCommerce позволяет добавлять атрибуты по отдельности через админку, но если нужно создать группу атрибутов для определённой категории товаров — стандартных инструментов не хватает. В этой статье разберём, как программно создать и назначить коллекцию атрибутов, чтобы упростить работу с товарами без установки дополнительных плагинов.
Диагностика проблемы: почему стандартных атрибутов WooCommerce недостаточно
Проблема в том, что в WooCommerce атрибуты создаются индивидуально и не группируются в коллекции. При большом количестве товаров и характеристик это приводит к:
- сложному управлению;
- повышенному риску ошибок;
- ограничениям при выводе фильтров и сортировок.
Если вы хотите массово добавить один и тот же набор атрибутов к группе товаров, стандартный интерфейс не подходит — приходится вручную редактировать каждый товар или использовать сторонние плагины.
Пошаговое решение: программное добавление коллекции атрибутов и массовое назначение
1. Создаём набор атрибутов через код
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wphost_create_product_attributes_collection() {
$attributes = [
'material' => 'Материал',
'color' => 'Цвет',
'size' => 'Размер'
];
foreach ( $attributes as $slug => $name ) {
if ( ! taxonomy_exists( 'pa_' . $slug ) ) {
$args = array(
'slug' => $slug,
'name' => $name,
'type' => 'select',
'order_by' => 'menu_order',
'has_archives' => false,
);
wc_create_attribute( $args );
// Регистрируем таксономию для атрибута
register_taxonomy(
'pa_' . $slug,
array('product'),
array(
'labels' => array('name' => $name),
'hierarchical' => true,
'show_ui' => false,
'query_var' => true,
'rewrite' => false,
)
);
}
}
}
add_action( 'init', 'wphost_create_product_attributes_collection', 20 );Этот код создаёт три атрибута: материал, цвет, размер. Они будут доступны в админке WooCommerce в разделе Атрибуты.
2. Добавляем термины к атрибутам
Атрибуты без терминов бесполезны — нужно добавить значения. Сделаем это тоже через код:
function wphost_add_terms_to_attributes() {
$terms = [
'pa_material' => ['Хлопок', 'Полиэстер', 'Шерсть'],
'pa_color' => ['Красный', 'Синий', 'Зелёный'],
'pa_size' => ['S', 'M', 'L', 'XL'],
];
foreach ( $terms as $taxonomy => $term_names ) {
foreach ( $term_names as $term_name ) {
if ( ! term_exists( $term_name, $taxonomy ) ) {
wp_insert_term( $term_name, $taxonomy );
}
}
}
}
add_action( 'init', 'wphost_add_terms_to_attributes', 25 );3. Массово назначаем коллекцию атрибутов товарам из категории
Если нужно добавить эту коллекцию атрибутов всем товарам из определённой категории, используйте следующий код:
function wphost_assign_attributes_to_products() {
$category_slug = 'odezhda'; // замените на вашу категорию
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => $category_slug,
),
),
);
$products = get_posts( $args );
foreach ( $products as $product_post ) {
$product = wc_get_product( $product_post->ID );
$attributes = $product->get_attributes();
$new_attributes = array(
'pa_material' => array('Хлопок'),
'pa_color' => array('Красный'),
'pa_size' => array('M'),
);
foreach ( $new_attributes as $taxonomy => $terms ) {
$taxonomy_object = get_taxonomy( $taxonomy );
if ( ! $taxonomy_object ) continue;
$term_ids = array();
foreach ( $terms as $term_name ) {
$term = get_term_by( 'name', $term_name, $taxonomy );
if ( $term ) {
$term_ids[] = intval($term->term_id);
}
}
if ( ! empty( $term_ids ) ) {
wp_set_object_terms( $product->get_id(), $term_ids, $taxonomy, true );
// Обновляем данные атрибута для продукта
$attribute = new WC_Product_Attribute();
$attribute->set_id( wc_attribute_taxonomy_id_by_name( str_replace('pa_', '', $taxonomy) ) );
$attribute->set_name( $taxonomy );
$attribute->set_options( $term_ids );
$attribute->set_position(0);
$attribute->set_visible(true);
$attribute->set_variation(false);
$attributes[ $taxonomy ] = $attribute;
}
}
$product->set_attributes( $attributes );
$product->save();
}
}
add_action( 'init', 'wphost_assign_attributes_to_products', 30 );В этом примере всем товарам из категории с ярлыком odezhda добавляются выбранные термины атрибутов. Можно изменить значения и категорию под свои нужды.
Как проверить, что коллекция атрибутов добавлена и назначена правильно
- Перейдите в WooCommerce > Продукты > Атрибуты — должны появиться новые атрибуты с терминами.
- Откройте любой товар из заданной категории — в разделе атрибутов товара должны быть указанные значения.
- Проверьте на фронтенде: в карточке товара отобразятся новые характеристики (если тема поддерживает их отображение).
- В админке фильтрации товаров и в виджетах фильтров можно проверить работу атрибутов как фильтров.
Частые ошибки и способы их исправления
- Атрибуты не появляются в админке: убедитесь, что функция
wc_create_attribute()вызывается после инициализации WooCommerce (например, на хукеinitс приоритетом 20 или выше). - Термины не добавляются: проверьте корректность таксономий — атрибуты должны иметь префикс
pa_. - Атрибуты не отображаются на товарах: после изменения атрибутов вызовите метод
$product->save()для сохранения изменений. - Массовое назначение работает медленно: при большом количестве товаров используйте WP-CLI или разбивайте задания на части, чтобы избежать таймаутов.
Практические советы по безопасности и производительности
- Не размещайте код массового назначения атрибутов на постоянное выполнение — лучше временно активировать функцию и удалить после выполнения.
- Перед массовыми изменениями создайте резервную копию базы данных.
- Оптимизируйте количество атрибутов и терминов, чтобы не перегружать интерфейс и базу данных.
- Используйте транзиенты или пользовательские опции для отслеживания, что массовое назначение уже выполнено, чтобы избежать повторного запуска.
Сравнение подходов: плагин vs собственный код
| Критерий | Плагин | Собственный код | Компромисс |
|---|---|---|---|
| Гибкость | Ограничена функционалом плагина | Высокая — можно сделать под любые требования | Требует знаний PHP и WooCommerce API |
| Производительность | Может быть избыточным из-за общего кода | Оптимизирован под конкретную задачу | Необходимо тестировать и оптимизировать |
| Поддержка и обновления | Обновления и багфиксы от разработчиков | Самостоятельная поддержка | Подходит для небольших и уникальных задач |
| Риск конфликтов | Плагин может конфликтовать с другими | Меньше рисков при правильном коде | Код должен быть чистым и проверенным |