WooCommerce: автоматическое создание атрибутов и вариаций к товарам через код

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

Если в вашем WooCommerce-магазине сотни или тысячи товаров, ручное добавление атрибутов и вариаций занимает много времени и повышает риск ошибок. Автоматизация позволяет ускорить загрузку товаров и стандартизировать параметры, что особенно актуально при импорте или массовом обновлении каталога.

Подготовка: проверяем структуру атрибутов и вариаций в WooCommerce

В WooCommerce атрибуты создаются как таксономии (product_attribute), а вариации — дочерние продукты типа product_variation. Перед автоматизацией убедитесь, что у вас есть:

  • Определённые атрибуты в разделе Товары » Атрибуты (например, цвет, размер)
  • Правильный тип товара variable для продукта, к которому нужно добавить вариации

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

1. Создание или получение атрибута программно

Для работы с атрибутами используйте функции WooCommerce. Пример создания атрибута «Цвет» с терминами:

function create_product_attribute_and_terms() {
    global $wpdb;

    // Проверка, существует ли атрибут
    $attribute_name = 'pa_color'; // Префикс pa_ обязателен для атрибутов
    $attribute_label = 'Цвет';
    $attribute_slug = 'color';

    $attribute_id = wc_attribute_taxonomy_id_by_name( $attribute_slug );

    if ( ! $attribute_id ) {
        // Добавляем атрибут в базу
        $args = array(
            'attribute_label'   => $attribute_label,
            'attribute_name'    => $attribute_slug,
            'attribute_type'    => 'select',
            'attribute_orderby' => 'menu_order',
            'attribute_public'  => 1,
        );
        $attribute_id = wc_create_attribute( $args );

        // Регистрируем таксономию
        register_taxonomy(
            'pa_' . $attribute_slug,
            apply_filters( 'woocommerce_taxonomy_objects_' . 'pa_' . $attribute_slug, array( 'product' ) ),
            apply_filters( 'woocommerce_taxonomy_args_' . 'pa_' . $attribute_slug, array(
                'labels'       => array('name' => $attribute_label),
                'hierarchical' => true,
                'show_ui'      => false,
                'query_var'    => true,
                'rewrite'      => false
            ))
        );

        // Обновляем кэш
        delete_transient( 'wc_attribute_taxonomies' );
    }

    // Добавляем термины
    $terms = array('Красный', 'Синий', 'Зеленый');
    foreach ( $terms as $term_name ) {
        if ( ! term_exists( $term_name, $attribute_name ) ) {
            wp_insert_term( $term_name, $attribute_name );
        }
    }

    return $attribute_name;
}

2. Привязка атрибута к товару

Пример добавления атрибута к товару с ID 123 и подготовка вариаций:

function assign_attribute_to_product( $product_id, $attribute_name ) {
    $product = wc_get_product( $product_id );
    if ( ! $product || $product->get_type() !== 'variable' ) {
        return false; // Только для вариативных товаров
    }

    // Получаем все термины атрибута
    $terms = get_terms( array('taxonomy' => $attribute_name, 'hide_empty' => false) );
    if ( is_wp_error($terms) || empty($terms) ) {
        return false;
    }

    $options = array();
    foreach ( $terms as $term ) {
        $options[] = $term->slug;
    }

    $attributes = $product->get_attributes();

    $attributes[ $attribute_name ] = new WC_Product_Attribute();
    $attributes[ $attribute_name ]->set_id( wc_attribute_taxonomy_id_by_name( str_replace('pa_', '', $attribute_name) ) );
    $attributes[ $attribute_name ]->set_name( $attribute_name );
    $attributes[ $attribute_name ]->set_options( $options );
    $attributes[ $attribute_name ]->set_visible( true );
    $attributes[ $attribute_name ]->set_variation( true );

    $product->set_attributes( $attributes );
    $product->save();

    return true;
}

3. Создание вариаций с привязкой к терминам

Пример создания вариаций для каждого значения атрибута:

function create_variations_for_product( $product_id, $attribute_name ) {
    $product = wc_get_product( $product_id );
    if ( ! $product || $product->get_type() !== 'variable' ) {
        return false;
    }

    $terms = get_terms( array('taxonomy' => $attribute_name, 'hide_empty' => false) );
    if ( is_wp_error($terms) || empty($terms) ) {
        return false;
    }

    foreach ( $terms as $term ) {
        $variation_post = array(
            'post_title'  => $product->get_name() . ' – ' . $term->name,
            'post_name'   => 'product-' . $product_id . '-variation-' . $term->slug,
            'post_status' => 'publish',
            'post_parent' => $product_id,
            'post_type'   => 'product_variation',
            'menu_order'  => 0
        );

        $variation_id = wp_insert_post( $variation_post );

        if ( $variation_id ) {
            update_post_meta( $variation_id, '_price', '0' );
            update_post_meta( $variation_id, '_regular_price', '0' );
            update_post_meta( $variation_id, 'attribute_' . str_replace('pa_', '', $attribute_name), $term->slug );
        }
    }

    return true;
}

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

1. В админке WooCommerce откройте товар с ID, к которому применялся код. Вкладка «Атрибуты» должна содержать добавленный атрибут с нужными значениями и активированным флагом «Использовать для вариаций».

2. На вкладке «Вариации» появятся новые вариации с названиями, соответствующими терминам атрибута.

3. На фронтенде товара должны отображаться селекторы вариаций с возможностью выбора созданных опций.

4. Для автоматизации можно добавить отладочный вывод после вызовов функций или логировать результаты в файл.

Частые ошибки и их причины при автоматизации атрибутов и вариаций

  • Атрибут не появляется в списке вариаций: не установлен флаг set_variation(true) при создании атрибута.
  • Вариации не связаны с атрибутами: неверный префикс у метаполя вариации (должен быть attribute_ + slug атрибута без «pa_»).
  • Термины не созданы или не привязаны: термины должны существовать в таксономии атрибута перед созданием вариаций.
  • Тип товара не «variable»: операции работают только с вариативными товарами, проверьте тип через $product->get_type().
  • Кэш таксономий не обновлен: после создания атрибута вызовите delete_transient('wc_attribute_taxonomies'), иначе атрибут может не отобразиться.

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

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

Сравнение способов добавления атрибутов и вариаций в WooCommerce

МетодПлюсыМинусы
Ручное через админкуПростота, визуальный контрольМедленно, трудно масштабировать
Импорт CSV с атрибутамиМассовая загрузка, стандартный функционалСложный формат, ошибки при импорте
Автоматизация через PHP (описанный метод)Полный контроль, интеграция с другими процессамиТребует навыков разработки, риск ошибок без тестов
Автоматический анализ изображений в WordPress с помощью AI: практическое руководство
08.04.2026
Как оптимизировать работу AI-плагинов в WordPress
21.02.2026
WooCommerce: автоматическое удаление неактивных заказов через код
21.05.2026
WooCommerce: автоматическое удаление закрытых и неактивных заказов через код
31.05.2026
Как удалить старые медиа файлы из библиотеки WordPress
08.12.2025