Forum Replies Created

Viewing 5 replies - 1 through 5 (of 5 total)
  • Thread Starter asnever

    (@asnever)

    @meckerpry тут необходимо понимать о чем речь. Т.е. допустим у вас на сайте есть глобальный атрибут цвет, и у него есть значения (термины) – зеленый, синий, красный. Соответственно, их слаги (значения) будут, допустим, zelenyj sinij, krasnyj (если к примеру вы используете cyr-to-lat).
    Так вот нужно именно это значение тут вставлять. Т.е. просто одной строчкой не решить, перед тем как присвоить $value этот значение, его нужно сначала определить. Я делал так – создавал массив, где ключами были эти нужные слаги глобального атрибута, а значениями – то что приходит из 1с. Выполнял поиск в массиве значения из 1с, и найденный ключ и был искомым значением, которое присваивалось переменной $value
    Сейчас я уже не использую эту схему, переработал по другому, более логично и правильно, но больше кода

    • This reply was modified 5 years, 8 months ago by asnever.
    Thread Starter asnever

    (@asnever)

    @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 5 years, 11 months ago by asnever.
    Thread Starter asnever

    (@asnever)

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

    Thread Starter asnever

    (@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();
                    }
                }
            }
        }
    }
    
    Thread Starter asnever

    (@asnever)

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

    • This reply was modified 5 years, 12 months ago by asnever.
Viewing 5 replies - 1 through 5 (of 5 total)