Skip to main content

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

27 августа, 2021 22:50
Просмотров 36
Section background

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

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

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

В итоге, при обработке данных по группам, если на сайте еще нет категории с таким GUID, произойдет попытка поиска существующей категории, которая также не имеет записанного GUID и, если категория будет найдена, то ей будет записана постоянная связь (значение GUID) в метаданные по ключу `_id_1c`.


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

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

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

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


\add_filter('itglx_wc1c_find_product_cat_term_id', function ($termID, $element, $taxonomy, $parentID) {
if ((int) $termID || empty($element->Custom)) {
return $termID;
}

$terms = \get_terms([
'taxonomy' => $taxonomy,
'parent' => $parentID,
'hide_empty' => false,
'number' => 1,
'fields' => 'ids',
'meta_query' => [
'relation' => 'AND',
[
// ищем только термины без guid
'relation' => 'OR',
[
'key' => '_id_1c',
'value' => ''
],
[
'key' => '_id_1c',
'compare' => 'NOT EXISTS'
]
],
[
'key' => '_custom',
'value' => trim((string) $element->Custom)
]
]
]);

if (\is_wp_error($terms) || !$terms) {
return $termID;
}

return $terms[0];
}, 10, 4);

Поделиться: