Niestandardowe moduły i wtyczki to kod pisany pod konkretny proces w Twojej firmie, a nie pod proces wymyślony przez autora wtyczki z marketplace. Problem rzadko leży w samym kodzie — leży w organizacji: kto jest właścicielem plików, gdzie one leżą, jak je wdrażać i kto je aktualizuje po zmianie wersji PrestaShop albo WordPressa. Ten tekst dotyczy właśnie strony organizacyjnej: co ustalić przed startem, czego pilnować w trakcie i co zostawić po wdrożeniu, żeby za rok nie płacić drugi raz za to samo.
Moduł PrestaShop to katalog w /modules/ — na przykład /modules/mojmodul/. W środku musi leżeć plik główny o tej samej nazwie (mojmodul.php) z klasą dziedziczącą po Module, plik config.xml oraz metody install() i uninstall(). Moduł podpina się pod hooki (registerHook('displayOrderConfirmation'), hookActionValidateOrder), a jego ustawienia trafiają do tabeli ps_configuration i pokazują się w back office przez getContent() oraz HelperForm.
Wtyczka WordPress to katalog w /wp-content/plugins/moja-wtyczka/ z plikiem, który ma nagłówek Plugin Name. Logikę podpinasz przez add_action() i add_filter(), a czynności przy włączaniu i wyłączaniu przez register_activation_hook() i register_deactivation_hook(). WooCommerce dokłada własne punkty zaczepienia, np. woocommerce_checkout_create_order albo woocommerce_cart_calculate_fees. Całość to standard opisany w [dokumentacji dla deweloperów PrestaShop](https://devdocs.prestashop-project.org/).
Różnica między modułem a kodem doklejonym do szablonu jest praktyczna, nie estetyczna. Jeśli walidację NIP wpiszesz w functions.php motywu, pierwsza aktualizacja motywu ją usunie, a zmiana motywu zabierze ją na zawsze. Kod w module lub wtyczce leży osobno, wyłączasz go jednym kliknięciem i przenosisz na inną instalację bez kopiowania fragmentów z szablonu.
Osobny temat to override. W PrestaShop moduł może nadpisać plik core, wrzucając własną wersję do /override/classes/ albo /override/controllers/front/. Brzmi wygodnie, ale przy aktualizacji PrestaShop nadpisane pliki nie idą za zmianami w core — działają na starej logice, a po większym skoku wersji potrafią przestać działać. Sięgaj po override tylko wtedy, gdy nie istnieje hook, i zapisz to w dokumentacji projektu. Jak ułożyć całą tę organizację — od właściciela plików po sposób wdrażania — opisujemy w materiale o [organizacji niestandardowych modułów i wtyczek](https://dropdigital.pl/niestandardowe-moduly-i-wtyczki-zamosc-organizacja).
Zanim zamówisz kod, sprawdź, czy problemu nie rozwiąże konfiguracja albo wtyczka premium. Poniżej siedem sygnałów, które realnie przemawiają za własnym rozwiązaniem.
Próg opłacalności policz na kartce. Jeśli płacisz 1500 zł rocznie za trzy licencje, po trzech latach to 4500 zł i nadal nic nie jest Twoje. Własny moduł kupujesz raz.
Kontrprzykład, żeby nie sprzedawać usługi na siłę: standardowy koszyk, zwykła bramka płatnicza (Przelewy24, PayU, Stripe mają oficjalne integracje) i newsletter to miejsca, w których własny kod to strata pieniędzy. Konfiguracja w zupełności wystarcza.
Nie ma cennika z sufitu. Jest zakres prac i godziny. Poniżej typowy podział dla jednego niestandardowego modułu lub wtyczki.
| Etap | Zakres | Godziny |
|---|---|---|
| Analiza i brief | wywiady, opis procesu, lista wyjątków | 4-8 h |
| Projekt techniczny | hooki, struktura bazy, integracje, model danych | 4-10 h |
| Implementacja | kod, panel konfiguracji, obsługa błędów | 16-60 h |
| Testy i poprawki | scenariusze brzegowe, zamówienia testowe, płatności | 8-20 h |
| Wdrożenie i dokumentacja | wgranie, migracja ustawień, opis dla klienta | 4-8 h |
Trzy scenariusze z życia. Prosty: walidacja NIP i REGON przy zamówieniu B2B, z blokadą złego numeru i komunikatem w koszyku — 20-35 h. Średni: integracja z kurierem albo nietypowa wysyłka paletowa z liczeniem stref i gabarytów — 40-80 h. Duży: integracja z ERP lub systemem księgowym, synchronizacja stanów i statusów w dwie strony — 80-180 h.
Rozstrzał 16-60 h w implementacji to nie niechlujstwo wyceny. To różnica między modułem czytającym jedno pole a modułem, który synchronizuje stany magazynowe i obsługuje konflikty, gdy ktoś kupi ostatnią sztukę w sklepie i w BOK-u w tej samej minucie.
Koszt integracji z ERP zależy głównie od jednej rzeczy: czy dostawca udostępnia API (REST, SOAP, webhooki), czy trzeba pracować na plikach wymiany (CSV, XML na FTP). W drugim przypadku dochodzi cykl importu, obsługa błędów, kolejkowanie, cron i uzgadnianie rozjazdów — wycena rośnie nawet dwukrotnie, mimo że sam „kod” wygląda podobnie.
Kwotę liczysz sam: godziny × stawka z umowy. Pamiętaj, że cena kodu to nie całość. Dochodzi utrzymanie: po każdej aktualizacji PrestaShop, WooCommerce, PHP albo motywu trzeba sprawdzić, czy moduł nadal działa. Realnie 2-6 h rocznie, a przy mocno powiązanych integracjach więcej — opisujemy to w materiale o [utrzymaniu i opiece technicznej sklepów](https://dropdigital.pl/utrzymanie-i-opieka-techniczna-sklepow-szczebrzeszyn).
Wdrożenie niestandardowego modułu da się rozłożyć na osiem etapów. Każdy kończy się dokumentem albo decyzją do podpisu, a nie kolejnym „spotkaniem statusowym”.
1–3. Rozmowa, spisanie procesu, brief i wycena. Pierwsze spotkanie trwa 60–90 minut i kończy się opisem procesu w 10–20 zdaniach oraz listą wyjątków. Brief musi zawierać: proces opisany zdaniami, 2–3 przykłady prawdziwych danych (konkretne zamówienie, konkretny produkt) oraz zachowanie systemu w sytuacjach brzegowych — produkt bez stanu, klient chce fakturę na inne dane niż w zamówieniu, kod rabatowy wygasł, zwrot częściowy. Wycena powstaje w godzinach: na przykład 40 h implementacji, 8 h testów, 4 h dokumentacji. Jeśli zakres się zmieni, zmienia się liczba godzin, a nie stawka.
4–6. Staging, implementacja, testy scenariuszowe. Staging to kopia plików i bazy na tej samej wersji PHP oraz tej samej wersji PrestaShop albo WordPressa/WooCommerce co produkcja. Testy robi się na prawdziwych danych: 30–50 zamówień z ostatniego miesiąca plus scenariusze wyjątków z briefu. Gdy sklep generuje sprzedaż, testowanie na produkcji oznacza, że każdy błąd kosztuje realne zamówienia i maile od klientów.
7–8. Wdrożenie i przekazanie. Publikacja poza godzinami szczytu — najczęściej 6:00–8:00 albo po 22:00 — po kopii zapasowej plików i bazy oraz z gotowym planem wycofania. Na koniec dokumentacja: instrukcja dla osoby obsługującej zamówienia, opis techniczny i szkolenie 1–2 h. To moment, w którym przechodzisz do utrzymania i opieki technicznej sklepu — bez tego etapu za rok nikt nie będzie wiedział, dlaczego moduł działa tak, a nie inaczej.
Realny czas: od 2 tygodni (jeden moduł, jedna integracja, brak zmian w wyglądzie) do 8 tygodni i więcej (integracja z ERP, płatnościami i magazynem, wielosklepowość, migracja danych).
| Etap | Efekt | Typowy czas |
|---|---|---|
| Rozmowa i spisanie procesu | opis procesu w 10–20 zdaniach | 1–2 h |
| Brief akceptacyjny | dokument z listą wyjątków i przykładami danych | 2–5 dni |
| Wycena w godzinach | budżet godzinowy i stawka | 1–3 dni |
| Środowisko testowe (staging) | kopia sklepu na tej samej wersji PHP i CMS | 0,5–1 dnia |
| Implementacja | kod w repozytorium Git | 1–5 tygodni |
| Testy scenariuszowe | lista sprawdzonych przypadków i zgłoszonych błędów | 3–10 dni |
| Wdrożenie na produkcję | działający moduł, kopia zapasowa i plan rollbacku | 1–4 h |
| Dokumentacja i szkolenie | instrukcja, opis techniczny, szkolenie 1–2 h | 1–3 dni |
Technologia zmienia nie tylko kod, ale i ryzyko, które potem utrzymujesz. PrestaShop i WooCommerce mają inne sposoby rozszerzania systemu i inne miejsca, w których moduł potrafi narobić szkód.
PrestaShop. Moduł to katalog /modules/nazwa/ z plikiem nazwa.php, w którym klasa dziedziczy po Module. W install() rejestrujesz hooki, tworzysz tabele i dodajesz zakładkę w back office (klasa Tab), a konfigurację wystawiasz przez getContent() z HelperForm albo HelperOptions. Sensowna implementacja pracuje na hookach (hookDisplayHeader, hookActionOrderStatusPostUpdate, hookDisplayAdminOrder). Jeśli moduł wchodzi w pliki główne, robi to przez katalog /override/ — a wtedy każda aktualizacja PrestaShop wymaga sprawdzenia, czy override nadal pasuje. Przy wielosklepowości pamiętaj o Configuration::get() z id_shop_group i id_shop, inaczej jedno ustawienie rozleje się na wszystkie sklepy. Wersje PHP wspierane przez daną gałąź PrestaShop sprawdzasz w dokumentacji deweloperskiej PrestaShop — nie zgaduj i nie zakładaj, że „na pewno zadziała”.
WooCommerce. Wtyczka to plugin WordPress: nagłówek w pliku głównym, własne typy treści, REST API przez register_rest_route(). Zadania czasochłonne (synchronizacja stanów, wystawianie faktur, pobieranie danych z API kuriera) powinny iść przez kolejkę — w WooCommerce służy do tego Action Scheduler. Największe ryzyko to konflikty: dwie wtyczki podpinające się pod ten sam hook potrafią wzajemnie nadpisywać dane zamówienia.
Cache i wydajność. Moduł odpytujący zewnętrzne API przy każdej odsłonie strony to najczęstsza przyczyna skoku czasu ładowania. Progi Core Web Vitals to 2,5 s dla LCP, 200 ms dla INP i 0,1 dla CLS — samo jedno żądanie do API potrafi wyczerpać ten budżet. Dane z API buforuje się (transient albo Configuration, cache na 5–15 minut) lub przetwarza zadaniowo w tle.
Skala też ma znaczenie: sklep z 300 produktami i jedną integracją a sklep z 30 000 SKU, kilkoma magazynami i pięcioma integracjami to dwa różne projekty. Przy tym drugim cache i kolejki to osobny etap prac, a nie dodatek na końcu.
| Element | PrestaShop | WooCommerce |
|---|---|---|
| Struktura | katalog /modules/, plik główny z klasą Module | wtyczka WordPress z nagłówkiem Plugin Name |
| Rozszerzanie bez ingerencji w core | hooki i rejestracja w registerHook() | hooki WordPress i REST API |
| Główne ryzyko | katalog /override/ i zgodność z aktualizacjami | konflikty między wtyczkami |
| Konfiguracja | getContent(), HelperForm, zakładka w back office | strona ustawień w panelu WordPressa |
| Zadania w tle | cron i przetwarzanie po hookach | Action Scheduler |
| Cache danych z API | buforowanie w Configuration lub cache plus cron | transient plus Action Scheduler |
| Wersje PHP | macierz zgodności zależna od gałęzi PrestaShop | wymagania WordPressa i hostingu |
Nie chodzi o to, żeby wykonawca był idealny. Chodzi o to, żebyś przed podpisem umowy wiedział, co dokładnie kupujesz i co zostaje u Ciebie po zakończeniu projektu.
/override/classes i /override/controllers. Zapytaj wprost o listę plików głównych modyfikowanych przez moduł. Dobra odpowiedź: „zero override” albo krótka, uzasadniona lista.Zanim podpiszesz, ustal też właściciela plików: kto trzyma repozytorium, kto ma dostęp do serwera i co się dzieje, gdy współpraca się kończy. Kolejność tych ustaleń — od briefu po przekazanie — opisaliśmy w artykule Niestandardowe moduły i wtyczki Zamość: jak to zorganizować.
Wdrożenie modułu to nie koniec projektu, a początek jego utrzymania. W praktyce rozsądny budżet na opiekę nad jednym niestandardowym modułem to 15–25% wartości wdrożenia rocznie. Jeśli wykonawca twierdzi, że moduł nie wymaga żadnej opieki, najczęściej oznacza to, że nikt tej pracy nie wycenił — a nie że nie istnieje.
Co konkretnie wchodzi w utrzymanie:
var/logs w PrestaShop, wp-content/debug.log w WordPressie, log błędów PHP na serwerze.Kwestia PHP jest krytyczna, bo każda nowa gałąź wycofuje stare funkcje i zachowania. Kod pisany pod PHP 7.4 potrafi przestać działać na 8.1 i 8.2 — nie dlatego, że był zły, ale dlatego, że nikt go nie utrzymywał. Dlatego warto pilnować zgodności z aktualnym wsparciem, o którym pisze dokumentacja dla deweloperów PrestaShop.
SLA nie musi być rozbudowane, ale musi być zapisane. Największy błąd to obiecanie „szybkiej reakcji” bez liczb.
| Element SLA | Przykładowy zapis w umowie |
|---|---|
| Czas reakcji | 4 godziny w dni robocze 9:00–17:00 |
| Czas rozwiązania — błąd krytyczny (sklep nie przyjmuje zamówień) | do 8 godzin od potwierdzenia zgłoszenia |
| Czas rozwiązania — błąd zwykły | 1–3 dni roboczych |
| Kanał zgłoszeń | dedykowany adres e-mail lub panel ticketowy; telefon tylko jako eskalacja |
| Kto odbiera zgłoszenie | imiennie wskazana osoba plus zastępca na czas urlopu |
W praktyce 90% pracy nad modułem nie wymaga obecności na miejscu. Potrzebny jest dostęp do panelu administracyjnego, do repozytorium kodu i do kopii bazy na środowisku testowym. To wystarcza, żeby napisać moduł, wdrożyć go i utrzymywać. Wizyta na miejscu ma sens w trzech sytuacjach:
Drugi aspekt to godziny pracy. Zgłoszenie awarii o 9:00 rano powinno trafić do kogoś, kto w tym momencie pracuje, a nie do zespołu, który obudzi się o 15:00 naszego czasu. Dlatego przy wyborze wykonawcy warto ustalić wprost: w jakich godzinach odbierane są zgłoszenia, w jakim języku i czy osoba odbierająca telefon rozumie kontekst sklepu, czy tylko przekazuje zgłoszenie dalej.
Lokalny kontekst ma jeszcze jedną warstwę praktyczną: firmom z Lubelszczyzny i wschodniej Polski najbliższym większym centrum technicznym jest zwykle Zamość. To ma znaczenie głównie przy wdrożeniach wymagających obecności — a zasady organizacji takiego projektu opisaliśmy przy okazji tematu niestandardowych modułów i wtyczek dla Zamościa.
Nie chodzi więc o to, żeby deweloper był z tej samej ulicy. Chodzi o to, żeby był osiągalny wtedy, gdy sklep nie sprzedaje.
Ta lista ma jedną funkcję: wrócić do niej przed rozmową z wykonawcą, a nie po podpisaniu umowy. Sprawdź trzy obszary.
1. Pytania do wykonawcy. Kto jest autorem kodu i czy przenosi prawa majątkowe? Gdzie fizycznie leży kod — w repozytorium Git u Ciebie, u wykonawcy czy na serwerze produkcyjnym (to najgorszy wariant)? Czy jest dokumentacja: opis konfiguracji, lista hooków, wymagane wersje PHP i PrestaShop/WooCommerce? Co się dzieje po zakończeniu współpracy — dostajesz pełne repo z historią commitów czy tylko archiwum ZIP?
2. Zakres w umowie. Etapy z terminami, liczba godzin z rozbiciem na analizę, kod i testy, wyraźna lista tego, co jest poza zakresem (np. integracja z kolejnym API, migracja danych, poprawki po stronie szablonu). Warunki odbioru: kto testuje i na jakim środowisku. Warunki utrzymania: czy wdrożenie obejmuje jakiś okres gwarancji i co dokładnie on pokrywa.
3. Elementy techniczne przed wdrożeniem. Środowisko staging z kopią danych produkcyjnych. Kopia zapasowa plików i bazy wykonana bezpośrednio przed wgraniem. Plan wycofania (rollback): wiesz, który plik podmienić, żeby wrócić do poprzedniej wersji. Wpływ na czas ładowania — sprawdzony na realnym ruchu, nie na pustym sklepie; wskaźniki opisuje dokumentacja web.dev.
| Pytanie | Dobra odpowiedź | Sygnał ostrzegawczy |
|---|---|---|
| Gdzie jest repozytorium? | Git w Twoim organizacji, z historią commitów | „Kod trzymamy u siebie, damy ZIP na koniec” |
| Co po zakończeniu współpracy? | Przekazanie repo, dokumentacji i dostępów | Brak odpowiedzi lub „to się dogada później” |
| Jak wygląda rollback? | Wgranie poprzedniej wersji modułu plus restore kopii | „Przywrócimy z backupu hostingu” bez testu |
| Czy wdrożenie obejmuje testy obciążeniowe? | Tak, na staging z danymi zbliżonymi do produkcji | „Będzie szybko, to prosty moduł” |
Kod istnieje tylko na serwerze produkcyjnym — brak repozytorium, brak historii zmian.
Jak wykryć: Zadaj pytanie: pokaż mi wersję modułu, którą wdrożono w lutym. Jeśli odpowiedź brzmi „ta na FTP”, nie ma kontroli wersji.
Jak naprawić: Przenieś kod do prywatnego repozytorium Git z dostępem dla Twojej firmy. Wdrożenia rób przez deploy, nie przez ręczne wgrywanie plików na FTP.
Zmiany wklejone na sztywno do plików szablonu (theme) zamiast do modułu lub wtyczki.
Jak wykryć: Sprawdź, czy po aktualizacji szablonu funkcja znika albo sklep wygląda inaczej. To klasyczny objaw kodu doklejonego do widoku.
Jak naprawić: Przenieś logikę do modułu (PrestaShop) lub wtyczki (WordPress). W warstwie wyglądu używaj child theme, żeby aktualizacja rodzica niczego nie kasowała.
Nadmiarowe pliki w katalogu /override w PrestaShop, nadpisujące core bez dokumentacji.
Jak wykryć: Policz pliki w /override i sprawdź, czy ktoś w firmie wie, po co każdy z nich istnieje. Brak odpowiedzi oznacza, że nikt nie przewidzi skutków aktualizacji.
Jak naprawić: Ogranicz override do minimum, każdy plik opisz w notatce i przetestuj na stagingu przed aktualizacją PrestaShop. Preferuj hooki, które nie wymagają nadpisywania plików rdzenia.
Brak środowiska testowego — każda poprawka sprawdzana od razu na produkcji.
Jak wykryć: Jeśli wdrażanie zaczyna się od zdania „wyłączymy sklep na 20 minut i zobaczymy”, nie masz stagingu.
Jak naprawić: Postaw kopię sklepu z tą samą wersją PHP, MySQL i tej samej wersji PrestaShop/WooCommerce. Testy scenariuszowe rób na stagingu, na produkcję wchodź po nich.
Brak właściciela modułu i brak dokumentacji — nikt nie wie, kto go napisał ani co robi dany hook.
Jak wykryć: Poproś o listę hooków, na których opiera się moduł, oraz o opis konfiguracji. Brak takiej listy to brak dokumentacji.
Jak naprawić: Ustal w umowie przekazanie kodu, README z opisem funkcji i konfiguracji oraz krótkie szkolenie. Dopisz też procedurę bezpiecznego wyłączenia modułu, gdy coś zawiedzie.
Wszystko w jednym module-monolicie, gdzie jedna zmiana wymaga wdrożenia całości.
Jak wykryć: Sprawdź, czy poprawka ceny B2B wymaga wdrożenia modułu, który obsługuje wysyłkę paletową. Jeśli tak, odpowiedzialności są posklejane.
Jak naprawić: Rozdziel moduły według odpowiedzialności: integracja, logika cenowa, walidacja danych. Wtedy awaria jednego nie blokuje pozostałych, a wdrożenie jest mniejsze i tańsze.
Niestandardowy moduł lub wtyczka to normalny element dojrzałego sklepu, a nie obejście systemu. Największe ryzyko nie leży w samym kodzie, lecz w braku repozytorium, dokumentacji, stagingu i osoby odpowiedzialnej za aktualizacje. Ustal te cztery rzeczy przed startem prac, a wdrożenie, utrzymanie i ewentualna zmiana wykonawcy przestaną być problemem. Jeśli moduły już masz, zacznij od inwentaryzacji — to najtańszy krok o największym zwrocie.
Nie. Moduł w PrestaShop to zwykły katalog w /modules z plikiem głównym i hookami, a wtyczka WordPress to katalog w /wp-content/plugins korzystający z akcji i filtrów. To standardowy mechanizm rozszerzania systemu, dokładnie w tym celu zaprojektowany. Ryzyko pojawia się nie dlatego, że piszesz własny kod, ale wtedy, gdy nie ma repozytorium, dokumentacji i środowiska testowego.
To kwestia zapisu w umowie i powinna być rozstrzygnięta przed startem prac. Ustal, że po opłaceniu faktury prawa majątkowe do kodu przechodzą na Ciebie i że otrzymujesz pełne repozytorium. Bez tego zostajesz z działającym sklepem i bez możliwości zmiany wykonawcy.
Jeżeli masz repozytorium, dokumentację i listę hooków, nowy deweloper wdroży się w kilka dni. Jeżeli masz tylko pliki na FTP i jedną osobę, która „wie, jak to działa”, każda zmiana staje się kosztowna. Dlatego przekazanie kodu traktuj jako element wdrożenia, a nie uprzejmość na koniec projektu.
Przetrwa, o ile był napisany na hookach i nie nadpisuje plików rdzenia. Nadpisywanie przez /override to najczęstsze źródło problemów po aktualizacji, bo Twój plik zaczyna się rozjeżdżać z nową wersją core. Zanim wdrożysz aktualizację, przetestuj ją na stagingu z dokładnie tym samym zestawem modułów. Dokumentacja dla deweloperów PrestaShop (devdocs.prestashop-project.org) opisuje, które hooki są przewidziane do takich rozszerzeń — warto sprawdzić to jeszcze na etapie projektu.
Prosty moduł, np. walidacja NIP przy zamówieniu B2B, to zwykle kilka dni roboczych. Integracja z kurierem lub nietypowa wysyłka paletowa zajmuje zwykle 2–4 tygodnie, a integracja z ERP bywa projektem na 1–3 miesiące. Największym zmiennym czynnikiem nie jest samo pisanie kodu, ale czas na analizę, testy i uzgodnienia po stronie dostawcy zewnętrznego systemu.
Tak, ale tylko wtedy, gdy nie wpiszesz na sztywno identyfikatorów kategorii, statusów zamówienia ani stawek. Różnice między sklepami trzymaj w konfiguracji modułu, nie w kodzie. Jeśli planujesz wdrożenie w kilku miejscach, powiedz o tym na etapie briefu — wpłynie to na projekt techniczny i oszczędzi przepisywania.
Od inwentaryzacji: lista modułów, kto je napisał, co robią, na jakich hookach stoją i czy są w repozytorium. To zwykle jedno spotkanie i kilka godzin pracy, a daje pełny obraz ryzyka. Dopiero potem sensownie jest planować refaktor, łączenie modułów albo ich wygaszanie. Praktyczny opis takiego uporządkowania znajdziesz w artykule o organizacji niestandardowych modułów i wtyczek w Zamościu.
Jeśli chcesz uporządkować istniejące moduły albo zaplanować nowy, napisz do nas z krótkim opisem procesu — powiemy, czy wystarczy konfiguracja, czy potrzebny jest własny kod. Możemy też zacząć od samej inwentaryzacji i oceny ryzyka przed wdrożeniem.