Характеристики в глобальные атрибуты
-
Как импортировать ХарактеристикиТовара в Торговых предложениях в глобальные атрибуты, а не в локальные, как происходит сейчас?
Есть товары с торговыми предложениями в 1с (характеристика только одна – Упаковка), есть созданный на сайте глобальный атрибут Упаковка, значения характеристик в 1с и атрибута на сайте совпадают. Но при импорте файла offers.xml характеристика товара Упаковка попадает в индивидуальные атрибуты (вариации при это создаются правильно), но необходимо чтобы вариации создавались по существующему глобальному атрибуту. Какие варианты решения данной задачи существуют?
-
Уже лет пять этот вопрос поднимается, а воз и ныне там. Если решите задачу, напишите, пожалуйста здесь решение.
В общем два дня ковыряния в коде плагина привели к решению, оно конечно не идеальное, но другого пока не нашел. Вообще в плагине очень мало хуков, за которые можно зацепиться и хоть как-то кастомизировать его поведение.
Свой вопрос решил следующим образом:- This reply was modified 4 years, 6 months 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://www.ads-software.com/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 4 years, 6 months ago by 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Выгрузка товаров завершена с ошибками!!!
При этом сам обмен кстати выполняется
- This reply was modified 4 years, 6 months ago by tobifjellner (Tor-Bjorn “Tobi” Fjellner).
- This reply was modified 4 years, 6 months ago by andyganesh.
$value = тут необходимо получить значение глобального атрибута именно для текущей вариации, через проверку по имени или другим способом, получить нужно именно слаг атрибута
Подскажите, пожалуйста, как получить это значение, что надо написать вместо текста, прошу прощения, просто php – не мой профиль, а сделать надо )
@meckerpry тут необходимо понимать о чем речь. Т.е. допустим у вас на сайте есть глобальный атрибут цвет, и у него есть значения (термины) – зеленый, синий, красный. Соответственно, их слаги (значения) будут, допустим, zelenyj sinij, krasnyj (если к примеру вы используете cyr-to-lat).
Так вот нужно именно это значение тут вставлять. Т.е. просто одной строчкой не решить, перед тем как присвоить $value этот значение, его нужно сначала определить. Я делал так – создавал массив, где ключами были эти нужные слаги глобального атрибута, а значениями – то что приходит из 1с. Выполнял поиск в массиве значения из 1с, и найденный ключ и был искомым значением, которое присваивалось переменной $value
Сейчас я уже не использую эту схему, переработал по другому, более логично и правильно, но больше кода- This reply was modified 4 years, 2 months ago by asnever.
Делал по видео
, может не связано, – но даёт такую ошибку:
Не удалось заблокировать таблицу ‘_REFERENCECHNGR23266’
{ОбщийМодуль.ОбменССайтом.Модуль(2295)}: ПланыОбмена.ЗарегистрироватьИзменения(Параметры.УзелОбмена, ЭлементМассива);
{ОбщийМодуль.ОбменССайтом.Модуль(158)}: Успешно = ВыгрузитьПакетПредложений(Параметры, СтрокаТаблицы, ТаблицаИнформации, Истина);
{ОбщийМодуль.ОбменССайтомСобытия.Модуль(265)}: ОбменССайтом.ВыполнитьОбменССайтом(ПараметрыОбмена, РезультатОбмена, ТаблицаИнформации);
{ПланОбмена.ОбменССайтом.Команда.ВыполнитьОбменДанными.МодульКоманды(63)}: ОбменССайтомСобытия.ВыполнитьОбмен(УзелОбмена, НСтр(“ru = ‘Интерактивный обмен'”), ,ПараметрыОбновления);
{ПланОбмена.ОбменССайтом.Команда.ВыполнитьОбменДанными.МодульКоманды(23)}: ОбменВыполненСервер(УзелОбмена, ПараметрыОбновленияСписков);по причине:
Конфликт блокировок при выполнении транзакции:
Не удалось заблокировать таблицу ‘_REFERENCECHNGR23266’
по причине:
Не удалось заблокировать таблицу ‘_REFERENCECHNGR23266’Что Это ??
- The topic ‘Характеристики в глобальные атрибуты’ is closed to new replies.