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ść.
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.
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.
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.
| Pozycja | Wtyczka z katalogu | Moduł własny |
|---|---|---|
| Koszt startowy | licencja + kilka godzin konfiguracji | analiza, projekt i kod: 12–120 h zależnie od przypadku |
| Koszt roczny | odnowienie licencji × liczba wtyczek + wsparcie | aktualizacje i drobne poprawki: zwykle 2–6 h |
| Praca ręczna | godziny na obejścia liczone co miesiąc | po wdrożeniu spada w okolice zera |
| Ryzyko przestoju | zależysz od tempa aktualizacji dostawcy | zależysz od swojego wykonawcy i repozytorium |
| Zmiana wymagań | często brak możliwości, trzeba obejść w panelu | możliwa, rozliczana godzinowo |
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.
| Kryterium | Pytanie kontrolne | Decyzja |
|---|---|---|
| Proces unikalny | Da się to ustawić w 15 minut w gotowej wtyczce? | Wtyczka z katalogu |
| Brak gotowego rozwiązania | Sprawdzone Addons, WordPress.org i 3 płatnych dostawców? | Brak trafień → moduł własny |
| Integracja z API | API przyjmuje nietypowe pola z zamówienia? | Moduł własny + kolejka zadań |
| Kod wielokrotnego użytku | Użyjesz go w 2+ sklepach lub codziennie? | Moduł własny |
| Funkcja standardowa | Formularz, meta SEO, koszyk porzucony? | Wtyczka, nie pisz sam |
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ę”.
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.
| Krok | Artefakt do odbioru | Pułapka, jeśli artefaktu brak |
|---|---|---|
| 1. Brief | Dokument z celem i przykładowym zamówieniem | Nie ma na czym testować, spór o zakres |
| 2. Specyfikacja | Lista przypadków brzegowych | Wracają jako błędy na produkcji |
| 3. Staging | Adres kopii i dane testowe | Testowanie na żywym sklepie i mailach klientów |
| 4. Implementacja | Repozytorium i historia commitów | Nie da się cofnąć pojedynczej zmiany |
| 5. Testy | Raport z testów, logi, zrzuty | „U mnie działa” jako argument |
| 6. Wdrożenie | Kopia bazy i przećwiczony rollback | Każda awaria oznacza pełne przywracanie |
| 7. Dokumentacja | README i nagranie szkolenia | Wiedza zostaje wyłącznie u wykonawcy |
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.
| Obszar | PrestaShop | WooCommerce |
|---|---|---|
| Punkt wejścia | install() i registerHook() | add_action / add_filter w dedykowanej wtyczce |
| Zdarzenia zamówienia | actionValidateOrder, actionOrderStatusPostUpdate | woocommerce_checkout_order_created, woocommerce_order_status_changed |
| Dane zamówienia | ObjectModel, Db::getInstance() | CRUD API i deklaracja kompatybilności z HPOS |
| Panel administracyjny | displayAdminOrder i uprawnienia pracownika | Własna kolumna lub meta box, capability |
| Zadania w tle | Cron i własna tabela zadań | Action Scheduler |
| Czego nie ruszać | Plików core, override tylko świadomie | functions.php motywu |
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.
grep -rn id_category modules/, grep -rn api_key). Test: na staging przenieś produkt do nowej kategorii i sprawdź, czy blok nadal działa. Wszystko, co zmienia się w czasie, ma być polem w konfiguracji modułu.$this->ps_versions_compliancy, a wtyczka WooCommerce nagłówki Requires PHP, Requires at least i WC requires at least. Brak tych wpisów przy podbiciu PHP z 8.1 na 8.3 kończy się białym ekranem.if ($qty == 0). Żądaj dostępu do Git, README z opisem konfiguracji i changelogu. Jeśli jedyną formą przekazania jest archiwum ZIP wysłane mailem, nie masz jak cofnąć wdrożenia.class_exists, function_exists) i jasno komunikować brak zależności./etc/hosts na staging i sprawdź, czy strona nadal odpowiada w mniej niż 3 sekundy.Kolejność tych ustaleń opisaliśmy szerzej w tekście o organizacji pracy nad niestandardowymi modułami i wtyczkami.
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 SLA | Wartość do zapisania w umowie |
|---|---|
| Czas reakcji | 4 h w godzinach pracy, 1 dzień roboczy poza nimi |
| Czas naprawy – błąd krytyczny | do 8 h od potwierdzenia zgłoszenia |
| Czas naprawy – błąd drobny | do 5 dni roboczych |
| Kanał zgłoszeń | mail + system ticketowy (jeden adres) |
| Godziny wsparcia | pn–pt 8:00–16:00, zgłoszenia poza godzinami w następnym dniu roboczym |
| Wyłączenia z gwarancji | ingerencje w kod, brak kopii zapasowych, nadpisanie szablonów 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 odbioru | Próg | Jak zmierzyć |
|---|---|---|
| Czas odpowiedzi listy produktów | poniżej 1,5 s przy 200 produktach | profiler + lista 200 pozycji na staging |
| Liczba zapytań SQL | stała, niezależna od liczby produktów | tryb debug PrestaShop / Query Monitor |
| Przepustowość zamówień | 300 zamówień na godzinę bez błędów | test obciążeniowy na staging |
| Błędy w logu PHP | zero wpisów o błędach przez 48 h pracy testowej | log serwera i log modułu |
| Webhooki | 100% potwierdzonych po stronie odbiorcy | log wysyłek z modułu |
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.
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.
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.
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ć.
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.
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.
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.
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.