Skip to main content

Поиск существующего товара по артикулу при обработке выгрузки

4 августа, 2020 13:01
Просмотров 410
Section background

Когда дело доходит до интеграции с 1С, то часто бывает ситуация, что каталог на сайте уже заполнен и конечно же нет никакого желания все удалять и создавать по данным из 1С.

Эта ситуация вполне разрешима, если у товаров на сайте и позиций номенклатуры в 1С, указаны артикулы, они уникальны и совпадают. В таком случае, следует включить в настройках плагина, чекбокс «Попытка поиска товара по артикулу»

У товара на сайте артикул располагается в блоке «Данные товара» на вкладке «Запасы» и хранится в метаданных по ключу «_sku». В выгрузке артикул поступает в данных о номенклатуре в узлах «Товар -> Артикул». Именно эта информация участвует в поиске по артикулу.

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

Обратите внимание на комментарии под настройками.


Свое поведение поиска существующего товара

Вполне возможно, что вам потребуется какой-то другой вариант поиска уже существующего товара на сайте и по другим данным. В данном случае, не включайте поиск по артикулу в настройках (чтобы не производить бесполезные попытки) и используйте фильтр `itglx_wc1c_find_product_id` (два параметра — текущее значение и SimpleXml объект узла товара) для реализации своего поведения поиска.

Предположим, в xml товара у вас передается какой-то узел «Товар->Custom» со значением, при этом у товаров на сайте, в метаданных по ключу «_custom» есть это значение. Также учтем, что у поста продукта не должно быть записанного GUID, то есть мета по ключу `_id_1c` должна отсутствовать или быть пуста.

Пример использования фильтра.


\add_filter('itglx_wc1c_find_product_id', function ($productID, $element) {
    if ((int) $productID || empty($element->Custom)) {
return $productID;
}

$product = \get_posts([
'post_type' => 'product',
'posts_per_page' => 1,
'fields' => 'ids',
'meta_query' => [
'relation' => 'AND',
[
'relation' => 'OR',
[
'key' => '_id_1c',
'value' => ''
],
[
'key' => '_id_1c',
'compare' => 'NOT EXISTS'
]
],
[
'key' => '_custom',
'value' => trim((string) $element->Custom)
]
]
]);

if (\is_wp_error($product) || empty($product)) {
return $productID;
}

return $product[0];
}, 10, 2);

Поделиться: