WooCommerce: автоматическое создание категорий и товарных атрибутов из CSV файла

Диагностика проблемы: зачем автоматизировать создание категорий и атрибутов

При массовом импорте товаров в WooCommerce часто возникает задача не только добавить сами товары, но и автоматически создать необходимые категории и атрибуты, если их еще нет. Ручное добавление категорий и атрибутов через админку становится неэффективным при больших объемах данных. Автоматизация экономит время и минимизирует ошибки, особенно если категории и атрибуты меняются часто.

Анализ структуры CSV

Типичный CSV для импорта может содержать такие поля:

  • product_name – название товара;
  • category – название или путь категории (например, "Одежда/Футболки");
  • attributes – строка с атрибутами в формате Цвет:Красный|Размер:L;
  • и другие поля для описания товара.

Важно правильно распарсить категории и атрибуты, чтобы создать и связать их с товарами.

Пошаговое решение: автоматическое создание категорий и атрибутов из CSV

1. Загрузка и парсинг CSV файла

Используем PHP-функцию fgetcsv() для чтения файла построчно. Важно предусмотреть кодировку UTF-8 и корректное разделение полей.

function parse_csv_file($filepath) {
    $rows = [];
    if (($handle = fopen($filepath, 'r')) !== false) {
        $header = fgetcsv($handle, 0, ',');
        while (($data = fgetcsv($handle, 0, ',')) !== false) {
            $rows[] = array_combine($header, $data);
        }
        fclose($handle);
    }
    return $rows;
}

2. Создание категорий

Категории могут быть вложенными, например, "Одежда/Футболки". Нужно разложить путь по уровням и создать категории, если они не существуют.

function create_category_hierarchy($category_path) {
    $categories = explode('/', $category_path);
    $parent_id = 0;
    foreach ($categories as $cat_name) {
        $term = get_term_by('name', $cat_name, 'product_cat', ARRAY_A);
        if (!$term) {
            $new_term = wp_insert_term($cat_name, 'product_cat', ['parent' => $parent_id]);
            if (is_wp_error($new_term)) {
                // Обработка ошибки
                return false;
            }
            $parent_id = $new_term['term_id'];
        } else {
            $parent_id = $term['term_id'];
        }
    }
    return $parent_id; // ID самой глубокой категории
}

3. Создание товарных атрибутов и терминов атрибутов

WooCommerce хранит атрибуты в таксономиях формата pa_{slug}. Если атрибут не создан, создаем его через wc_create_attribute(). Далее создаем термины (значения) атрибутов, если отсутствуют.

function create_attribute_and_terms($attributes_str) {
    $attributes = explode('|', $attributes_str);
    foreach ($attributes as $attr_pair) {
        list($name, $value) = explode(':', $attr_pair);
        $slug = wc_sanitize_taxonomy_name($name);
        $attribute = wc_get_attribute_taxonomy_by_name($slug);
        // Создаем атрибут, если не существует
        if (!$attribute) {
            $attribute_id = wc_create_attribute([
                'name' => $name,
                'slug' => $slug,
                'type' => 'select',
                'order_by' => 'menu_order',
                'has_archives' => false,
            ]);
            if (is_wp_error($attribute_id)) {
                continue; // пропускаем при ошибке
            }
            // Регистрируем таксономию атрибута
            register_taxonomy('pa_' . $slug, ['product'], [
                'hierarchical' => true,
                'show_ui' => false,
                'query_var' => true,
                'rewrite' => false,
            ]);
        }
        $term = term_exists($value, 'pa_' . $slug);
        if (!$term) {
            wp_insert_term($value, 'pa_' . $slug);
        }
    }
}

4. Привязка категорий и атрибутов к товару

После создания категорий и атрибутов получаем их ID и таксономии и прикрепляем к товару через wp_set_object_terms().

$product_id = wp_insert_post([...]); // добавление товара

// Категории
$cat_id = create_category_hierarchy($row['category']);
if ($cat_id) {
    wp_set_object_terms($product_id, [$cat_id], 'product_cat');
}

// Атрибуты
create_attribute_and_terms($row['attributes']);

// Для каждого атрибута
$attributes = explode('|', $row['attributes']);
$attr_data = [];
foreach ($attributes as $attr_pair) {
    list($name, $value) = explode(':', $attr_pair);
    $slug = wc_sanitize_taxonomy_name($name);
    $attr_data['pa_' . $slug] = [$value];
}
foreach ($attr_data as $taxonomy => $terms) {
    wp_set_object_terms($product_id, $terms, $taxonomy);
}

Проверка результата после внедрения

1. В админке WooCommerce откройте раздел "Товары" и убедитесь, что у товаров появились нужные категории и атрибуты.

2. В разделе "Товары > Категории" и "Товары > Атрибуты" проверьте наличие созданных категорий и терминов атрибутов.

3. Используйте SQL-запрос или WP CLI для выборки товаров с нужными категориями и атрибутами для контроля целостности данных.

Частые ошибки и как исправить

  • Ошибка создания атрибута: попытка создать атрибут с именем, уже занятым в другой таксономии. Используйте уникальные имена и проверяйте существование через wc_get_attribute_taxonomy_by_name().
  • Неправильное разбиение строки атрибутов: ошибки при парсинге строки с атрибутами ведут к пропуску значений. Используйте строгую валидацию и обработку ошибок при разборе CSV.
  • Проблемы с кодировкой CSV: UTF-8 без BOM необходим для корректного чтения русских символов. Используйте редакторы, поддерживающие правильную кодировку.
  • Неактивные таксономии: после динамического создания атрибутов может потребоваться перезагрузка таксономий или сброс пермалинков через админку.

Практические советы по безопасности и производительности

  • Обрабатывайте CSV-поток частями, чтобы избежать превышения лимитов памяти и времени выполнения.
  • Проверяйте права пользователя, запускающего импорт, чтобы предотвратить несанкционированные изменения.
  • Кэшируйте результаты поиска категорий и атрибутов при импорте, чтобы уменьшить количество запросов к базе.
  • Для больших каталогов рассмотрите использование WP CLI скриптов для пакетного импорта.
  • Перед массовым импортом всегда делайте резервную копию базы данных.

Сравнение вариантов импорта категорий и атрибутов

МетодПлюсыМинусы
Ручное создание через админкуПростота, нет кодаМного времени, риск ошибки при больших объемах
Импорт через плагины (например, WP All Import)Удобный интерфейс, поддержка атрибутовПлатные версии, ограничение в кастомизации
Кастомный PHP-скрипт (как в статье)Полный контроль, гибкость, бесплатностьТребует программирования, отладка
Автоматическое удаление старых заказов в WordPress: практическое руководство
08.12.2025
WooCommerce: автоматическое удаление заказов по неоплаченному статусу
17.05.2026
Как создать собственный вид регистрации в WordPress с примерами кода
10.11.2025
Как создать автоматический отчет по аналитике заказов в WordPress
10.01.2026
WooCommerce: как использовать хуки для добавления собственного контента в страницу заказа
25.04.2026