Import dostawców i dropshipping dla PrestaShop 8 i 9
Instalacja, konfiguracja i automatyzacja importu od wielu dostawców (CSV, XML, JSON), marż, kombinacji i synchronizacji stanów magazynowych.
Wprowadzenie
Moduł Import dostawców & Dropshipping (nazwa techniczna dfsupplierfeed) automatycznie importuje i synchronizuje katalogi Twoich dostawców w PrestaShop 8 i 9. Obsługuje wielu dostawców i wiele plików w formatach CSV, XML i JSON, stosuje Twoje reguły marży, buduje kombinacje, łączy produkty ze sobą, synchronizuje stany przez cron i rozstrzyga duplikaty EAN13 na podstawie priorytetu dostawcy.
Moduł nie zastępuje natywnego importu CSV PrestaShop: uprzemysławia cykliczne importy z wielu źródeł, z automatycznymi marżami, kombinacjami i synchronizacją.
Instalacja
- W panelu administracyjnym przejdź do Moduły > Menedżer modułów, a następnie Wgraj moduł.
- Wybierz plik
dfsupplierfeed.zipi zatwierdź. - Po instalacji kliknij Konfiguruj.
Podczas instalacji moduł tworzy pięć tabel (dfsf_supplier, dfsf_feed, dfsf_rule, dfsf_product, dfsf_log) i generuje unikalny token crona.
Przegląd interfejsu
- Dashboard — liczniki i ostrzeżenie o plikach, których import trwa.
- Suppliers — dostawcy i priorytety.
- Feeds — pliki, analiza, mapowanie pól i opcje.
- Margin rules — reguły obliczania cen sprzedaży.
- Logs — szczegółowa historia importów.
- Settings & Cron — ustawienia ogólne, duże katalogi, adresy crona.
Krok 1 — Utwórz dostawców
W zakładce Suppliers dodaj dostawcę z nazwą, priorytetem (liczba całkowita, 1 jest najwyższy i rozstrzyga duplikaty EAN13), statusem aktywny oraz opcją Utwórz natywnego dostawcę PrestaShop, która uzupełnia też koszt zakupu w product_supplier.
Najlepsze priorytety (najniższe liczby) przypisz najbardziej wiarygodnym lub najtańszym dostawcom: to oni będą „posiadać” wspólne produkty.
Krok 2 — Utwórz plik i pozwól modułowi go przeanalizować
W zakładce Feeds utwórz plik z dostawcą, typem źródła (zdalny URL lub plik lokalny w katalogu sklepu) i formatem. Zapisz, a następnie kliknij przycisk lupy w wierszu pliku.
Moduł pobiera próbkę i wyświetla wykryty items_path, listę wszystkich faktycznie obecnych pól z przykładowymi wartościami oraz gotowe mapowanie, które można edytować przed zastosowaniem.
Numerowane kolumny ze zdjęciami są grupowane automatycznie, spakowane kolumny rozmiarów, kolumny kolorów i kolumny referencji powiązanych są rozpoznawane, a nazwy kolumn identyfikowane po angielsku, francusku, hiszpańsku, niemiecku i włosku.
Zawsze sprawdź propozycję przed zastosowaniem. Wielu dostawców przesyła sugerowaną cenę detaliczną tam, gdzie moduł oczekuje kosztu zakupu.
Krok 3 — Mapowanie pól
Mapowanie to obiekt JSON łączący kolumny lub węzły pliku z polami znormalizowanymi. 21 pól kanonicznych to:
name reference ean13 mpn cost quantity description description_short category manufacturer weight tax_rate image images group_reference attributes variants_stock variants_ean variants_reference variant_attribute related
Wymagane jest wyłącznie reference lub ean13.
Wiele źródeł dla jednego pola
{
"fields": {
"reference": "id",
"name": "name",
"cost": "wholesale_price",
"images": ["image_1", "image_2", "image_3", "image_4"]
}
}
W polu images importowane są wszystkie wypełnione kolumny. W każdym innym polu brana jest pierwsza niepusta wartość, co pozwala zapisać łańcuch zapasowy.
CSV
Powiąż każde pole z nagłówkiem kolumny lub z indeksem kolumny od 0. Separator jest wykrywany automatycznie, pola wielowierszowe w cudzysłowach są obsługiwane.
{
"fields": {
"name": "product_name",
"reference": "sku",
"ean13": "ean",
"cost": "price",
"quantity": "stock",
"category": "category",
"image": "image_url"
}
}
Wiersz, którego liczba kolumn nie zgadza się z nagłówkiem, jest odrzucany i liczony jako błąd. Bez tej kontroli wszystkie kolejne wartości byłyby przesunięte i zaimportowane po cichu.
XML
items_path wskazuje powtarzalny węzeł, na dowolnej głębokości. Ścieżki pól są względne wobec tego węzła, a @nazwa odczytuje atrybut.
{
"items_path": "products/product",
"fields": {
"reference": "@sku",
"name": "title",
"ean13": "ean",
"cost": "pricing/wholesale",
"quantity": "stock/quantity",
"image": "images/image"
}
}
Ponieważ ścieżki są względne wobec produktu, wartość obecna wyłącznie w węźle nadrzędnym nie może zostać odczytana: nawigacja .. nie istnieje.
JSON
items_path używa notacji z kropkami aż do tablicy produktów. Segment liczbowy odczytuje wpis tablicy: images.0 to pierwsze zdjęcie.
{
"items_path": "data.products",
"fields": {
"reference": "sku",
"name": "name",
"ean13": "barcode",
"cost": "prices.cost",
"quantity": "inventory.available",
"image": "images.0"
}
}
Zakładka Feeds zawiera szesnaście skomentowanych przykładów.
Krok 4 — Ustal marże
W zakładce Margin rules każda reguła oblicza cenę sprzedaży netto na podstawie kosztu zakupu netto: procent, współczynnik lub stały dodatek. Następnie stosowane jest opcjonalne zaokrąglenie psychologiczne.
Zakres i rozstrzyganie
Reguła może dotyczyć dostawcy, kategorii, obu lub być globalna. Wygrywa najbardziej szczegółowa, w kolejności: dostawca + kategoria, sam dostawca, sama kategoria, reguła globalna. Reguły kategorii obejmują także podkategorie. Bez żadnej reguły stosowana jest marża domyślna.
Priorytet EAN między źródłami
Gdy ten sam ean13 pojawia się w kilku plikach, dostawca o najlepszym priorytecie posiada produkt, pozostałe źródła są pomijane, a jeśli później dostawca o lepszym priorytecie dostarczy ten EAN, automatycznie przejmuje produkt.
Kombinacje
Obsługiwane są dwie struktury plików.
Jeden wiersz na wariant
Włącz Buduj kombinacje i zmapuj group_reference (identyczne dla wszystkich wariantów jednego produktu) i attributes (opcje, na przykład Rozmiar:M|Kolor:Czerwony).
Jeden wiersz na produkt, rozmiary spakowane w kolumnie
To najczęstsza struktura u hurtowników odzieży i bielizny:
sizes_stock : EU 70C | FR 85C:4,EU 70D | FR 85D:2,EU 75A | FR 90A:1
ean_codes : EU 70C | FR 85C:5901741925360,EU 70D | FR 85D:5901741925377
Włącz Podziel spakowane warianty i zmapuj variants_stock, a także variants_ean i variants_reference, jeśli plik je zawiera. Moduł dzieli wiersz na jedną kombinację na rozmiar i dopasowuje stan, EAN oraz numer po etykiecie. Trzy ustawienia towarzyszą polu wyboru: nazwa grupy atrybutów (domyślnie Taille), separator między wpisami (,) i separator między etykietą a wartością (:).
Podział następuje na ostatnim wystąpieniu separatora, więc etykieta taka jak EU 70C | FR 85C pozostaje czytelna.
Zaznacz pole przed pierwszym importem. Jeśli zaimportujesz najpierw bez niego, produkty powstaną bez group_reference: po włączeniu podziału moduł nie znajdzie tych produktów nadrzędnych i utworzy nowe, podwajając katalog.
Druga oś z kolumny pliku
Wielu dostawców wysyła kolor w osobnej kolumnie, podczas gdy rozmiary są spakowane. Zmapuj variant_attribute na tę kolumnę:
{
"fields": {
"reference": "id",
"name": "name",
"cost": "wholesale_price",
"variant_attribute": "color",
"variants_stock": "sizes_stock",
"variants_ean": "ean_codes"
}
}
Każda kombinacja produktu zyskuje wtedy drugą oś, pod grupą atrybutów dodatkowej kolumny ustawioną na pliku (domyślnie Couleur). Otrzymujesz kombinacje Rozmiar i Kolor, użyteczne dla filtrów.
Ponieważ każdy wiersz pliku to produkt w jednym kolorze, grupa Kolor ma tylko jedną wartość na produkt. Kolory nie są łączone w jedną kartę z wyborem koloru: do nawigacji między nimi służą produkty powiązane poniżej.
Produkty powiązane
Gdy plik wymienia inne kolory lub powiązane modele w kolumnie referencji, zaznacz Importuj produkty powiązane i zmapuj related:
{
"fields": {
"reference": "id",
"related": "other_colors"
}
}
Kolumna zawiera listę referencji dostawcy oddzielonych przecinkami. Powiązania powstają jako akcesoria PrestaShop i pojawiają się w bloku produktów powiązanych Twojego szablonu.
Rozwiązywanie następuje po odczytaniu całego pliku, ponieważ referencja bardzo często wskazuje produkt znajdujący się dalej. Trzy zachowania:
- referencja wskazująca na sam produkt jest pomijana, co zdarza się często, bo wielu dostawców wymienia całą grupę przy każdym elemencie;
- referencja wskazująca produkt nieobecny w pliku jest pomijana bez liczenia jako błąd: przy eksporcie filtrowanym po kategorii dotyczy to zwykle jednej piątej referencji;
- istniejące akcesoria nigdy nie są usuwane, więc powiązania dodane ręcznie przetrwają. W zamian zmieniona przez dostawcę grupa pozostawia stare powiązania.
Liczba utworzonych powiązań pojawia się w komunikacie końcowym i w osobnej kolumnie dziennika.
Co plik może nadpisać
Pięć pól wyboru na plik decyduje, które pola są synchronizowane: ceny, stan, nazwa, opisy, zdjęcia. Domyślnie zaznaczone są tylko ceny i stan.
Jeśli przepisujesz karty produktów pod SEO, odznacz nazwę i opisy po pierwszym imporcie.
Produkty wycofane z katalogu dostawcy
Każdy plik wybiera swoje zachowanie: nie ruszać, wyzerować stan, wyłączyć lub jedno i drugie. Akcja wykonuje się po zakończeniu pełnego importu i tylko na produktach tego pliku.
W dropshippingu wyzerowanie stanu jest najbezpieczniejsze: produkt nie jest już sprzedawalny, ale zachowuje adres URL i pozycję.
Kategorie i waluty
Pole category przyjmuje prostą nazwę lub pełną ścieżkę, na przykład Start > Biuro > Krzesła. Separator jest konfigurowalny per plik, a opcja Twórz brakujące kategorie tworzy nieistniejące poziomy.
Jeśli dostawca fakturuje w innej walucie, wybierz ją na pliku: koszty są przeliczane na domyślną walutę sklepu.
Duże katalogi
Pliki są czytane strumieniowo: zużycie pamięci nie zależy od rozmiaru pliku. Przetwarzanie dzielone jest na wznawialne partie. Dwa ustawienia: punkt zapisu co N produktów (domyślnie 2000) i budżet czasu na przebieg (domyślnie 120 s).
Podział zwielokrotnia wolumen: plik z 7300 produktami wariantowymi daje ponad 33 000 kombinacji, czyli około 41 000 obiektów przy pierwszym pełnym imporcie. Zaplanuj kilka przebiegów i przetestuj na sklepie testowym.
Ręczne uruchomienie importu
- Pełny import (ikona odtwarzania) — aktualizuje powiązane produkty i tworzy brakujące, jeśli plik na to pozwala.
- Synchronizacja stanu (ikona odświeżania) — aktualizuje tylko ceny i ilości już powiązanych produktów.
Z panelu administracyjnego przebieg jest ograniczony do 45 sekund.
Automatyzacja przez cron
# Synchronizacja stanu co godzinę
0 * * * * curl -sL "https://twojsklep.tld/index.php?fc=module&module=dfsupplierfeed&controller=cron&token=TWOJ_TOKEN&mode=stock" > /dev/null
# Pełny import każdej nocy
30 3 * * * curl -sL "https://twojsklep.tld/index.php?fc=module&module=dfsupplierfeed&controller=cron&token=TWOJ_TOKEN&mode=full" > /dev/null
Parametry opcjonalne: &id_feed=N i &budget=600.
Po wygenerowaniu nowego tokena zaktualizuj zadania crona: stary adres zwróci błąd 403.
Ustawienia ogólne
- Nowe produkty od razu aktywne — domyślnie wyłączone.
- Wyłączanie produktów niedostępnych u dostawcy, z ponownym włączeniem po powrocie stanu.
- Marża domyślna, gdy żadna reguła nie pasuje.
- Przechowywanie dzienników i automatyczne czyszczenie.
- Przy odinstalowaniu — usunąć dane lub zachować wszystko.
- Wyczyść pamięć podręczną plików i kursory w panelu konserwacji.
Monitorowanie i dzienniki
Zakładka Logs wypisuje każdy przebieg: plik, tryb, produkty przetworzone, utworzone, zaktualizowane, pominięte, błędne, brakujące, utworzone powiązania produktów, znacznik ukończenia z punktem wznowienia, czas wykonania oraz szczegóły pierwszych błędów.
Rozwiązywanie problemów
„Malformed CSV row: 23 columns instead of 22″
Wiersz zawiera nieoznaczony separator lub cudzysłów w polu tekstowym. Jest odrzucany.
„Feed file not found or outside shop directory”
Dla źródła plikowego ścieżka musi wskazywać czytelny plik w katalogu sklepu.
Analiza nie znajduje produktów
Wpisz items_path ręcznie w mapowaniu i uruchom analizę ponownie.
Produkty są tworzone, ale niewidoczne w sklepie
To zachowanie domyślne: utworzone produkty są wyłączone.
Kombinacje nie są tworzone
Sprawdź, czy odpowiednie pole wyboru jest zaznaczone, czy wymagane pola są zmapowane i czy separatory odpowiadają plikowi.
Mój katalog podwoił się po włączeniu podziału
Import uruchomiono przed zaznaczeniem pola. Usuń produkty utworzone przez ten plik, wyczyść kursory i uruchom ponownie.
Mało lub brak utworzonych produktów powiązanych
Powiązania są rozwiązywane dopiero na końcu zakończonego pełnego importu: przy dużym pliku przetwarzanym w kilku przebiegach pojawiają się w ostatnim. Sprawdź też, czy referencje kolumny odpowiadają polu zmapowanemu na reference.
Ceny wydają się za wysokie lub za niskie
Sprawdź koszty brutto, walutę, obowiązującą regułę marży i czy pole zmapowane na cost to rzeczywiście koszt zakupu.
Import nigdy się nie kończy
Przy bardzo dużym pliku to normalne: postępuje przebiegami.
Zgodność
- PrestaShop 8.0 do 9.x, PHP 7.4 do 8.3.
- Bez nadpisywania rdzenia PrestaShop.
- Multisklep: utworzone produkty są przypisywane do sklepów bieżącego kontekstu.
- Interfejs przetłumaczony na angielski i francuski.