wpload.ru wordpress WPLoad.ru

WooCommerce: как массово изменить атрибуты товаров с помощью кода

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

В WooCommerce атрибуты товаров (например, цвет, размер, материал) используются для фильтрации, вариативных товаров и SEO. Часто возникает необходимость массово обновить атрибуты — например, изменить значение или добавить новый атрибут сразу для сотен товаров. Стандартный интерфейс WordPress и WooCommerce для этого не подходит, особенно при большом каталоге. Решение — написать кастомный PHP-скрипт, который обработает все нужные товары и обновит атрибуты программно.

Как проверить текущие атрибуты товара и понять структуру хранения

Атрибуты в WooCommerce хранятся как таксономии с префиксом pa_ (product attribute). Например, атрибут «Цвет» — это таксономия pa_color. Значения атрибутов — термины в этих таксономиях.

Чтобы увидеть атрибуты конкретного товара, можно использовать следующий код, вставленный в файл темы или плагина (например, в functions.php):

function print_product_attributes( $product_id ) {
    $product = wc_get_product( $product_id );
    if ( ! $product ) {
        echo 'Товар не найден';
        return;
    }
    $attributes = $product->get_attributes();
    foreach ( $attributes as $attribute ) {
        echo '<p>Имя атрибута: ' . $attribute->get_name() . '</p>';
        echo '<p>Значения: ' . implode( ', ', $attribute->get_options() ) . '</p>';
    }
}

// Используйте ID нужного товара
print_product_attributes( 123 );

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

Пошаговое решение: массовое обновление атрибутов товаров через WP-CLI или PHP-скрипт

Ниже пример скрипта, который добавит или заменит значение атрибута pa_color на «Красный» для всех товаров в категории с ID 20. Скрипт безопасно работает с вариативными и простыми товарами.

function wc_mass_update_product_attribute() {
    $args = array(
        'post_type'      => array('product', 'product_variation'),
        'posts_per_page' => -1,
        'tax_query'      => array(
            array(
                'taxonomy' => 'product_cat',
                'field'    => 'term_id',
                'terms'    => 20,
            ),
        ),
        'fields' => 'ids',
    );

    $products = get_posts( $args );

    if ( empty( $products ) ) {
        echo 'Товары не найдены.';
        return;
    }

    // Проверяем, существует ли термин 'красный' в pa_color
    $term = get_term_by( 'name', 'Красный', 'pa_color' );
    if ( ! $term ) {
        $term = wp_insert_term( 'Красный', 'pa_color' );
        if ( is_wp_error( $term ) ) {
            echo 'Ошибка при создании термина Красный';
            return;
        }
        $term_id = $term['term_id'];
    } else {
        $term_id = $term->term_id;
    }

    foreach ( $products as $product_id ) {
        // Удаляем старые термины атрибута
        wp_set_object_terms( $product_id, (int) $term_id, 'pa_color', false );

        // Обновляем метаданные атрибутов товара
        $product_attributes = get_post_meta( $product_id, '_product_attributes', true );
        if ( ! is_array( $product_attributes ) ) {
            $product_attributes = array();
        }
        $product_attributes['pa_color'] = array(
            'name'         => 'pa_color',
            'value'        => '',
            'position'     => 0,
            'is_visible'   => 1,
            'is_variation' => 0,
            'is_taxonomy'  => 1,
        );
        update_post_meta( $product_id, '_product_attributes', $product_attributes );
    }

    echo 'Атрибуты успешно обновлены для ' . count( $products ) . ' товаров.';
}

// Запуск функции (например, по хуку admin_init)
add_action( 'admin_init', 'wc_mass_update_product_attribute' );

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

Как проверить результат после массового обновления атрибутов

  • Зайдите в админку WooCommerce, откройте редактирование товара из обработанных.
  • Проверьте, что атрибут Цвет теперь содержит значение «Красный» и отображается в свойствах.
  • На фронтенде товара должен появиться этот атрибут в блоке описания или в фильтрах (если настроены).
  • Для вариативных товаров проверьте, что вариации обновились корректно и отображаются без ошибок.

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

  • Атрибут не отображается после обновления
    Проверьте, что в _product_attributes массивах правильно выставлены ключи is_visible и is_taxonomy. Если атрибут вариативный, is_variation должен быть 1.
  • Термин атрибута не создаётся
    Убедитесь, что таксономия pa_color зарегистрирована. Если нет, зарегистрируйте атрибут через WooCommerce в админке или программно.
  • Изменения не сохраняются
    Проверьте права доступа и используйте правильные хуки для запуска кода. Не запускайте обновление на каждом запросе без условий.

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

  • Для больших каталогов используйте WP-CLI вместо запуска скрипта через админку: wp eval-file update-attributes.php. Это быстрее и безопаснее.
  • Делайте резервные копии базы данных перед массовыми изменениями.
  • Добавьте логирование в скрипт, чтобы отслеживать ошибки и прогресс.
  • Ограничивайте запуск функции условием, например, проверкой параметра URL или роли пользователя.
  • Используйте транзакции базы данных, если возможно, чтобы избежать частичных обновлений.

Таблица сравнения способов массового изменения атрибутов

МетодПреимуществаНедостатки
Ручное изменение в админкеПростота, нет кодаНизкая скорость, подходит только для небольшого числа товаров
Плагины массового редактированияУдобный интерфейс, дополнительные функцииМожет замедлить сайт, нужны лицензии, ограниченная гибкость
Кастомный PHP-скрипт (как в статье)Максимальная гибкость, можно автоматизироватьТребует навыков, риск ошибок без тестирования
×
Прокачай свой WordPress!

Скидка -20% на премиум темы и плагины

Воспользоваться сейчас ⋙