• Никакой политики на форуме. Иначе - бан!
  • Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Как сделать из локальных атрибутов глобальные?

makola

Новичок
Есть функция, которая проверяет короткое описание товара, и если находит любое из значений (38, 40, 42, 44, 46, 48, 50... 60) добавляет его в аттрибут size.
Но аттрибут size создает локальный. Как сделать так, чтоб аттрибут создавался глобальный?
Вот код:

function add_attribute_on_short_description($post_id) { $product = wc_get_product($post_id); if ($product->get_type() === 'simple') { // Проверяем, что это простой товар $short_description = $product->get_short_description(); // Значения для добавления в атрибут "size" $values_to_add = array(38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60); // Получаем текущие значения атрибута "size" $current_values = array(); $attributes = $product->get_attributes(); if (isset($attributes['pa_size'])) { $current_values = $attributes['pa_size']->get_options(); } // Удаляем значения из атрибута "size", если они не присутствуют в коротком описании foreach ($current_values as $key => $value) { if (strpos($short_description, (string)$value) === false) { unset($current_values[$key]); } } // Добавляем значения из короткого описания, если они отсутствуют в атрибуте "size" foreach ($values_to_add as $value) { if (strpos($short_description, (string)$value) !== false && !in_array($value, $current_values)) { $current_values[] = $value; } } // Упорядочиваем значения атрибута "size" по возрастанию sort($current_values); // Создаем новый атрибут "size" с обновленными значениями $attribute = new WC_Product_Attribute(); $attribute->set_id(0); $attribute->set_name('pa_size'); $attribute->set_options(array_values($current_values)); $attribute->set_visible(true); $attribute->set_variation(false); $product->set_attributes(array('pa_size' => $attribute)); $product->save(); // Сохраняем изменения товара wc_delete_product_transients($post_id); // Обновляем кэш для новых атрибутов } } // Добавляем атрибут "size" при сохранении товара add_action('woocommerce_process_product_meta_simple', 'add_attribute_on_short_description'); add_action('woocommerce_process_product_meta_variation', 'add_attribute_on_short_description'); add_action('save_post', 'add_attribute_on_short_description'); add_action('woocommerce_new_product', 'add_attribute_on_short_description'); // Выводим значения атрибута "size" товаров function save_wc_custom_attributes($post_id, $custom_attributes) { foreach ($custom_attributes as $name => $value) { $product_attributes[] = array( 'name' => htmlspecialchars(stripslashes($name)), // set attribute name 'value' => $value, // set attribute value 'position' => 1, 'is_visible' => 1, 'is_variation' => 0, 'is_taxonomy' => is_array($value) ? 1 : 0, ); } update_post_meta($post_id, '_product_attributes', $product_attributes); } // Пример записи значений атрибута "size" для товара с ID = $id $_product_attributes = array(); $_product_attributes['pa_size'] = array(38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60); save_wc_custom_attributes($id, $_product_attributes);
 

joy66

Опытный
Код:
// Создаем новый атрибут "size" с обновленными значениями
        $attribute = new WC_Product_Attribute();
        $attribute->set_id(0);
        $attribute->set_name('pa_size');
        $attribute->set_options(array_values($current_values));
        $attribute->set_visible(true);
        $attribute->set_variation(false);

Очевидно, что вот тут $attribute->set_id(0); вы явно указываете, что это локальный атрибут. Надо указывать ID атрибута pa_size
ID можно узнать в адресной строке, на странице редактирования атрибута pa_size в админке
 
  • Like
Реакции: marr

makola

Новичок
Код:
// Создаем новый атрибут "size" с обновленными значениями
        $attribute = new WC_Product_Attribute();
        $attribute->set_id(0);
        $attribute->set_name('pa_size');
        $attribute->set_options(array_values($current_values));
        $attribute->set_visible(true);
        $attribute->set_variation(false);

Очевидно, что вот тут $attribute->set_id(0); вы явно указываете, что это локальный атрибут. Надо указывать ID атрибута pa_size
ID можно узнать в адресной строке, на странице редактирования атрибута pa_size в админке
Joy66, ты гений!!!

Спасибо большое, все заработало
 
Сверху Снизу