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

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

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

Пошаговое решение: использование хука woocommerce_product_get_attributes

1. Выбор правильного хука

Для изменения атрибутов товара на лету подойдет фильтр woocommerce_product_get_attributes. Он позволяет перехватывать массив атрибутов перед отображением или использованием.

2. Пример кода для добавления или изменения атрибута

add_filter('woocommerce_product_get_attributes', 'wpcontent_modify_product_attributes', 10, 2);
function wpcontent_modify_product_attributes($attributes, $product) {
    // Проверяем категорию товара
    if (has_term('special-category', 'product_cat', $product->get_id())) {
        // Создаем новый атрибут цвет
        $new_attr = new WC_Product_Attribute();
        $new_attr->set_id(0); // 0 означает пользовательский атрибут
        $new_attr->set_name('Цвет');
        $new_attr->set_options(['Красный', 'Синий']);
        $new_attr->set_position(1);
        $new_attr->set_visible(true);
        $new_attr->set_variation(false);

        // Добавляем или заменяем атрибут
        $attributes['pa_color'] = $new_attr;
    }
    return $attributes;
}

Этот код проверяет, принадлежит ли товар к категории special-category, и если да — добавляет атрибут "Цвет" с двумя вариантами.

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

  • Откройте страницу товара из категории special-category в админке и на сайте.
  • В админке атрибут может не отображаться, так как меняется динамически. На фронтенде в описании товара или в выпадающих списках вариаций должен появиться новый атрибут.
  • Для проверки можно вывести print_r($attributes) внутри функции и посмотреть, что атрибуты изменяются.

Частые ошибки и причины

  • Неправильный идентификатор атрибута: для пользовательских атрибутов всегда ставьте set_id(0), иначе WooCommerce ищет термин из таксономии.
  • Отсутствие проверки категории: функция применится ко всем товарам, что может привести к нежелательным изменениям.
  • Атрибуты не видны на фронтенде: убедитесь, что set_visible(true) и что атрибуты не конфликтуют с вариациями.

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

  • Избегайте тяжелых запросов в фильтрах — используйте кэширование, если необходимо.
  • Не меняйте атрибуты в хуках, которые вызываются на каждой загрузке страницы без условий.
  • Всегда проверяйте, что $product — это объект WC_Product.

Сравнение способов автоматического изменения атрибутов

МетодПлюсыМинусы
Использование woocommerce_product_get_attributesДинамическое изменение на лету, не требует изменения БДНе всегда видно в админке, может быть сложно отлаживать
Программное обновление атрибутов в базе через CRUDИзменения сохраняются, видны в админкеНужно запускать вручную или через WP-Cron, нагрузка на базу
Использование плагинов автоматизацииПростота использования, UI для настройкиМожет быть избыточно, нагрузка на сайт, ограниченная гибкость

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

function wpcontent_update_product_attribute_db($product_id) {
    $product = wc_get_product($product_id);
    if (!$product) return;

    $attributes = $product->get_attributes();

    // Создаем пользовательский атрибут
    $attr = new WC_Product_Attribute();
    $attr->set_id(0);
    $attr->set_name('pa_material');
    $attr->set_options(['Хлопок', 'Лен']);
    $attr->set_position(0);
    $attr->set_visible(true);
    $attr->set_variation(false);

    $attributes['pa_material'] = $attr;

    $product->set_attributes($attributes);
    $product->save();
}
// Запуск для товара с ID 123
wpcontent_update_product_attribute_db(123);

Этот код добавит атрибут "Материал" прямо в базу для товара 123, что будет видно в админке и на сайте.

Решение проблемы с отображением корзины в WooCommerce при использовании кэширования
08.05.2026
Как использовать WP-Cron для автоматизации задач в WordPress
04.12.2025
Как изменить пути к медиафайлам в WordPress без потери функциональности
25.02.2026
Как создать автоматический бэкап WordPress с помощью плагинов и кода
30.11.2025
Решение проблемы с неработающим фильтром товаров WooCommerce по атрибутам
30.04.2026