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

Брать значения size из короткого описания и добавлять их в аттрибуты

makola

Новичок
Всем привет
Столкнулся с такой проблемой, нужно чтоб функция брала значение из короткого описания товара, и если в коротком описании товара обнаруживается значение, котое соответствует значению глобального аттрибута size, id=3, то при сохранении или обновлении товара нужно добавлять значения аттрибутов в аттрибут 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);

Помогите решить проблему, если меняю $attribute->set_id(0) на $attribute->set_id(3), а id аттрибута 3, то выводит не верные значения.
 

joy66

Опытный
Всем привет
Столкнулся с такой проблемой, нужно чтоб функция брала значение из короткого описания товара, и если в коротком описании товара обнаруживается значение, котое соответствует значению глобального аттрибута size, id=3, то при сохранении или обновлении товара нужно добавлять значения аттрибутов в аттрибут 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);

Помогите решить проблему, если меняю $attribute->set_id(0) на $attribute->set_id(3), а id аттрибута 3, то выводит не верные значения.
Что-то не понял в чем смысл темы плодить. ))

PHP:
function add_attribute_on_short_description($post_id) {
   
     if ( 'product' !== get_post_type( $post_id ) ) {
        return;
    }
/////////////////ЗАДАТЬ ЗНАЧЕНИЯ//////////////////////////////////  
     //Задаем ID атрибутов как в админке
    $pa_size_id=3;
    $pa_color_id=2;
    // Задаем ярлыки атрибутов как в админке
    $slug_size='size';
    $slug_color='color';
    // Задаем возможные значения для добавления в атрибут "size"
    $sizes_to_add = array(38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60);
   
    // Задаем возможные значения для добавления в атрибут "color"
    $colors='Красный,Синий,Зеленый';  // без пробелов
   
    /////////////////////////////////////////////////////////////////
   
    $colors_to_add= explode(',',$colors);
   
    if($product = wc_get_product($post_id)){

        if ($product->get_type() === 'simple') { // Проверяем, что это простой товар

            $short_description = $product->get_short_description();
           // массив всех атрибутов
           $all_attr= $product->get_attributes();
            // Получаем текущие значения атрибута "size"
            $current_sizes = array();
            $current_colors = array();
       
            $attribute = $product->get_attribute($slug_size);
            if ($attribute) {
                $current_sizes = explode(',',$attribute);
            }
             $attribute = $product->get_attribute($slug_color);
            if ($attribute) {
                $current_colors = explode(',',$attribute);
            }
           

            // Удаляем значения из атрибута "size", если они не присутствуют в коротком описании
            foreach ($current_sizes as $key => $value) {
                if (strpos($short_description, $value) === false) {
                    unset($current_sizes[$key]);
                }
            }
            // Удаляем значения из атрибута "color", если они не присутствуют в коротком описании
            foreach ($current_colors as $key => $value) {
                if (strpos($short_description, $value) === false) {
                    unset($current_colors[$key]);
                }
            }
           
           

            // Добавляем значения из короткого описания, если они отсутствуют в атрибуте "size"
            foreach ($sizes_to_add as $value) {
                if (strpos($short_description, (string)$value) !== false && !in_array((string)$value, $current_sizes)) {
                    $current_sizes[] = (string)$value;
                }
            }
             foreach ($colors_to_add as $value) {
                if (strpos($short_description, $value) !== false && !in_array($value, $current_colors)) {
                    $current_colors[] = $value;
                }
            }
       
         
         
            // Создаем новый атрибут "size" с обновленными значениями
            if(count($current_sizes)>0) {
              sort($current_sizes);  
                $attribute = new WC_Product_Attribute();
                $attribute->set_id($pa_size_id);
                $attribute->set_name('pa_'.$slug_size);
                $attribute->set_options(array_values($current_sizes));
                $attribute->set_visible(true);
                $attribute->set_variation(false);
                $all_attr['pa_'.$slug_size]= $attribute;
               
             
            }
            // Создаем новый атрибут "color" с обновленными значениями
            if(count($current_colors)>0) {
                sort($current_colors);  
                $attribute1 = new WC_Product_Attribute();
                $attribute1->set_id($pa_color_id);
                $attribute1->set_name('pa_'.$slug_color);
                $attribute1->set_options(array_values($current_colors));
                $attribute1->set_visible(true);
                $attribute1->set_variation(false);
                 $all_attr['pa_'.$slug_color]= $attribute1;
             
             
            }
            if(count( $all_attr)>0){
            $product->set_attributes($all_attr);  
            $product->save(); // Сохраняем изменения товара
            wc_delete_product_transients($post_id); // Обновляем кэш для новых атрибутов
           
            }
           
        }
    }
}

// Добавляем атрибут "size" при сохранении товара
add_action('save_post', 'add_attribute_on_short_description');
 
Последнее редактирование:
Сверху Снизу