Пересказать с ИИ:

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

В рамках разработки интернет-магазина мы реализовали модуль, который получает товары с сайта-источника через API и создаёт их в каталоге CS-Cart как обычные товары. При повторном запуске уже импортированные позиции обновляются, а новые создаются как отдельные карточки.

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

Как устроен импорт товаров

Модуль получает каталог с сайта-источника через API. Товары загружаются последовательно, а при необходимости для отдельных позиций дополнительно запрашивается подробная информация.

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

Если товар импортируется впервые, создаётся новая карточка. Если он уже был перенесён — обновляется существующая запись.

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

Схема процесса получения и обработки товара через API

Как система определяет, что товар уже импортирован

При повторном импорте важно не создавать лишние карточки. Если сегодня перенести 500 товаров, а через неделю запустить импорт ещё раз, система должна обновить эти 500 позиций, а не создать ещё 500.

Для каждого импортированного товара создаётся служебный ключ: mp:{product_id}. Он сохраняется в поле source_import_key. При следующем запуске модуль формирует такой же ключ и ищет его в локальном каталоге. Если запись найдена — товар обновляется. Если нет — создаётся новый.

Например, товар с идентификатором 4688 получает ключ mp:4688. При следующем импорте он позволяет определить уже существующую карточку.

Такой механизм является основой повторной синхронизации: система понимает, какую запись нужно обновить, а какую создать впервые.

Алгоритм поиска существующего товара по ключу source_import_key

Список импортированных товаров в административной панели

Как переносить цены, если у сайтов разные валюты

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

В нашем случае исходные цены приходят в USD. Для пересчёта используется актуальный курс доллара: Цена в RUB = Цена в USD × Курс USD.

Исходная стоимость при этом сохраняется отдельно в таблице ip5_import_products_prices. В ней хранятся product_id, usd_price, usd_list_price и updated_at.

Рассчитанные рублёвые значения записываются в стандартные таблицы CS-Cart — product_prices и list_price.

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

Схема конвертации валюты и сохранения цен в базе данных

Интерфейс модуля импорта

Интерфейс модуля: подключение к API, запуск полного импорта, тестовый импорт одного товара и функция «Обновить цены по курсу». Такой экран показывает реальные операции модуля и позволяет увидеть, что полный импорт, тестовый запуск и пересчёт цен выполняются независимо.

Что происходит с изображениями при обновлении

Изображения требуют отдельной обработки. Модуль получает ссылки на основное и дополнительные изображения товара, скачивает файлы и прикрепляет их к локальной карточке.

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

Это позволяет поддерживать изображения в соответствии с текущим состоянием сайта-источника и не накапливать лишние копии.

Процесс обновления изображений товара при повторном импорте

Создание товара через стандартные механизмы CS-Cart

После обработки исходных данных товар создаётся или обновляется через штатную функцию CS-Cart fn_update_product().

Данные попадают в стандартные структуры платформы: products, product_descriptions, таблицы цен и другие сущности CS-Cart. В результате импортированный товар становится обычной карточкой локального магазина.

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

Импортированные товары складываются в отдельную категорию Marketplace Import. Структура категорий сайта-источника при этом не копируется — задача модуля заключается именно в переносе товаров.

Карточка созданного товара в административной панели CS-Cart

Как проходит полный импорт

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

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

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

После завершения модуль возвращает статистику: сколько товаров создано, сколько обновлено и сколько всего обработано.

Полная схема цикла импорта каталога товаров

Зачем нужен тестовый импорт одного товара

Полный каталог не всегда стоит импортировать сразу. Поэтому в модуле предусмотрена возможность указать ID конкретного товара и запустить импорт только для него.

Это позволяет заранее проверить название, описание, цену, изображения, категорию и SEO-данные. После такой проверки можно переходить к полному импорту каталога.

Отдельный пересчёт цен без повторного импорта

Изменение курса валюты не должно означать повторную загрузку всех товаров.

Поскольку исходная стоимость в USD сохраняется отдельно, модуль может взять уже сохранённую цену и пересчитать только рублёвое значение. Для этого предусмотрена операция «Обновить цены по курсу».

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

Что создаётся в базе

После импорта данные распределяются между стандартными таблицами CS-Cart и отдельной таблицей для исходных цен.

Данные Где хранятся
Товар products + product_descriptions
Рублёвая цена product_prices + list_price
Исходная цена USD ip5_import_products_prices
Ключ импорта products.source_import_key
Изображения images + images_links + файлы
Категория Marketplace Import

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

Какие есть ограничения

У текущей реализации есть несколько особенностей. Ответы API не кэшируются, поэтому при запуске импорт обращается непосредственно к сайту-источнику.

Импорт выполняется в рамках HTTP-запроса, без фоновой обработки, поэтому большой каталог может обрабатываться достаточно долго. Для защиты от бесконечного обхода страниц максимальное количество страниц ограничено 200.

Остатки товаров не синхронизируются: для импортируемых позиций используется tracking = O. SEO-имя изменяется только при первом создании товара, чтобы последующие обновления не меняли существующий URL.

Модуль учитывает storefront_id, поэтому его можно использовать в мультивитринных установках CS-Cart.

Когда нужен импорт с одного сайта на другой

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

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

Источник остаётся источником данных, а новый магазин получает собственные карточки товаров CS-Cart, которые можно обновлять по мере необходимости.

В проектах, где используется cs cart разработка сайтов, такой механизм можно дополнительно расширять: добавлять фоновую обработку, кэширование, дополнительные правила пересчёта цен, обработку характеристик и другие функции в зависимости от структуры каталога.

Итоги

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

В реализованном решении эту задачу закрывают несколько механизмов: source_import_key определяет уже импортированные товары, исходные цены сохраняются отдельно, рублёвые значения рассчитываются по актуальному курсу, а изображения полностью обновляются при повторном импорте.

Дополнительно предусмотрены тестовый импорт одного товара и отдельный пересчёт цен без повторной загрузки каталога.

В результате товары становятся обычными позициями локального магазина CS-Cart, а сам импорт можно использовать повторно и при необходимости адаптировать под конкретную структуру каталога в рамках разработки и сопровождения сайтов.