Skip to main content

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

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

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

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

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

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

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

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

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

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

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


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

global $wpdb;

$product = $wpdb->get_row(
$wpdb->prepare(
"SELECT `meta`.`post_id` as `post_id`, `posts`.`post_type` as `post_type` FROM `{$wpdb->postmeta}` as `meta`
INNER JOIN `{$wpdb->posts}` as `posts` ON (`meta`.`post_id` = `posts`.`ID`)
WHERE `meta`.`meta_value` = %s AND `meta`.`meta_key` = '_custom'",
(string) $element->Custom
)
);

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

return $product->post_type === 'product' ? $product->post_id : $productID;
}, 10, 2);
Поделиться: