Support » Plugin: WooCommerce and 1C:Enterprise/1С:Предприятие Data Exchange » Характеристики в глобальные атрибуты

  • Как импортировать ХарактеристикиТовара в Торговых предложениях в глобальные атрибуты, а не в локальные, как происходит сейчас?
    Есть товары с торговыми предложениями в 1с (характеристика только одна – Упаковка), есть созданный на сайте глобальный атрибут Упаковка, значения характеристик в 1с и атрибута на сайте совпадают. Но при импорте файла offers.xml характеристика товара Упаковка попадает в индивидуальные атрибуты (вариации при это создаются правильно), но необходимо чтобы вариации создавались по существующему глобальному атрибуту. Какие варианты решения данной задачи существуют?

Viewing 9 replies - 1 through 9 (of 9 total)
  • Уже лет пять этот вопрос поднимается, а воз и ныне там. Если решите задачу, напишите, пожалуйста здесь решение.

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

    • This reply was modified 2 months, 3 weeks ago by asnever.
    
    /*
     * Фильтруем вариации при получении из 1с, цепляемся за хук wc1c_post_offer_meta
     */
    add_action( 'wc1c_post_offer_meta', 'theme_name_filter_attributes_wc1c', 10, 3 );
    function theme_name_filter_attributes_wc1c( $post_id, $offer, $is_full ) {
        if ( isset( $offer['ХарактеристикиТовара'] ) ) {
            $key = array_search( 'здесь пишем наименование характеристики, как в 1с', array_column( $offer['ХарактеристикиТовара'], 'Наименование' ) );
            if ( false !== $key ) {
                $product = wc_get_product( $post_id );
                if ( 'variation' == $product->get_type() ) {
                    // меняем атрибуты родительского товара
                    $parent = wc_get_product( $product->get_parent_id() );
                    $parent_attributes = $parent->get_attributes();
                    if ( array_key_exists( $slug, $parent_attributes ) ) { // $slug -это слаг локального (индивидуального) атрибута на сайте, не наименование из 1с, это важно
                        unset( $parent_attributes[ $slug ] );
                    }
                    $new_attr = new WC_Product_Attribute();
                    $new_attr->set_id( 7 ); // в моем случае 7, в общем случае - id глобального атрибута на сайте
                    $new_attr->set_name( 'pa_' . $slug );
                    $new_attr->set_options( [1,2,3] ); // тут id значений глобального атрибута на сайте, в массиве
                    $new_attr->set_variation( true ); // делаем доступным для вариаций
                    $new_attr->set_position( 0 ); // можно задавать позицию в списке атрибутов товара
                    $parent_attributes['pa_' . $slug] = $new_attr;
                    $parent->set_attributes( $parent_attributes );
    
                    // теперь, если нужно, можно установить значение атрибута для вариации по умолчанию
                    $def_attr = $parent->get_default_attributes();
                    $def_attr['pa_' . $slug] = $value_slug; // тут пишем слаг значения атрибута, который хотим установить по умолчанию
                    $parent->set_default_attributes( $def_attr );
                    $parent->save();
    
                    // меняем атрибуты дочернего товара
                    $attributes = $product->get_variation_attributes();
                    if ( array_key_exists( 'attribute_' . $slug, $attributes ) ) {
                        unset( $attributes['attribute_' . $slug] );
                    }
                    $value = тут необходимо получить значение глобального атрибута именно для текущей вариации, через проверку по имени или другим способом, получить нужно именно слаг атрибута
                    $attributes['attribute_pa_' . $slug] = $value;
                    $product->set_attributes( $attributes );
                    $product->set_stock_status( 'instock' ); // если нужно
                    $product->save();
    
                    // синхронизируем статусы для основного и вариативных товаров (это уже по потребностям конкретной ситуации)
                    if ( $parent->child_is_in_stock() ) {
                        $parent->set_manage_stock( false );
                        $parent->set_stock_status( 'instok' );
                        $parent->save();
                    }
                }
            }
        }
    }
    

    @asnever это решение подойдёт для моей проблемы? Я так понимаю, отличие в том, что у меня не ХарактеристикиТовара, а ЗначенияРеквизитов, и в том, что мои товары не вариативные, а простые. Мне надо, чтобы плагин отправлял значение реквизита в глобальный атрибут, а не индивидуальный. Заранее спасибо!

    @andyganesh вообще при импорте именно глобальные атрибуты и создаются. Взможно у вас проблема в том, что вы отправляете ЗначенияРеквизитов, тогда как для простых товаров, чтобы атрибуты создавались как глобальные, необходимо передавать СвойстваТовара в файле import.xml

    @asnever спасибо за ответ! Передам информацию 1С-нику, будем ковыряться

    @asnever спасибо за помощь. Немного исправив код плагина (там было “Свойство”, а у меня 1С выгружает “СвойствоНоменклатуры”), я наконец добился того, что у меня выгрузились и подцепились глобальные атрибуты (ура!), но вот значения этих атрибутов (свойств) плагин не цепляет. Часть кода, отвечающая за это, очень сложна для моего ламерского понимания. Поэтому буду рад, если направите куда копать. Спасибо!

    @andyganesh если вы решили изменять код плагина, то тогда вам нужно проследить по всему файлу import.php где используются Свойства, и заменить на ваше СвойстваНоменклатуры, плюс как у вас значения свойств выгружаются, также пробежаться по всему файлу если вдруг есть отличия. Но это так себе вариант. Хотя по идее работать должен.
    Для свойств, которые попадают в глобальные атрибуты, есть фильтр ‘wc1c_import_property_xml’
    попробуйте добавить в functions.php такой код

    add_filter( ''wc1c_import_property_xml', 'theme_name_wc1c_filter_property', 10, 2 );
    function theme_name_wc1c_filter_property( $property, $is_full ) {
        var_dump( $property );
        return $property;
    }

    вручную выполнить импорт с помощью запроса в браузере (https://wordpress.org/plugins/woocommerce-and-1centerprise-data-exchange/#%D0%BA%D0%B0%D0%BA%20%D0%B2%D1%80%D1%83%D1%87%D0%BD%D1%83%D1%8E%20%D0%B2%D0%BE%D1%81%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%B8%20%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82%20%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2%3F)
    и посмотрите что там приходит у вас, и тогда уже сможете оценить, есть ли возможность изменить массив $property и передать дальше для обработки правильные значения

    • This reply was modified 2 months, 2 weeks ago by asnever.

    @asnever

    если вы решили изменять код плагина, то тогда вам нужно проследить по всему файлу import.php где используются Свойства, и заменить на ваше СвойстваНоменклатуры, плюс как у вас значения свойств выгружаются, также пробежаться по всему файлу если вдруг есть отличия.

    Именно это я и сделал. И проверил синтаксис, касающийся “Значений” в том числе. Как я писал выше, после этого заработала выгрузка самого свойства, но не его значений.

    попробуйте добавить в functions.php такой код

    add_filter( ”wc1c_import_property_xml’, ‘theme_name_wc1c_filter_property’, 10, 2 );
    function theme_name_wc1c_filter_property( $property, $is_full ) {
    var_dump( $property );
    return $property;
    }

    Добавил этот код, убрав лишнюю кавычку (а то от неё сайт сломался 🙂 и импорт теперь вот что выдаёт:

    Произошла ошибка на стороне сервера. Получен неизвестный статус импорта.
    Обмен не выполнен
    Ответ сервера:
    [“Ид”]=>
    string(36) “cc8f46b1-9e8e-11ea-bb99-902b34591d28”
    [“Наименование”]=>
    string(10) “Бренд”
    [“Обязательное”]=>
    string(5) “false”
    [“Множественное”]=>
    string(5) “false”
    [“ИспользованиеСвойства”]=>
    string(4) “true”
    }
    success
    commit

    Выгрузка товаров завершена с ошибками!!!

    При этом сам обмен кстати выполняется

Viewing 9 replies - 1 through 9 (of 9 total)
  • You must be logged in to reply to this topic.