Айдегин - блог Tilda-вебмастера

Как добавить товары в каталог Tilda из XML?

2024-06-07 15:23 tilda
Задача: есть каталог автомобилей на стороннем сервисе, нужно его перенести в Tilda. Руками делать неохота, долго слишком. Поэтому буду заставлять работать компьютеры, и ни строчки программирования. Описанный метод не является идеальным, и, просто иллюстрирует в доступной форме такую возможность, как конвертация xml в csv для чайников. Ваши предложения и замечания пишите в обсуждение.
Метод подходит для небольшого количества товаров (примерно не больше 150) из-за ограничений Google на нагрузку серверов. Чем больше товаров - тем дольше будет обрабатываться файл.

  1. Получаем XML каталога авто

Пообщавшись с поддержкой сервиса, я получил ссылку на весь каталог в формате *.XML. Это удобно, потому что обновление каталога в сервисе будет сразу отображаться и на нашей таблице. А еще этот формат файла можно открыть в блокноте и понять, что к чему.
Приступим к адаптации xml для Тильды.

2. Подготовка csv

Tilda для удобства позволяет загружать товары в каталог через специально подготовленный файл, формата csv. У него есть обязательные заголовки и структура, посмотреть можно в образце. Я сделал немного по-другому:
  1. собрал карточку товара вручную с нужными мне полями и разделами, проставил табы;
  2. скачал этот товар как csv и таким образом получил нужную мне структуру.
Кратко опишу, какие поля остались для моего файла:
  • SKU - для уникального номера авто, совпадает с таковым в сервисе, где менеджеры формируют каталог;
  • Brand - производитель авто
  • Title - название модели
  • Description - краткое описание характеристик
  • Text - полное описание товара
  • Photo - все фотографии авто
  • Price - стоимость авто
Поля ниже с приставкой Characteristics: это характеристики в карточке товара, вручную мной сформированные. Из них сделаю фильтры для каталога.

  • Characteristics:Год выпуска
  • Characteristics:Пробег
  • Characteristics:Владельцев по ПТС
  • Characteristics:Комплектация
  • Characteristics:Тип двигателя
  • Characteristics:Коробка передач
  • Characteristics:Привод
  • Characteristics:Тип кузова
  • Characteristics:Цвет
  • Tabs:1...4 — это содержимое табов в карточке товара
И не забываем про поисковую оптимизацию, формируем два поля:
  • SEO title - title товара
  • SEO descr - descr товара
Остальные поля удалил, они мне не нужны и создают визуальный шум. При экспорте файла в Tilda мы будем проходить сопоставление полей, и лишний раз проверим, что все нужное передается, а что не нужно - тильда или сама сгенерирует, или пропустит.

3. Извлекаем данные из xml

Я пользуюсь для автоматизации Google Таблицами, поэтому буду описывать работу в этом сервисе.
Создаю новый документ и в первую ячейку вставляю ссылку xml-каталога. Это будет источник.
В соседней вкладке открываю саму xml, чтобы глазами видеть структуру и понимать, какие данные извлекать. В моей xml структура имеет вот такой вид (я ее упростил, удалив некоторые поля):
<offers>
    <offer>
        <id>9596654</id>
        <type>Легковой</type>
        <body-type>Внедорожник</body-type>
        <engine-type>гибрид</engine-type>
        <make>LiXiang</make>
        <model>L9</model>
        <version>44.5 kWh 1.5hyb AT (449 л.с.) 4WD</version>
        <complectation>Max</complectation>
        <year>2023</year>
        <price>7400000</price>
        <run>6000</run>
        <color>черный</color>
        <power>449</power>
        <transmission>Автомат</transmission>
        <drive>Полный</drive>
        <owners>1</owners>
        <comment>В НАЛИЧИИ LiXiang L9 Max, 44.5 kWh, 2023. • Шины Michelin 265/45/R21. • Комплект ароматизаторов . • Бронь плёнка. • Брызговики. • Приложения на всех экранах . • Мастер аккаунт в наличии у собственника машины, что является 100% гарантией получения мастераккаунта./comment>
        <equipment>Отделка кожей рулевого колеса, Тонированные стекла, Ламинированные боковые стекла, Панорамная крыша / лобовое стекло, Система адаптивного освещения, Система управления дальним светом, Бортовой компьютер, Датчик дождя, Датчик света, Датчик давления в шинах, Штатная навигационная система, Обогрев зеркал, Мультифункциональное рулевое колесо, Пневмоподвеска, Розетка 12v, Камера 360°, Камера заднего вида, USB, Bluetooth, Голосовое управление, Электрообогрев лобового стекла, Крепление для детского кресла (Isofix/LATCH), Электропривод крышки багажника, Обогрев рулевого колеса, Подогрев передних сидений, Дистанционный запуск двигателя, Электропривод зеркал, Электростеклоподъемники передние, Электростеклоподъемники задние, Регулировка сидения водителя по высоте, Регулировка сидения пассажира по высоте, Электрорегулировка задних сидений, Антиблокировочная система (ABS), Антипробуксовочная система, Система стабилизации (ESP), Система контроля слепых зон, Система помощи при старте в гору, Система контроля за полосой движения, Система распознавания дорожных знаков, Система помощи при парковке (передняя), Система помощи при парковке (задняя), Система автоматической парковки, Вентиляция передних сидений, Вентиляция задних сидений, Третий ряд сидений, Передний центральный подлокотник, Сигнализация, Штатный иммобилайзер, Сигнализация с обратной связью, Система доступа без ключа, Центральный замок, Блокировка замков задних дверей, Запуск двигателя с кнопки, Подушка безопасности водителя, Подушка безопасности пассажира, Подушки безопасности оконные (шторки), Подушки безопасности боковые задние, Подушки безопасности боковые, Штатная аудиосистема с tv, Мультимедиа система для задних пассажиров, Кожаный салон, Легкосплавные диски 21", Светодиодные фары, Усилитель руля, Адаптивный круиз-контроль, Сиденье водителя: с памятью положения, Сиденье пассажира: электро регулировка, Регулировка руля по высоте, Штатная аудиосистема с cd</equipment>
        <photos>
            <photo>http://img.carcopy.ru/e55d/5cd8/6f98/1a67/563d/23cb/da21/928a/f224/9859/e55d5cd86f981a67563d23cbda21928af2249859_1600x0.jpg?ts=1712133709</photo>
            <photo>http://img.carcopy.ru/a0e9/96c9/4d7b/e365/a306/d3de/b9b7/082f/b6e5/629f/a0e996c94d7be365a306d3deb9b7082fb6e5629f_1600x0.jpg?ts=1712133709</photo>
            <photo>http://img.carcopy.ru/8b15/b976/421e/724a/ecae/2a3d/7d81/8849/75b0/e337/8b15b976421e724aecae2a3d7d81884975b0e337_1600x0.jpg?ts=1712133709</photo>
            <photo>http://img.carcopy.ru/0704/d587/880c/3df1/cc81/ca3f/9bab/a78f/3b8f/3e6c/0704d587880c3df1cc81ca3f9baba78f3b8f3e6c_1600x0.jpg?ts=1712133709</photo>
            <photo>http://img.carcopy.ru/9355/1985/e725/736a/2d55/d1fb/abfb/cf70/0bfd/944e/93551985e725736a2d55d1fbabfbcf700bfd944e_1600x0.jpg?ts=1712133709</photo>
            ...
            <photo>http://img.carcopy.ru/32b4/fb8d/9b20/be0d/dbe9/eb68/9299/22a5/0715/f7df/32b4fb8d9b20be0ddbe9eb68929922a50715f7df_1600x0.jpg?ts=1711716353</photo>
        </photos>
    </offer>
</offers>
Начинаем заполнять поля. Для этого воспользуемся функцией IMPORTXML(), она извлекает данные из документов XML, и специальным языком разметки XPATH, который объясняет таблице, что куда вставлять.

Делаем простые формулы

Для уникализации и записи в xml используется поле id, для каждого авто оно уникально. Вот его и будем использовать для SKU, чтобы каждая запись (карточка товара) была уникальной. Ведь авто могут называться одинаково, а так их будет возможно различать. И по id можно быстро найти авто в стороннем сервисе, совместимость получается.

Формула для извлечения id:
=IMPORTXML(A1;"//id")
A1 - это ячейка со ссылкой на xml
// - это оператор, указывающий что искать надо по всем строкам
id - это строка в xml, значения которой нам надо извлечь
Для вывода результата вставляем формулу в ячейку и ждем, пока сервер обработает данные и вставит значения. В Таблицах это оптимизировано и заполнится весь столбец найденными id, т.е. сколько есть машин, столько и будет строчек с id.
По этому образцу делаем остальные формулы для нужных нам значений. Здесь важно просто понять саму структуру формулы, раскрывать каждую формулу не буду.
=IMPORTXML(A1;"//make")
=IMPORTXML(A1;"//model")
=IMPORTXML(A1;"//year")
=IMPORTXML(A1;"//run")
=IMPORTXML(A1;"//price")
=IMPORTXML(A1;"//version")
=IMPORTXML(A1;"//complectation")
=IMPORTXML(A1;"//engine-type")
=IMPORTXML(A1;"//transmission")
=IMPORTXML(A1;"//drive")
=IMPORTXML(A1;"//body-type")
=IMPORTXML(A1;"//color")
Процентов 80 работы мы уже сделали, остались поля, для которых надо выполнять какие-либо условия. Извлекаем фотки, названия моделей, описание и владельцев по ПТС.

Делаем сложные формулы

Описанное ниже решение лишено автоматизации и требует ручной доработки файла. Если есть предложения, как это исправить и добавить автоматизацию — пишите в обсуждение

Извлекаем фотки авто

Фотки в xml в виде ссылок, причем для каждой фотки отдельная запись в файле. Это значит, что если обратиться простой формулой, то получим ВСЕ ссылки на фотки, без разделения по моделям и без пробелов. Такой себе кирпич текста, бесполезный. Надо его обработать.
Сначала оставим фотки только той модели, которой они принадлежат. Для этого надо обратиться к конкрентному разделу и взять только фото из него. Используем такую формулу:
IMPORTXML($A$1;"//offer[id='9596654']//photo")
  • $A$1 — знак $ указывает, чтобы значение не менялось при протягивании формулы по ячейкам
  • offer[id='9596654'] — в квадратных скобках указываем id модели
  • //photo — указываем, что нужны именно ссылки на фотки
Результат уже лучше, мы получили массив со ссылками, но это все еще монолит текста, наши ссылки слеплены вместе. Исправляем с помощью функции JOIN, она добавляет нужный символ между значениями. Теперь формула выглядит так:
JOIN(" ";IMPORTXML($A$1;"//offer[id='9596654']//photo"))
  • " "; — пробел будет вставляться между значениями photo
Теперь протягиваем формулу по всем нужным строкам и меняем в квадратных скобках id на нужные.

Извлекаем название модели авто

Вроде бы ничего сложного, но здесь столкнулся с особенностью табличного процессора. Некоторые названия авто содержат цифру 0 (ноль) в начале, например, Zeekr 001. И при извлечении такие данные будут записываться без нулей в начале. Это неправильно, потому что название должно быть точным.
Простое исправление типа ячейки на "текстовый" не помогает, надо работать с полученными данными и исправлять в документе их. Для этого сначала извлекаем название моделей в отдельный столбец:
IMPORTXML(A1;"//model")
И уже в нужный столбец пишем данные через небольшую формулу с проверкой условий, и возвращаем потерянные нолики.
!формула
Протягиваем формулу по всем строкам.

Извлекаем описание авто

В моем случаем описание состоит из двух полей: comment и equipment. Я их объединю в одну запись, т.к. не всегда одно из этих полей заполнено.
Извлекаем описание comment:
IMPORTXML($A$1;"//offer/comment[1]")
Извлекаем комплектацию equipment:
IMPORTXML($A$1;"//offer/equipment[1]")
[1] — указывает, что надо брать значение только из конкретного оффера по порядку. К сожалению, это обращение не сработало на фотки

Извлекаем количество владельцев

Здесь тот же вопрос, зачем сложности, если все и так видно? Проблема оказалась, что не всегда это поле заполняют, поэтому сделал простую проверку условия, если поле не заполнено, то выводится текст.
Извлекаем количество владельцев:
IMPORTXML($A$1;"//offer[id='9596654']//owners")
  • offer[id='9596654'] — в квадратных скобках указываем id модели
Проверяем данные:
ЕСЛИ(ЕЧИСЛО(U4);U4;"нет данных")
  • ЕЧИСЛО(U4) — проверка, что данные в ячейке являеются числом
  • U4;"нет данных" — если число, то оно и выводится, если нет, то показываем текст
Отлично, данные из XML извлечены и теперь можно собирать csv для Tilda!

4. Собираем CSV для каталога Tilda

Делаем еще одну вкладку и в ней создаем структуру для Tilda. Начнем с первой строки, потом просто ее протянем. Описание, слева - название в Tilda, справа - название из XML
SKU - это id
Brand - это производитель
Title - это название товара, формируется по шаблону с разделителем LiXiang L9 / 2023
Используем формулу:
СЦЕПИТЬ(Brand;" ";Model;" / ";Year;)
Description - это краткое описание товара, формируется по шаблону с разделителем 44.5 kWh 1.5hyb AT (449 л.с.) 4WD / Автомат / 6000 км
Используем формулу:
СЦЕПИТЬ(Version;" / ";KPP;" / ";Probeg;" км";)
Text - это описание
Photo - изображения товара
Price - стоимость товара
Characteristics:Год выпуска

Characteristics:Пробег

Characteristics:Владельцев по ПТС

Characteristics:Комплектация

Characteristics:Тип двигателя

Characteristics:Коробка передач

Characteristics:Привод

Characteristics:Тип кузова

Characteristics:Цвет
SEO title - это оптимизированный заголовок, формируется по шаблону: Купить LiXiang L9 / 2023 по цене 7450000₽ в Москве | автосалон
Используем формулу:
СЦЕПИТЬ("Купить ";Title;" по цене ";Price;"₽";" в Москве | Название автосалона")
SEO descr - это оптимизированное описание, формируется по шаблону: LiXiang L9 / 2023 с пробегом 6000 км в наличии! Тест-драйв, кредит и страховка, запишитесь на просмотре по т. +7 980 999-99-99 Подарки всем покупателям!
Используем формулу:
СЦЕПИТЬ(Title;" с пробегом ";Probeg;" км";" в наличии! Тест-драйв, кредит и страховка, запишитесь на просмотре по т. +7 980 XXX-XX-XX Подарки всем покупателям!")
Tabs:1 - берет информацию из поля ТЕКСТ в карточке товара
text|#|Описание

Tabs:2 - берет информацию из полей Характиристики
chars|#|Характеристики

Tabs:3 - шаблон, содержит информацию о кредитных программах
template|#|Кредит|#|Автокредит|#|...

Tabs:4 - шаблон, содиржит информацию о способах покупки
template|#|Как купить?|#|Как купить?|#|
Вот и готова строка с записью о модели! Протягиваем ячейки на нужное количество строк и наслаждаемся готовой таблицей со всеми товарами.
Теперь скачиваем таблицу в формате csv себе на комп и импортируем ее в Tilda.

5. Импорт csv в Tilda

В админке Каталога наведите курсор на три точки и выберите пункт Импортировать (обновить) товары из CSV. Откроется мастер, выполняйте инструкции. На этапе сопоставления полей убедитесь, что тильда все правильно поняла и данные верно запишет. У меня постоянно слетают поля из раздела SEO, приходится их вручную сопоставлять.
Запускайте импорт, чем больше было ссылок на фото - тем дольше будет идти запись. После окончания проверьте, что все встало правильно. Вы восхитbтельны и научились в полуавтоматизированном режиме добавлять товары в каталог Tilda.

6. Обновление товаров

Для обновления товаров просто заново сформируйте csv файл, скачайте его и при сопоставлении полей проставьте внизу нужные галочки. Парсер у Tilda умный и достаточно грамотно перезаписывает поля. Проданные товары можно удалять вручную.