WooCommerce: автоматическое изменение атрибутов товаров при обновлении заказа

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

В WooCommerce часто возникает необходимость автоматически менять атрибуты товаров (например, цвет, размер, статус) при обновлении статуса заказа или изменении его параметров. Например, при переходе заказа в статус «в обработке» нужно обновить атрибут «Статус упаковки» у товаров. Стандартных настроек WooCommerce для такой автоматизации нет, поэтому требуется кастомный код.

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

1. Определяем, в каком событии менять атрибуты

Для отслеживания изменения заказа используется хук woocommerce_order_status_changed. Он передает ID заказа, старый и новый статусы.

2. Получаем товары из заказа

Используем объект WC_Order и метод get_items().

3. Меняем атрибуты товаров программно

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

add_action('woocommerce_order_status_changed', 'update_product_attributes_on_order_status_change', 10, 4);
function update_product_attributes_on_order_status_change($order_id, $old_status, $new_status, $order) {
    // Целевой статус, при переходе на который меняем атрибуты
    if ($new_status !== 'processing') {
        return;
    }

    foreach ($order->get_items() as $item_id => $item) {
        $product_id = $item->get_product_id();
        $variation_id = $item->get_variation_id();

        // Работаем только с вариациями
        if (!$variation_id) {
            continue;
        }

        $variation = wc_get_product($variation_id);
        if (!$variation) {
            continue;
        }

        // Получаем текущие атрибуты вариации
        $attributes = $variation->get_attributes();

        // Меняем атрибут, например, 'pa_pack-status' на 'Упаковано'
        $attributes['pa_pack-status'] = 'upakovo'; // slug термина атрибута

        // Обновляем атрибуты вариации
        $variation->set_attributes($attributes);
        $variation->save();
    }
}

4. Где найти slug атрибута

Slug атрибута можно посмотреть в админке WooCommerce: Товары - Атрибуты - нужный атрибут (например, «Статус упаковки») — slug в колонке «Ярлык» начинается с pa_.

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

  1. Создайте заказ с товаром-вариацией, у которого есть атрибут «Статус упаковки».
  2. Переведите заказ в статус «в обработке».
  3. Проверьте в админке товаров, изменился ли атрибут вариации на «Упаковано» (или на то, что вы указали).
  4. Для проверки можно использовать var_dump или error_log внутри функции, чтобы убедиться, что хук срабатывает.

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

  • Атрибут не меняется: Проверьте, что вы меняете атрибут у вариации, а не у простого товара.
  • Неправильный slug атрибута: Используйте именно slug, который начинается с pa_, а не название атрибута на русском.
  • Изменения не сохраняются: Убедитесь, что вызывается $variation->save() после изменения атрибутов.
  • Изменение влияет на все товары: Помните, что изменение атрибутов вариации изменяет их глобально, а не только в рамках заказа. Для уникальных изменений стоит использовать метаданные заказа.

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

  • Изменение атрибутов вариаций глобально влияет на все заказы и отображение товара, поэтому убедитесь, что это действительно ваша бизнес-логика.
  • Для изменения данных только в рамках заказа лучше хранить нужные метаданные в самом заказе или позициях заказа ($item->update_meta_data()).
  • Для снижения нагрузки код выполняется только при переходе в конкретный статус.
  • Добавьте логирование ошибок в случае неудачного сохранения и используйте WP_DEBUG для отладки.

Альтернативные способы: сравнение подходов

МетодПлюсыМинусы
Изменение атрибутов вариации (код)Автоматизация, работает на уровне товараИзменения глобальные, влияет на все заказы
Хранение пользовательских метаданных в заказеИзменения локальны, безопасно для других заказовНе меняет отображение товара на сайте
Использование плагинов для кастомизации заказаГотовые решения, простота настройкиМожет нагружать сайт, ограниченная гибкость
Как добавить собственные поля в WordPress: пошаговое руководство
14.11.2025
Как удалить проблемные промышленные кэши в WordPress
12.04.2026
Автоматический импорт продуктов в WooCommerce через WP REST API
28.12.2025
Как добавить изображение в известку WordPress поста
18.02.2026
WooCommerce: как удалить отзывы только с определённых товаров
25.04.2026