Демо собрано под конкретную задачу: описания RU и UA, картинка, бренд, модель, из двух цен в фиде берётся розничная, отсутствующие позиции снимаются с показа, файл перечитывается раз в сутки.
Данные ниже — образец структуры типового фида спортпита. На ваш фид карта полей настраивается за один проход.
Типовой узел товара. Обратите внимание на две цены и два языка описания — это два места, где обычно ломается импорт.
<offer id="SN-10428" available="true"> <name>Optimum Nutrition Gold Standard 100% Whey 2270 г</name> <vendor>Optimum Nutrition</vendor> <!-- бренд --> <model>ON-GS-2270-CHOC</model> <!-- модель --> <picture>https://supplier.example/img/10428.jpg</picture> <price type="retail">3190.00</price> <!-- берём эту --> <price type="opt">2515.00</price> <!-- не эту --> <description lang="ru">Сывороточный протеин…</description> <description lang="ua">Сироватковий протеїн…</description> <quantity>42</quantity> </offer>
У разных поставщиков цены помечены по-разному: атрибутом type,
отдельными тегами <price_retail> / <price_opt> или просто порядком следования.
Правило выбора выносится в настройку, а не зашивается в код — иначе смена формата фида означает переписывание.
Карта полей. Импорт пишет в таблицы OpenCart 3.0.5.0, товары попадают в уже перенесённые вами категории.
| Поле XML | Таблица OpenCart | Примечание |
|---|---|---|
| name | oc_product_description.name | отдельно для language_id русского и украинского |
| description lang="ru" | oc_product_description (ru) | чистка от чужих инлайн-стилей и скриптов |
| description lang="ua" | oc_product_description (ua) | нет украинского в фиде — карточка не остаётся пустой, позиция помечается на перевод |
| picture | oc_product.image + oc_product_image | скачивание, ресайз под Promo, повтор второй раз не качается |
| vendor | oc_manufacturer | бренд создаётся, если его ещё нет; «ON» и «Optimum Nutrition» сводятся в один |
| model | oc_product.model | также служит ключом сверки при повторных прогонах |
| price type="retail" | oc_product.price | опт игнорируется |
| quantity / available | oc_product.quantity + status | ноль или отсутствие в фиде — status 0, позиция снята с показа |
Ключ сопоставления — id поставщика, записанный в служебное поле товара.
Поэтому повторный прогон обновляет карточку, а не создаёт дубль: типовая беда импортов, когда поставщик поправил название товара.
Переключите — увидите разницу. Это те самые два пункта вашего задания.
| Товар | Бренд | Модель | Цена | Остаток | Показ |
|---|
Задание в cron, раз в сутки ночью. Журнал каждого прогона остаётся — видно, что именно поменялось и почему.
Если фид недоступен или пришёл битым — импорт не выполняется совсем, каталог остаётся как был. Наполовину применённый прогон опаснее пропущенного: часть цен останется старой, часть новой, и найти это потом нечем.