← Всі статті
24 червня 2026 р.

Як автоматично імпортувати товари постачальників в OpenCart або WooCommerce

Ручне копіювання товарів з прайс-листа постачальника щотижня витрачає години. Ось як автоматизувати імпорт товарів в OpenCart або WooCommerce із CSV, XML або API постачальника.

Проблема ручного імпорту

Більшість власників інтернет-магазинів щотижня витрачають години на одне й те саме: завантажують прайс-лист постачальника, знаходять зміни, оновлюють товари в адмінпанелі. Іноді це 50 товарів. Іноді — 5 000.

Це саме той тип повторюваних завдань, які варто автоматизувати. Налаштував один раз — і воно працює самостійно.

Що потрібно знати спочатку

Перш ніж щось будувати, дайте відповіді на ці запитання:

  1. У якому форматі ваш постачальник надає дані? — CSV, Excel, XML, JSON API, FTP?
  2. Як часто вони оновлюються? — Щодня? Щотижня? У реальному часі?
  3. Що потрібно оновлювати? — Тільки ціни? Рівень запасів? Нові товари? Опис?
  4. Як ви зіставляєте товари? — SKU? Штрих-код? Назва товару?

Відповіді визначають, що саме вам потрібно створити.

Випадок 1: Постачальник надає файл CSV/Excel

Це найпоширеніший випадок. Постачальник надсилає файл електронною поштою, або ви завантажуєте його з його порталу.

Крок 1: Розбір файлу

import pandas as pd

df = pd.read_csv("supplier_prices.csv", encoding="utf-8")
# або для Excel:
# df = pd.read_excel("supplier_prices.xlsx")

print(df.columns.tolist())
# ['SKU', 'Name', 'Price', 'Stock', 'Category']

Крок 2: Зіставлення з товарами вашого магазину

Ваш магазин має власні ID товарів. Потрібно зіставити SKU постачальника з вашими внутрішніми ID:

import sqlite3

# Створюємо словник: supplier_sku -> your_product_id
conn = sqlite3.connect("your_store.db")  # або використовуйте БД WooCommerce/OpenCart
sku_map = dict(conn.execute(
    "SELECT sku, product_id FROM products"
).fetchall())

for _, row in df.iterrows():
    product_id = sku_map.get(row["SKU"])
    if product_id:
        update_product(product_id, price=row["Price"], stock=row["Stock"])
    else:
        # Новий товар від постачальника — створюємо або записуємо для ручної перевірки
        log_new_product(row)

Крок 3: Оновлення через API або базу даних

WooCommerce REST API (рекомендовано — не потрібен прямий доступ до БД):

import requests

def update_woo_product(product_id, price, stock, api_url, key, secret):
    r = requests.put(
        f"{api_url}/wp-json/wc/v3/products/{product_id}",
        auth=(key, secret),
        json={
            "regular_price": str(price),
            "stock_quantity": int(stock),
            "manage_stock": True,
        }
    )
    return r.json()

OpenCart — найпростіше через пряме оновлення бази даних:

import pymysql

def update_opencart_price(product_id, price, stock, db):
    with db.cursor() as cur:
        cur.execute(
            "UPDATE oc_product SET price = %s, quantity = %s WHERE product_id = %s",
            (price, stock, product_id)
        )
    db.commit()

Випадок 2: Постачальник надає XML-фід

Поширено серед постачальників автозапчастин і деяких оптових платформ.

import xml.etree.ElementTree as ET

tree = ET.parse("supplier_catalog.xml")
root = tree.getroot()

for product in root.findall(".//product"):
    sku = product.find("sku").text
    price = float(product.find("price").text)
    stock = int(product.find("quantity").text)
    update_product_by_sku(sku, price, stock)

Для великих XML-файлів (100MB+) використовуйте ітеративний розбір:

for event, elem in ET.iterparse("large_catalog.xml", events=("end",)):
    if elem.tag == "product":
        process_product(elem)
        elem.clear()  # звільнення пам'яті

Випадок 3: У постачальника є API

Найчистіший варіант. Отримайте облікові дані API від постачальника та звертайтеся до їхньої кінцевої точки:

import requests

def fetch_supplier_stock(api_key):
    r = requests.get(
        "https://supplier.com/api/v1/products",
        headers={"Authorization": f"Bearer {api_key}"},
        params={"updated_since": "2025-01-01"}
    )
    return r.json()["products"]

Автоматизація розкладу

Запускайте імпорт на VPS за допомогою cron:

# Оновлювати ціни кожного дня о 2:00 ночі
0 2 * * * /usr/bin/python3 /home/user/importer/run.py >> /home/user/importer/import.log 2>&1

Або для постачальників, які оновлюються в реальному часі, опитуйте кожні кілька годин:

0 */4 * * * /usr/bin/python3 /home/user/importer/run.py

Обробка помилок і крайових випадків

Хороший скрипт імпорту враховує таке:

  • Проблеми з кодуванням — CSV постачальників часто у Windows-1251 або Latin-1: pd.read_csv(f, encoding="cp1251")
  • Формат ціни — "1.234,56" (європейський) проти "1,234.56" (американський): очищайте перед розбором
  • Відсутні товари — записуйте нові SKU постачальника, яких ще немає у вашому магазині
  • Обнулення залишків — вирішіть: приховати товар або показувати "немає в наявності"?
  • Збої імпорту — оберніть у try/except, надішліть сповіщення в Telegram, якщо імпорт не вдався
import telebot

bot = telebot.TeleBot("YOUR_TOKEN")
ADMIN_CHAT = 123456789

def notify(msg):
    bot.send_message(ADMIN_CHAT, msg)

try:
    count = run_import()
    notify(f"✅ Імпорт завершено: оновлено {count} товарів")
except Exception as e:
    notify(f"❌ Помилка імпорту: {e}")

Скільки це зазвичай коштує

Базовий скрипт синхронізації цін/залишків: 100–150 $ — читає CSV або XML, оновлює ціни та залишки, запускається щодня через cron.

З додаванням нових товарів, завантаженням зображень, зіставленням категорій: 200–350 $ — більше логіки для зіставлення категорій, обробки нових товарів, завантаження та зміни розміру зображень.

Кілька постачальників з вирішенням конфліктів: 300–500 $ — об'єднання фідів від кількох постачальників, вибір найкращої ціни, обробка різних форматів SKU.

Якщо ви витрачаєте години на ручний імпорт щотижня, розкажіть мені про формат вашого постачальника та платформу магазину — я назву вам конкретну суму.

Потрібна допомога з цим?

DevCev Digital спеціалізується саме на таких задачах. Розкажіть що потрібно — відповімо протягом кількох годин.

Безкоштовна діагностика →Автоматизація та веб-скрапінг
← Назад до блогуЄ проєкт? Поговоримо →