Moduł własny rozsypuje się rzadko z powodu złego kodu — częściej z powodu braku ustaleń: kto go pisze, gdzie się go testuje i co się dzieje, gdy przestaje działać.

Ten tekst zbiera stronę organizacyjną pracy nad niestandardowymi modułami i wtyczkami: repozytorium, środowisko testowe, kolejność wdrożeń, dokumentację i rollback.

Pozostałe sekcje artykułu odpowiadają na dwa pytania: kiedy wtyczka z katalogu przestaje wystarczać i jak policzyć koszt na trzy lata. Praktyczne rozwinięcie tematu organizacji pracy znajdziesz w tekście o niestandardowych modułach i wtyczkach Zamość.

Czym właściwie jest niestandardowy moduł i kiedy nim jest

Pod słowem „moduł” kryją się trzy różne rzeczy. Mieszanie ich kończy się źle policzonym budżetem i pretensjami po obu stronach.

PrestaShop. Moduł to katalog /modules/nazwa_modulu/ z plikiem głównym nazwa_modulu.php, w którym klasa dziedziczy po Module. Ma metody install() i uninstall(), rejestruje hooki przez registerHook() (np. displayHeader, actionCartSave, paymentOptions), a logikę frontu i panelu trzyma w kontrolerach oraz szablonach .tpl. To nie widzimisię wykonawcy — tak wygląda struktura modułu w dokumentacji PrestaShop i każdy moduł, który ma przetrwać aktualizację sklepu, musi się jej trzymać.

WordPress i WooCommerce. Wtyczka to plik z nagłówkiem Plugin Name, funkcje podpinane przez add_action() i add_filter(), opcjonalnie composer z autoloaderem, własne endpointy przez register_rest_route() i obsługa zamówień zgodna z HPOS.

Trzy kategorie rozwiązań, które trzeba rozdzielić:

Granica jest jedna: czy logika jest unikalna dla Twojego procesu. Wycena transportu drewna (stawka za m³, strefa odległości, dopłata za rozładunek) albo rezerwacja domku (kalendarz, sezon, minimum nocy, kaucja, blokada terminu po wpłacie) to nie konfiguracja. Żadna gotowa wtyczka nie zna Twoich stawek i Twoich reguł. Jeśli po każdym zamówieniu musisz coś dopisać ręcznie w panelu, to nie kwestia wprawy pracownika, tylko brakującego fragmentu kodu.

I uczciwa deklaracja: własny moduł to nie „lepsza wtyczka”. To narzędzie do jednego przypadku. Jeśli wtyczka za kilkaset złotych i dwie godziny konfiguracji załatwia sprawę, moduł pisany 20 godzin jest stratą. Warto rozdzielić warstwę techniczną od organizacyjnej — tę drugą opisujemy szerzej w tekście o niestandardowych modułach i wtyczkach Szczebrzeszyn.

7 sygnałów, że wtyczka z katalogu przestała wystarczać

Objawy, nie odczucia. Każdy punkt da się zmierzyć albo policzyć na kartce.

Jak to wykryć. W WordPressie w wp-config.php ustaw WP_DEBUG i WP_DEBUG_LOG na true, a WP_DEBUG_DISPLAY na false — log wyląduje w wp-content/debug.log. W PrestaShop w config/defines.inc.php włącz _PS_MODE_DEV_, dodatkowo logi znajdziesz w panelu w Advanced Parameters → Logs. Nigdy nie rób tego na produkcji — debugowanie pokazuje ścieżki i dane. Pomiar rób na staging: kopia plików i bazy, potem wyłączanie połowy wtyczek i zawężanie do winowajcy. Punktem odniesienia dla czasów są Core Web Vitals według web.dev.

Wtyczka vs moduł własny: rachunek na 3 lata

Zamień „podoba mi się / nie podoba” na arytmetykę. Policz dwa strumienie kosztów: A = (licencja roczna + godziny obejść × stawka) × liczba lat. B = godziny wdrożenia × stawka + godziny utrzymania × stawka × liczba lat. Wpisz to w jeden arkusz i porównaj.

Realne widełki godzinowe, które widzimy w projektach: prosty moduł integracyjny (dodatkowe pole w zamówieniu, eksport danych, walidacja NIP) to 12–24 h. Moduł z panelem administracyjnym i własną logiką (wycena, rezerwacje, reguły rabatowe) to 24–60 h. Integracja z ERP — stany, zamówienia, faktury — to 40–120 h, bo dochodzi uzgadnianie mapowania pól i testy na danych z magazynu.

Punkt break-even wypada zwykle między 18. a 30. miesiącem. Przesuwa się wcześniej, gdy pracy ręcznej jest powyżej czterech godzin w miesiącu, gdy sezon generuje skok zamówień albo gdy wtyczka nie obsługuje funkcji krytycznej dla sprzedaży — wtedy nie liczy się koszt, tylko czy sklep w ogóle sprzedaje.

Koszty ukryte, o których nikt nie pamięta przy wycenie: migracja danych ze starych rekordów, szkolenie pracowników (2–4 h), testy na produkcji przed sezonem (kopia bazy, zamówienia testowe, płatność w trybie sandbox) oraz utrzymanie — moduł własny nie aktualizuje się sam. Z drugiej strony masz rollback i pełną kontrolę nad tym, co dzieje się w kodzie. Jak ułożyć repozytorium, środowisko testowe i kolejność wdrożeń, opisujemy w tekście o tym, jak zorganizować pracę nad niestandardowym modułem.

PozycjaWtyczka z kataloguModuł własny
Koszt startowylicencja + kilka godzin konfiguracjianaliza, projekt i kod: 12–120 h zależnie od przypadku
Koszt rocznyodnowienie licencji × liczba wtyczek + wsparcieaktualizacje i drobne poprawki: zwykle 2–6 h
Praca ręcznagodziny na obejścia liczone co miesiącpo wdrożeniu spada w okolice zera
Ryzyko przestojuzależysz od tempa aktualizacji dostawcyzależysz od swojego wykonawcy i repozytorium
Zmiana wymagańczęsto brak możliwości, trzeba obejść w panelumożliwa, rozliczana godzinowo

Kiedy naprawdę opłaca się pisać moduł od zera

Nie każdy pomysł na funkcję w sklepie zasługuje na własny moduł. W praktyce kwalifikują projekt cztery kryteria — jeśli spełnia co najmniej dwa, własny kod ma sens. Jeśli żadne, kupujesz wtyczkę i nie dyskutujesz.

Kiedy wtyczka wygrywa bezapelacyjnie: formularz kontaktowy, meta SEO, koszyk porzucony, faktury, bramki płatności. To funkcje, których tysiące sklepów potrzebuje w identycznej formie — masz wsparcie, aktualizacje bezpieczeństwa i kogo zapytać na forum.

Osobna sprawa to sezonowość. Sklep turystyczny działający maj–wrzesień na Roztoczu płaci za licencję wtyczki przez 12 miesięcy, choć pracuje 5. Moduł własny to koszt jednorazowy — ale nie znaczy „darmowy”: po aktualizacji PrestaShop trzeba go przejrzeć i przetestować. Utrzymanie nie znika, tylko się przesuwa. Standard porządkowania kodu opisujemy w materiale o niestandardowych modułach i wtyczkach w Szczebrzeszynie.

KryteriumPytanie kontrolneDecyzja
Proces unikalnyDa się to ustawić w 15 minut w gotowej wtyczce?Wtyczka z katalogu
Brak gotowego rozwiązaniaSprawdzone Addons, WordPress.org i 3 płatnych dostawców?Brak trafień → moduł własny
Integracja z APIAPI przyjmuje nietypowe pola z zamówienia?Moduł własny + kolejka zadań
Kod wielokrotnego użytkuUżyjesz go w 2+ sklepach lub codziennie?Moduł własny
Funkcja standardowaFormularz, meta SEO, koszyk porzucony?Wtyczka, nie pisz sam

Proces budowy modułu w 7 krokach: od briefu do produkcji

Kolejność prac jest taka sama w PrestaShop i WooCommerce — różnią się narzędzia, nie logika. Warunek: każdy krok kończy się artefaktem, który możesz pokazać osobie trzeciej. Nie ustnym „dogadaliśmy się”.

  1. Brief. Cel biznesowy w jednym zdaniu („skrócić obsługę zwrotów o połowę”) plus przykładowe zamówienie: numer, produkty, waga, adres. Na tym konkretnym zamówieniu wykonawca pokazuje, że rozumie problem.
  2. Specyfikacja funkcjonalna z przypadkami brzegowymi. Minimum: brak towaru na stanie, duplikat zamówienia (podwójne kliknięcie „Zapłać”), timeout API kuriera, zamówienie na 0 zł, adres zagraniczny, brak wymaganego pola. Każdy przypadek = jedno zdanie „co ma się stać”.
  3. Środowisko staging. Kopia sklepu z oddzielną bazą i danymi testowymi. Wyłączone maile do klientów (inaczej wyślesz potwierdzenia z testów), płatności i kurier na piaskownicy, sklep zablokowany przed indeksowaniem.
  4. Implementacja z podziałem na commity. Jedna funkcja = jeden commit, osobna gałąź na zadanie, code review przed mergem. Historia commitów to dowód, że kod nie powstał jako jeden plik na 3000 linii.
  5. Testy. Scenariusze ręczne z kroku 2 plus test integracyjny API płatności lub kuriera na piaskownicy. Test bez udokumentowanego wyniku nie istnieje.
  6. Wdrożenie. Poza godzinami sprzedaży (np. 2:00–4:00), kopia bazy przed zmianą, plan rollback: poprzednia wersja modułu plus przywrócenie bazy. Rollback trzeba przećwiczyć, nie tylko opisać.
  7. Dokumentacja i szkolenie. README w repozytorium: co robi moduł, jakie hooki podpina, jakie tabele tworzy, gdzie trzymane są klucze API. Do tego 30–60 minut szkolenia z nagraniem dla osoby obsługującej sklep.

Sygnał ostrzegawczy: wykonawca podaje wycenę przed specyfikacją. To znaczy, że nie wie, ile pracy wymagają przypadki brzegowe. Dalsze zasady prowadzenia sklepu po wdrożeniu zebraliśmy w tekście o utrzymaniu i opiece technicznej sklepów.

KrokArtefakt do odbioruPułapka, jeśli artefaktu brak
1. BriefDokument z celem i przykładowym zamówieniemNie ma na czym testować, spór o zakres
2. SpecyfikacjaLista przypadków brzegowychWracają jako błędy na produkcji
3. StagingAdres kopii i dane testoweTestowanie na żywym sklepie i mailach klientów
4. ImplementacjaRepozytorium i historia commitówNie da się cofnąć pojedynczej zmiany
5. TestyRaport z testów, logi, zrzuty„U mnie działa” jako argument
6. WdrożenieKopia bazy i przećwiczony rollbackKażda awaria oznacza pełne przywracanie
7. DokumentacjaREADME i nagranie szkoleniaWiedza zostaje wyłącznie u wykonawcy

Jak zapisać to w kodzie: hooki, API i bezpieczeństwo

Minimalny standard, po którym rozpoznasz dobrze napisany moduł — w obu systemach.

PrestaShop. Hooki rejestrujesz w install(): displayHeader (dołączanie CSS/JS tylko na potrzebnych stronach, nie globalnie), actionValidateOrder (zamówienie jest już zapisane, można dopiąć własną logikę), actionOrderStatusPostUpdate, displayAdminOrder. Nie nadpisuj plików core — nadpisanie ginie przy aktualizacji, a gdy dwa moduły modyfikują ten sam plik, kończy się konfliktem. Własne tabele buduj na ObjectModel, zapytania kieruj przez Db::getInstance() z parametryzacją. Pełną listę hooków znajdziesz w dokumentacji PrestaShop dla deweloperów.

WooCommerce. Własne actions i filters, kod w dedykowanej wtyczce, nie w functions.php motywu. Jeśli operujesz na zamówieniach, deklaruj kompatybilność z HPOS (High-Performance Order Storage) i używaj CRUD API — wc_get_order(), $order->get_meta() — zamiast zapytań do wp_posts i wp_postmeta.

Integracje zewnętrzne. Webhook plus kolejka plus retry, zamiast synchronicznego czekania na odpowiedź API kuriera. Przewoźnik z timeoutem 8 s to porzucony koszyk. Kolejność: zapisz zamówienie, wrzuć zadanie do kolejki (Action Scheduler, cron systemowy), wyślij z kluczem idempotencji, ponów 3 razy z odstępem 1/5/15 minut, a po niepowodzeniu oznacz zamówienie flagą do ręcznej obsługi.

Bezpieczeństwo. Walidacja i sanityzacja każdego wejścia (typ, zakres, długość), escapowanie wyjścia, zapytania parametryzowane, nonce w WooCommerce i tokeny w PrestaShop, uprawnienia pracownika do akcji w panelu. Klucze API wyłącznie po stronie serwera — w kodzie frontowym nigdy.

Log i wersjonowanie. Własny log zdarzeń modułu z poziomami info/warning/error i rotacją plików (7–30 dni), bez pełnych danych osobowych — maskuj e-mail i numer telefonu. Wersja w nagłówku pliku głównego i changelog widoczny przy aktualizacji.

ObszarPrestaShopWooCommerce
Punkt wejściainstall() i registerHook()add_action / add_filter w dedykowanej wtyczce
Zdarzenia zamówieniaactionValidateOrder, actionOrderStatusPostUpdatewoocommerce_checkout_order_created, woocommerce_order_status_changed
Dane zamówieniaObjectModel, Db::getInstance()CRUD API i deklaracja kompatybilności z HPOS
Panel administracyjnydisplayAdminOrder i uprawnienia pracownikaWłasna kolumna lub meta box, capability
Zadania w tleCron i własna tabela zadańAction Scheduler
Czego nie ruszaćPlików core, override tylko świadomiefunctions.php motywu

8 pułapek, które psują własne moduły (i jak je wykryć przed odbiorem)

Każda z pułapek poniżej oznacza zwykle powtórne wdrożenie: 20–40 godzin pracy programisty i tydzień, w którym funkcja nie działa. Wszystkie da się wychwycić przed podpisaniem odbioru, bez czytania całego kodu.

Kolejność tych ustaleń opisaliśmy szerzej w tekście o organizacji pracy nad niestandardowymi modułami i wtyczkami.

Utrzymanie po wdrożeniu: co obejmuje opieka i jak zapisać SLA

Moduł własny to nie jednorazowy zakup. Przez trzy lata zdarzą się co najmniej dwie wymuszone aktualizacje: nowa wersja PHP i podbicie PrestaShop albo WooCommerce. Do tego dochodzą zmiany API InPost, DPD lub DHL, które potrafią wyłączyć generowanie etykiet z dnia na dzień.

W umowie serwisowej zapisz parametry, a nie ogólne zapewnienia o należytej staranności:

Aktualizacje wymuszone rozliczaj osobno: ustal stawkę godzinową i to, kto decyduje o terminie. Aktualizację modułu poprzedzaj kopią bazy i plików oraz testem na staging — przywracanie działającego sklepu jest szybsze niż szukanie przyczyny błędu w produkcji. Zgodność wersji sprawdzaj według dokumentacji dla deweloperów PrestaShop.

Monitoring powinien obejmować nie tylko dostępność strony, ale też błędy 500, wolne odpowiedzi i nieudane webhooki. Zapisz w umowie, że pracujesz bezpośrednio z deweloperem, bez pośredników — każdy dodatkowy szczebel wydłuża czas reakcji o godziny. Zakres takich usług opisujemy w sekcji utrzymania i opieki technicznej sklepów.

Parametr SLAWartość do zapisania w umowie
Czas reakcji4 h w godzinach pracy, 1 dzień roboczy poza nimi
Czas naprawy – błąd krytycznydo 8 h od potwierdzenia zgłoszenia
Czas naprawy – błąd drobnydo 5 dni roboczych
Kanał zgłoszeńmail + system ticketowy (jeden adres)
Godziny wsparciapn–pt 8:00–16:00, zgłoszenia poza godzinami w następnym dniu roboczym
Wyłączenia z gwarancjiingerencje w kod, brak kopii zapasowych, nadpisanie szablonów modułu

Lista kontrolna: co przygotować przed zamówieniem modułu

Wykonawca, który dostaje pełny zestaw danych, wycenia trafniej i krócej testuje. Zbierz to przed pierwszym spotkaniem:

Zanim wyślesz zapytanie, wróć do listy ośmiu pułapek z wcześniejszej sekcji. To gotowa checklista punktowa — wydrukuj ją i przechodź punkt po punkcie na staging, odhaczając kolejne pozycje. Pozycja bez odhaczenia oznacza, że nie odbierasz prac, a nie że „jakoś to będzie działać”.

Wskaźnik odbioruPrógJak zmierzyć
Czas odpowiedzi listy produktówponiżej 1,5 s przy 200 produktachprofiler + lista 200 pozycji na staging
Liczba zapytań SQLstała, niezależna od liczby produktówtryb debug PrestaShop / Query Monitor
Przepustowość zamówień300 zamówień na godzinę bez błędówtest obciążeniowy na staging
Błędy w logu PHPzero wpisów o błędach przez 48 h pracy testowejlog serwera i log modułu
Webhooki100% potwierdzonych po stronie odbiorcylog wysyłek z modułu

Najczęstsze błędy i jak je wykryć

Kod modułu istnieje tylko na produkcji, wgrywany przez FTP. Nie ma repozytorium ani historii zmian.

Jak wykryć: Zadaj pytanie: kto i kiedy ostatnio zmienił plik modułu? Jeśli nikt nie potrafi odpowiedzieć bez logowania się na serwer, nie masz kontroli nad kodem.

Jak naprawić: Przenieś moduł do repozytorium Git. Wystarczy prywatne repo z gałęziami main i dev oraz dostępem dla każdej osoby, która dotyka kodu.

Testy i poprawki robione bezpośrednio na działającym sklepie, w godzinach sprzedaży.

Jak wykryć: Sprawdź, czy w ostatnich 3 miesiącach klienci zgłaszali błędy, których nikt nie potrafi odtworzyć na żadnym innym środowisku niż produkcja.

Jak naprawić: Postaw staging: kopia plików plus kopia bazy z danymi z ostatnich 24 godzin. Wdrożenie na produkcję tylko po przejściu testu na staging.

Cała logika modułu w jednym pliku — HTML, SQL i przetwarzanie zamówień razem, bez podziału.

Jak wykryć: Otwórz główny plik modułu. Jeśli ma powyżej 800–1000 linii i miesza zapytania do bazy z generowaniem widoku, to znak, że moduł będzie drogi w utrzymaniu.

Jak naprawić: Rozdziel warstwy: osobno zapytania do bazy, osobno logika procesu, osobno szablony. W PrestaShop korzystaj z szablonów .tpl, w WooCommerce z plików szablonów nadpisywanych w motywie.

Wiedza o module siedzi w głowie jednej osoby — zwykle tej, która go pisała i już nie pracuje z firmą.

Jak wykryć: Poproś pracownika obsługi o wskazanie, gdzie w kodzie zmienia się np. próg darmowej dostawy. Jeśli odpowiedź brzmi „trzeba zapytać programistę”, masz lukę dokumentacyjną.

Jak naprawić: Spisz krótką dokumentację: co moduł robi, jakie hooki lub akcje obsługuje, gdzie trzyma dane i co trzeba zrobić przy aktualizacji sklepu. Dopisz kontakt do autora i zasady przekazania.

Aktualizacja PrestaShop albo WooCommerce wrzucana bez sprawdzenia, czy moduł nadal działa.

Jak wykryć: Przejrzyj logi PHP z ostatnich aktualizacji. Powtarzające się ostrzeżenia o zdeprecjonowanych funkcjach to zapowiedź błędu 500 przy kolejnej wersji.

Jak naprawić: Ustal okno aktualizacji poza sezonem, zawsze najpierw na staging. Przed wdrożeniem zrób kopię bazy i plików, a po wdrożeniu przejdź test akceptacyjny: złożenie zamówienia, płatność, etykieta, e-mail.

Modyfikacje w plikach rdzenia sklepu zamiast w module lub motywie potomnym.

Jak wykryć: Sprawdź daty modyfikacji plików w katalogu core. Jeśli różnią się od daty instalacji sklepu, ktoś zmieniał rdzeń i każda aktualizacja to nadpisze.

Jak naprawić: Przenieś zmiany do modułu albo nadpisania w motywie potomnym. Pliki rdzenia zostaw w wersji z paczki instalacyjnej.

Lista kontrolna do odklikania

Podsumowanie

Porządek w pracy nad modułem to nie kwestia estetyki kodu, a przewidywalności: repozytorium, staging, kopie i test akceptacyjny przed każdym wdrożeniem. Najdroższym błędem nie jest zła funkcja, ale brak informacji o tym, kto zmienił kod i dlaczego. Zacznij od trzech elementów — repo, kopia bazy i staging — a dokumentację dopisz przy najbliższej zmianie. Temat utrzymania takich rozwiązań rozwijamy w materiale o utrzymaniu i opiece technicznej sklepów.

Najczęściej zadawane pytania

Czy organizacja pracy nad modułem ma sens przy sklepie robiącym 20 zamówień miesięcznie?

Tak, ale w wersji minimalnej: repozytorium, kopia bazy przed wdrożeniem i staging. Te trzy rzeczy kosztują kilka godzin na starcie i ratują przy pierwszej awarii. Pełny proces z rozbudowanymi testami odkładasz na moment, gdy moduł zacznie dotykać pieniędzy — płatności, faktur, etykiet.

Ile czasu zajmuje uporządkowanie modułu, który ktoś napisał i zniknął?

Zwykle 4–12 godzin na sam audyt: przeczytanie kodu, sprawdzenie hooków, znalezienie miejsc modyfikujących rdzeń i spisanie, co moduł faktycznie robi. Osobną pozycją jest dopisanie dokumentacji i przeniesienie kodu do repozytorium. Przy modułach starszych niż 5 lat zdarza się, że taniej napisać go od nowa niż porządkować.

Czy aktualizować sklep, jeśli moduł działa i boję się, że się zepsuje?

Odkładanie aktualizacji przenosi problem, a nie usuwa. Starsza wersja PrestaShop lub WooCommerce traci wsparcie bezpieczeństwa, a przeskok o kilka wersji naraz jest bardziej ryzykowny niż seria małych aktualizacji. Rozwiązaniem jest staging i test akceptacyjny przed każdym wdrożeniem, a nie wstrzymywanie aktualizacji.

Kto powinien pisać i utrzymywać moduł — agencja czy programista na etacie?

Zależy od tego, jak często moduł się zmienia. Jeśli raz na rok, agencja zewnętrzna wystarczy i zwykle wychodzi taniej. Jeśli moduł dotyka codziennej pracy działu obsługi i wymaga poprawek co miesiąc, wewnętrzna osoba z dostępem do repozytorium skraca czas reakcji. Warto wtedy ustalić, kto decyduje o zakresie zmian — jedna osoba po stronie firmy.

Jak udokumentować moduł używany w kilku sklepach?

Trzymaj go w jednym repozytorium i wdrażaj wersjami, a nie kopiowaniem plików między serwerami. W dokumentacji zapisz różnice konfiguracji między sklepami — progi dostawy, klucze API, zakresy cen. Bez tego po roku nikt nie odtworzy, dlaczego w jednym sklepie działa inaczej niż w drugim.

Co wpisać do umowy z wykonawcą modułu?

Trzy rzeczy: przekazanie kodu w repozytorium po zakończeniu prac, dokumentacja modułu oraz okres wsparcia po wdrożeniu z określonym czasem reakcji. Dopisz też, że modyfikacje w plikach rdzenia sklepu są niedozwolone. To zapisy, które kosztują jedną stronę umowy, a oszczędzają wiele godzin przy kolejnym wykonawcy.

Jeśli masz moduł, do którego nikt już nie ma dokumentacji, albo planujesz wdrożenie przed sezonem — napisz do nas. Powiemy, co da się uporządkować w kilka godzin, a co wymaga przepisania.

Źródła i materiały