Автоматизация обновления товаров в OpenCart
При каталоге в 3000 товаров ручное обновление цен и остатков отнимает до 40 часов в месяц. Ошибки: пропущенные позиции, неверные цены, потеря вариантов. Убытки от неправильных цен могут быть значительными. Мы автоматизируем импорт/экспорт под ключ — от первичной загрузки CSV до двусторонней синхронизации с 1С и ERP. За 5 лет провели более 50 интеграций для каталогов от 500 до 50 000 SKU. Экономия средств после внедрения существенна для каталога среднего размера. Типичные последствия отсутствия автоматизации: срыв сроков поставок, убытки от неправильных цен, дублирование работы. Наше решение исключает человеческий фактор и обеспечивает актуальность каталога без участия оператора. Свяжитесь с нами — сократите время на обновление каталога.
Как автоматизация решает проблему потери данных?
Внедряем валидацию на этапе загрузки: проверка кодировки, дубликатов, обязательных полей. Например, при импорте 10 000 строк с неверной кодировкой скрипт сразу подсветит ошибки и не допустит запись «битых» данных. Регулярные обновления цен и остатков по расписанию (cron) — без участия оператора. Даже при ежедневном обновлении 5000 позиций загрузка занимает не более 15 минут. При несовместимости форматов конвертируем из windows-1251 в UTF-8, заменяем разделители, маппим нестандартные булевы значения.
Как мы гарантируем качество импорта?
Перед каждым запуском создаётся бэкап базы данных. Импорт выполняется в транзакции — при ошибке можно откатить изменения. Лог содержит детальную статистику: сколько создано, обновлено, пропущено. Все ошибки записываются в отдельный файл для анализа.
Мы используем собственные скрипты на PHP, которые напрямую работают с OpenCart framework. Это даёт полный контроль над процессом и производительность, недоступную стандартным модулям. Кастомный скрипт обрабатывает 1000 товаров за 10 секунд, тогда как стандартный модуль — за 2 минуты.
Когда нужен кастомный скрипт вместо стандартного модуля?
Стандартный CSV-импорт через admin > Catalog > Import имеет жёсткий формат: фиксированные колонки, нет поддержки вариантов, атрибутов, SEO-полей и мультиязычности. Подходит только для простейших случаев.
Таблицы, затрагиваемые при полном импорте:
| Таблица | Содержимое |
|---|---|
oc_product |
Основные поля: цена, вес, модель, статус |
oc_product_description |
Тексты по языкам |
oc_product_to_category |
Привязка к категориям |
oc_product_to_store |
Привязка к магазинам |
oc_product_attribute |
Значения атрибутов |
oc_product_option |
Опции (цвет, размер) |
oc_product_option_value |
Значения опций с остатком |
oc_product_image |
Дополнительные изображения |
oc_product_to_layout |
SEO layout |
Для сложных маппингов используем кастомные скрипты или модули. Сравнение популярных модулей:
| Модуль | Форматы | Гибкость | Цена |
|---|---|---|---|
| QuickAdmin / Журнал3 | CSV | Низкая | Бесплатно в некоторых темах |
| Spreadsheet Price Manager | Google Sheets API | Средняя | Платный |
| Import/Export Pro (iSenseLabs) | CSV, XML, XLS, JSON | Высокая | Платный |
| D-Import | CSV, XML | Высокая (производительность) | Платный |
Кастомный скрипт превосходит любой модуль по гибкости: он может обрабатывать любые форматы, распараллеливать загрузку изображений и интегрироваться с любым API.
Кастомный импорт через скрипт
Пример CLI-скрипта для импорта
<?php // tools/import_products.php define('DIR_APPLICATION', __DIR__ . '/../admin/'); define('DIR_SYSTEM', __DIR__ . '/../system/'); // ... остальные константы require_once(DIR_SYSTEM . 'startup.php'); require_once(DIR_APPLICATION . 'config.php'); $registry = new Registry(); // инициализация DB, Config, Load... $csv = new SplFileObject('/tmp/products_feed.csv'); $csv->setFlags(SplFileObject::READ_CSV | SplFileObject::SKIP_EMPTY); $csv->setCsvControl(';', '"'); $headers = $csv->current(); // первая строка — заголовки $csv->next(); $db->query("SET foreign_key_checks = 0"); $db->query("SET unique_checks = 0"); while (!$csv->eof()) { $row = array_combine($headers, $csv->current()); $csv->next(); if (empty($row['model'])) continue; // Проверяем существование по model $existing = $db->query( "SELECT product_id FROM oc_product WHERE model = '" . $db->escape($row['model']) . "' LIMIT 1" ); if ($existing->num_rows) { $product_id = $existing->row['product_id']; // UPDATE $db->query("UPDATE oc_product SET price = '" . (float)$row['price'] . "', quantity = '" . (int)$row['quantity'] . "', date_modified = NOW() WHERE product_id = $product_id" ); } else { // INSERT + описание + категории // ... } } $db->query("SET foreign_key_checks = 1"); $db->query("SET unique_checks = 1"); Такой скрипт запускается по cron: 0 6 * * * php /var/www/opencart/tools/import_products.php >> /var/log/oc_import.log 2>&1
Какие форматы источников поддерживаются?
CSV от поставщика — самый распространённый. Проблемы: кодировка (windows-1251 vs UTF-8), разделитель (; vs ,), нестандартные булевы значения (да/нет, 1/0, true/false). Нормализация выполняется автоматически, но можно и вручную, например, через iconv и sed.
XML (YML — Яндекс.Маркет формат) — стандарт для российского рынка. Парсинг через SimpleXML или XMLReader (для больших файлов > 50 МБ).
REST API поставщика — получение данных по HTTP с пагинацией. Обрабатываем тысячи записей в минуту.
Экспорт для внешних систем
Выгрузка в Google Merchant Center (формат GMC) генерируется как RSS/Atom фид. Пример генерации:
// Генерация RSS/Atom фида для GMC header('Content-Type: application/xml; charset=utf-8'); echo '<?xml version="1.0" encoding="UTF-8"?>'; echo '<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">'; echo '<channel>'; $products = $db->query(" SELECT p.*, pd.name, pd.description FROM oc_product p JOIN oc_product_description pd ON pd.product_id = p.product_id WHERE p.status = 1 AND pd.language_id = 1 LIMIT 5000 "); foreach ($products->rows as $p) { echo '<item>'; echo '<g:id>' . $p['model'] . '</g:id>'; echo '<g:title><![CDATA[' . $p['name'] . ']]></g:title>'; echo '<g:price>' . number_format($p['price'], 2, '.', '') . ' RUB</g:price>'; echo '<g:availability>' . ($p['quantity'] > 0 ? 'in_stock' : 'out_of_stock') . '</g:availability>'; echo '</item>'; } echo '</channel></rss>'; Обработка изображений и логирование
Загрузка изображений по URL — узкое место при массовом импорте. Оптимальный подход: очередь + параллельная загрузка через curl_multi. Каждый импорт завершается отчётом:
Import started: feed.csv (4821 rows) Created: 12, Updated: 4791, Skipped: 18, Errors: 0 Import finished in 152s При ошибках в строке запись в отдельный файл import_errors.csv с номером строки и описанием.
Что входит в настройку
- Диагностика текущей структуры каталога и формата данных поставщика.
- Разработка скрипта импорта/экспорта с учётом ваших требований.
- Настройка расписания (cron) для автоматического обновления.
- Тестовый прогон на копии базы данных.
- Документация и инструкция по использованию.
- Гарантия на работу скрипта — 30 дней бесплатной поддержки.
Сроки
Настройка готового модуля с маппингом под конкретный формат поставщика: 1–2 дня. Кастомный скрипт с поддержкой XML/API, загрузкой изображений и логированием: 3–5 дней. Полноценная двусторонняя синхронизация с 1C или ERP: 1–3 недели в зависимости от сложности маппинга.
Свяжитесь с нами для оценки вашего проекта. Мы подготовим предложение с точными сроками и стоимостью. Получите консультацию — мы ответим на вопросы в течение часа.
Подробнее о CSV и официальной документации OpenCart.







