OpenCart 3.0.5.0шаблон Promo спортивное питаниеXML-фид поставщика

Перенос товаров из XML в OpenCart с автообновлением цен — рабочая панель

Демо собрано под конкретную задачу: описания RU и UA, картинка, бренд, модель, из двух цен в фиде берётся розничная, отсутствующие позиции снимаются с показа, файл перечитывается раз в сутки.

Данные ниже — образец структуры типового фида спортпита. На ваш фид карта полей настраивается за один проход.

1Что приходит в XML

Типовой узел товара. Обратите внимание на две цены и два языка описания — это два места, где обычно ломается импорт.

<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> или просто порядком следования. Правило выбора выносится в настройку, а не зашивается в код — иначе смена формата фида означает переписывание.

2Куда это ложится в OpenCart

Карта полей. Импорт пишет в таблицы OpenCart 3.0.5.0, товары попадают в уже перенесённые вами категории.

Поле XMLТаблица OpenCartПримечание
nameoc_product_description.nameотдельно для language_id русского и украинского
description lang="ru"oc_product_description (ru)чистка от чужих инлайн-стилей и скриптов
description lang="ua"oc_product_description (ua)нет украинского в фиде — карточка не остаётся пустой, позиция помечается на перевод
pictureoc_product.image + oc_product_imageскачивание, ресайз под Promo, повтор второй раз не качается
vendoroc_manufacturerбренд создаётся, если его ещё нет; «ON» и «Optimum Nutrition» сводятся в один
modeloc_product.modelтакже служит ключом сверки при повторных прогонах
price type="retail"oc_product.priceопт игнорируется
quantity / availableoc_product.quantity + statusноль или отсутствие в фиде — status 0, позиция снята с показа

Ключ сопоставления — id поставщика, записанный в служебное поле товара. Поэтому повторный прогон обновляет карточку, а не создаёт дубль: типовая беда импортов, когда поставщик поправил название товара.

3Как это выглядит в каталоге

Переключите — увидите разницу. Это те самые два пункта вашего задания.

ТоварБрендМодельЦенаОстатокПоказ

4Ежедневный прогон

Задание в cron, раз в сутки ночью. Журнал каждого прогона остаётся — видно, что именно поменялось и почему.

Если фид недоступен или пришёл битым — импорт не выполняется совсем, каталог остаётся как был. Наполовину применённый прогон опаснее пропущенного: часть цен останется старой, часть новой, и найти это потом нечем.

5Что входит и чего я не делаю

Входит
  • Разбор вашего XML и карта полей под него, а не под «типовой фид».
  • Перенос в существующие категории: описания RU и UA, картинка, бренд, модель.
  • Розничная цена из двух; правило выбора выносится в настройку.
  • Снятие с показа позиций, которых нет в наличии, и возврат показа, когда появились.
  • Обновление раз в сутки по расписанию плюс кнопка «обновить сейчас» в админке.
  • Журнал прогонов: добавлено, обновлено, снято, ошибки.
  • Пробный прогон на копии базы до первого касания боевого каталога.
Не делаю и говорю об этом заранее
  • Не обхожу защиту сайта-донора: работаем с XML, который вам выдан.
  • Не переписываю шаблон Promo и не трогаю вёрстку карточки товара.
  • Не перевожу описания машинно молча: нет украинского в фиде — позиция помечается, решение за вами.
  • Не обещаю, что импорт переживёт любую смену формата фида: поменяется структура — нужна правка, я скажу какая.