Strona, która jest pre-konsultacją.
Pani Anna Laprus prowadzi gabinet chirurgii i medycyny estetycznej. Pacjentki przyjeżdżają z całej Polski. Każda pacjentka spędza średnio 15-25 minut na stronie, zanim wykona pierwszy ruch.
Strona internetowa gabinetu medycyny estetycznej to nie tylko "wizytówka". To pre-konsultacja - moment, w którym pacjentka decyduje, czy w ogóle zadzwoni. Wybiera lekarza, któremu powierzy sprawy osobiste i intymne, któremu zaufa. W tym momencie liczy się każdy detal techniczny.
Wyzwanie polegało na stworzeniu strony, która nie zawodzi w żadnym z wymiarów, których pacjent świadomie nie sprawdza - ale których brak wyczułby natychmiast. To jak sterylność w gabinecie: nikt jej nie zauważa, dopóki nie zacznie jej brakować.
Strona to wizytówka gabinetu - pierwszy kontakt z lekarzem, jeszcze przed wizytą. Każdy szczegół działa tu na korzyść pacjenta i lekarza. Błyskawiczne ładowanie zatrzymuje uwagę nawet wieczorem, na telefonie i słabym Wi-Fi. Zawsze aktualny cennik, prosty do samodzielnej edycji, wzmacnia poczucie przejrzystości. Zgoda RODO skrojona pod sektor medyczny - a nie generyczny baner od ciasteczek — buduje wiarygodność od pierwszej sekundy. A formularz prowadzący prosto do systemu pani doktor sprawia, że każde zgłoszenie trafia dokładnie tam, gdzie powinno.
Strona dla medycyny estetycznej rządzi się własnymi prawami.
W medycynie estetycznej rygorystyczne przepisy wyznaczają standardy nie tylko w gabinecie, ale i w kodzie strony internetowej. Prawdziwe kompetencje technologiczne w tym sektorze zdobywa się wyłącznie w praktyce wdrożeniowej. Oto pięć kluczowych powodów, dla których cyfrowa przestrzeń kliniki wymaga zupełnie innej architektury niż klasyczny e-commerce.
Reklama w branży regulowanej
Google traktuje medycynę estetyczną jako kategorię medyczną, na którą nakłada rygorystyczne restrykcje. Część fraz jest z góry blokowana, a wymogi dotyczące bezpieczeństwa i przejrzystości reklamodawcy są bezkompromisowe. Aby kampanie w ogóle mogły wystartować, strona musi być na to gotowa technicznie: wymaga precyzyjnych danych, wdrożenia mikrodanych oznaczających placówkę medyczną i rzetelnej polityki prywatności.
Dane medyczne to nie zwykłe dane
Pacjentka wypełniająca formularz zabiegowy powierza gabinetowi informacje o swoim stanie zdrowia. Prawo chroni je wyjątkowo mocno (art. 9 RODO). Wymagane jest jasne wskazanie celu, zgoda osobno na kontakt medyczny, osobno na marketing, pełna historia dostępu do danych oraz systemowa gotowość do ich trwałego usunięcia.
Wolna strona bezpowrotnie traci pozycje
Dla Google treści związane ze zdrowiem (obszar Your Money or Your Life) to kategoria, w której algorytmy wymagają absolutnej wiarygodności i nie wybaczają technicznych potknięć. Szybkość ładowania jest tu kluczowa. Strona, która wczytuje się w cztery sekundy, oddaje pole zoptymalizowanej konkurencji i rzadko odzyskuje utracone pozycje. Biorąc pod uwagę, że pacjentki najczęściej przeglądają ofertę na smartfonach – nierzadko przy słabym zasięgu – to właśnie mobilna wydajność decyduje o widoczności w wyszukiwarce.
Tłumaczenie z języka medycznego na ludzki
Pacjentki rzadko wpisują w wyszukiwarkę „blefaroplastyka opadającej powieki". Szukają rozwiązań problemów, które widzą rano w lustrze. Treść na stronie musi mówić ich językiem, ale jednocześnie zachować pełen profesjonalizm – bez składania obietnic bez pokrycia i wprowadzania w błąd. Prowadzimy pacjentkę krok po kroku: od zrozumienia jej niepokojów, przez opis zabiegu, aż po szczegóły medyczne.
Operacyjna codzienność gabinetu
Ceny w gabinecie reagują na sezonowość, koszty preparatów czy bieżące promocje. Recepcja musi mieć możliwość samodzielnej aktualizacji cennika – bez znajomości kodu, logowania do zawiłego panelu CMS i bez konieczności wysyłania zgłoszeń do agencji. Zmiana wprowadzona na poziomie recepcji powinna zaktualizować się na stronie tego samego dnia, a najlepiej w ciągu kilku minut.
Dlaczego odrzuciliśmy gotowe rozwiązania?
Zanim podjęliśmy ostateczną decyzję, dokładnie przeanalizowaliśmy cztery popularne rynkowe alternatywy. Każda z nich rozwiązywała tylko część problemów, jednocześnie generując nowe – czasem dyskretnie, innym razem w sposób bardzo ewidentny. Oto dlaczego nie poszliśmy na żaden z tych kompromisów.
Pierwsza godzina audytu gotowego szablonu (koszt: 60 dolarów) i obraz jest jasny: 47 wtyczek już w środku, aktywne slidery i page buildery, sama strona waży 4 MB, zanim cokolwiek się na niej pojawi. „Ładny" przestaje wystarczać, gdy na telefonie ładuje się 4,5 sekundy.
Autorskie rozwiązania technologiczne dają nam coś bezcennego: absolutną kontrolę nad każdym detalem SEO i błyskawiczną szybkość ładowania. Dzięki rezygnacji z gotowych kreatorów zyskujemy krystalicznie czysty kod, chudszy o blisko 200 KB. W wymagającym świecie treści medycznych, które Google ocenia ze zdwojoną uwagą, ta technologiczna lekkość staje się potężnym atutem, który winduje stronę na najwyższe pozycje w wynikach wyszukiwania.
Na pierwszy rzut oka takie rozwiązania są łatwe w obsłudze i estetyczne. Problem polega na tym, że każda funkcja o krytycznym znaczeniu dla gabinetu – bezpośrednia integracja z systemem pacjentów, synchronizacja cennika czy zgodny z prawem rejestr zgód RODO – musiałaby opierać się tu na technologicznych obejściach. W praktyce oznaczałoby to powrót do ręcznego przepisywania danych z maili, żmudnego kopiowania cen i implementacji generycznych banerów, które nie spełniają surowych norm prawnych.
Trzy wtyczki do SEO, dwie do cookies, po jednej do formularzy, cache'u, kopii zapasowych i bezpieczeństwa. Każda z nich coś wnosi i każda staje się kolejnym elementem, który trzeba aktualizować i mieć na oku. Im więcej takich elementów, tym więcej miejsc, w których coś może pęknąć. W gabinecie, gdzie dane pacjentek są najcenniejsze, to ryzyko nie do przyjęcia.
Wybór był jednoznaczny: dedykowany motyw WordPress oparty na Tailwind CSS. WordPress jako system, który klientka zna i obsłuży sama. Tailwind jako warstwa wyglądu — bez zbędnego kodu, z automatycznym usuwaniem wszystkiego, czego strona nie używa. I autorski kod motywu zamiast page buildera, czyli pełna kontrola nad każdym kilobajtem, każdym zapytaniem i każdym detalem SEO.
Architektura w praktyce: 5 codziennych scenariuszy z życia gabinetu.
Nie chodzi o efekt wow w dniu premiery. Prawdziwym sprawdzianem technologii jest codzienność gabinetu – rok po wdrożeniu, gdy trzeba szybko zaktualizować cennik, wystartować z nową kampanią, a ruch na stronie stale rośnie. Zobacz, jak wyeliminowaliśmy ukryte technologiczne blokady, z którymi na co dzień boryka się gabinet.
Błyskawiczna i bezobsługowa aktualizacja cennika.
Recepcja samodzielnie edytuje swój wewnętrzny arkusz Excel (dodając SKU, nazwę, kategorię, cenę i opis zabiegu) i zapisuje go w zsynchronizowanym folderze Dropbox. Całą resztę robi technologia. W ciągu 5 minut skrypt cron PHP przetwarza plik, mapuje wiersze na odpowiedni typ posta w WordPressie i bezbłędnie aktualizuje dane (idempotentny upsert po numerze SKU). Strona sama wyświetla nowe ceny.
Wcześniej: Wysyłanie próśb do agencji z każdą drobną zmianą albo logowanie się do zawiłego panelu CMS z obawą, że jedno kliknięcie zepsuje układ strony.Bezpośrednia integracja formularzy z systemem kliniki.
Gdy pacjentka wysyła zgłoszenie, jej dane omijają tradycyjne, niebezpieczne skrzynki mailowe. Zapytanie trafia poprzez REST API bezpośrednio do wewnętrznego systemu zarządzania gabinetem. Lekarz od razu widzi nową pacjentkę w swojej kartotece i kalendarzu. E-mail uruchamia się wyłącznie jako awaryjny fallback (gdy API systemu medycznego z jakiegoś powodu nie odpowie) – i zawsze towarzyszy mu alert do administratora IT.
Wcześniej: Wiadomości lądujące na ogólnym mailu recepcji, żmudne ręczne przepisywanie danych i ryzyko zagubienia zgłoszenia w gąszczu innych spraw.Żelazny rejestr zgód dla audytu RODO (Art. 9).
Zgody na kontakt czy marketing to osobne, precyzyjne decyzje. Każde kliknięcie jest rygorystycznie logowane w dedykowanej tabeli systemowej. Zapisujemy dokładny czas (timestamp), zaszyfrowany adres IP pacjentki (SHA-256), hash zawartości formularza oraz dokładną treść klauzuli prawnej obowiązującą w tej konkretnej sekundzie. To w 100% audytowalny ślad, gotowy na weryfikację organów nadzorczych.
Wcześniej: Standardowy, nieposiadający żadnej mocy dowodowej baner w stylu „akceptuję politykę prywatności".Wydajność mobilna wyprzedzająca intencje użytkownika.
Pacjentka klika w reklamę o 23:00, przeglądając telefon w łóżku, często przy słabym sygnale Wi-Fi. Wynik? Czas największego wyrenderowania treści (LCP) spada poniżej 1,5 sekundy, witryna nie skacze (CLS 0), a czas reakcji na interakcję to ułamek sekundy (INP <200ms). Zdjęcia efektów przed i po wyświetlają się błyskawicznie, a obciążające wideo z opinią ładuje się w tle dopiero wtedy, gdy pacjentka do niego zescrolluje (lazy loading).
Wcześniej: Czekanie 4,5 sekundy na wczytanie treści, skaczący layout ukrywający przyciski i pacjentka, która po prostu zamyka kartę.Gotowość na kampanie marketingowe od pierwszego dnia.
Manager marketingu uruchamia nową kampanię Google Ads. Nie musi prosić o żadne techniczne interwencje. Strona ma natywnie zintegrowany Google Tag Manager, GA4 ze zdarzeniami konwersji, Meta Pixel, Conversion API działające po stronie serwera (server-side) oraz Microsoft Clarity do generowania map ciepła. Wszystkie skrypty są hostowane lokalnie lub chronione przez sieć Cloudflare, co eliminuje opóźnienia i ryzyko wycieku danych przez serwery trzecie.
Wcześniej: Każda nowa kampania to instalacja kolejnej wtyczki obciążającej system, całkowity brak śledzenia po stronie serwera i brak zaawansowanej analityki.Każdy z tych scenariuszy to szczegół, którego pacjentka nigdy świadomie nie przeanalizuje. Działa to dokładnie tak samo jak sterylność w gabinecie lekarskim – po prostu ufasz, że tam jest. Ale brak któregokolwiek z tych elementów byłby odczuwalny natychmiast: w dramatycznym spadku pozycji w Google, w zagubionym leadzie, we frustrującym kopiowaniu cennika czy w panice podczas audytu prawnego. Dobra strona internetowa w medycynie estetycznej nie ma być widoczna. Ma po prostu bezbłędnie działać.
Tutaj opisujemy jak. Tam zobaczysz, jak wygląda.
W tym miejscu otwieramy przed Tobą nasze zaplecze technologiczne. Krok po kroku tłumaczymy wdrożenie lekkiego kodu (Tailwind), automatyzację cenników oraz zaawansowaną integrację formularzy z systemem pacjentów. Natomiast w naszym portfolio znajdziesz ten sam projekt ukazany wyłącznie z perspektywy pacjentki – gdzie na pierwszy plan wysuwa się bezszelestna nawigacja, empatyczny przekaz i estetyka, która gwarantuje poczucie bezpieczeństwa.
Lek. Anna Laprus: zaufanie od pierwszego kliknięcia.
Zobacz, jak zrealizowaliśmy ten projekt od strony wizualnej i użytkowej. Przejrzysta nawigacja, treści pisane z empatią, autentyczne zdjęcia kliniki oraz projekt graficzny, który stawia pacjentkę w samym centrum uwagi. Odkryj nasze wdrożenie z perspektywy pacjenta, która otwiera stronę na smartfonie i oczekuje pełnego profesjonalizmu.
Liczby, które widzi klient. I co znaczą dla biznesu.
Wszystkie pomiary z produkcji - PageSpeed Insights z polem CrUX (28-day rolling), wp-cli dla pamięci PHP, logi serwera dla protokołów. Bez „lab” testów na pusto.
dostępu
metody
Te wyniki to nie wtyczka cache. To warstwa wydajności.
Strona stoi na dedykowanym VPS-ie ze stackiem LiteSpeed, a nie na współdzielonym hostingu z „turbo" przyciskiem. Trzy elementy, które razem dają 99/100 wydajności na throttlowanym mobile:
Serwer WWW na VPS-ie zamiast Apache na shared. Obsługuje LSCache natywnie na poziomie serwera - cache trafia do klientki, zanim PHP w ogóle wstanie. HTTP/3 (QUIC) out-of-the-box.
Cache stron i obiektów wbudowany w serwer - zna stan WordPressa, sam purguje po edycji cennika czy wpisu. Krytyczny CSS i odroczenie JS w jednym miejscu, bez stosu wtyczek optymalizacyjnych.
CDN spięty z LSCache - cache stron serwowany z edge'a najbliżej pacjentki, automatyczna konwersja obrazków (WebP/AVIF) i Critical CSS generowany w chmurze. To stąd FCP 1,4 s na 4G.
Pacjentka nie traci cierpliwości na pierwszym ekranie reklamy. Google rankuje YMYL wyżej.
Strona ładuje się na słabym zasięgu, na starym telefonie, w łóżku wieczorem.
Jedna wtyczka - LiteSpeed Cache - zamiast stosu gotowców. Reszta funkcji siedzi w kodzie motywu. Prawie zero powierzchni ataku, prawie nic do utrzymania.
| Metryka | Przed | Po | Co to znaczy dla biznesu |
|---|---|---|---|
| LCP na mobile (CrUX 28-day) | ~4.5 s | <1.5 s -67% | Pacjentka nie traci cierpliwości na pierwszym ekranie reklamy. Google traktuje YMYL stricter - szybsza strona rankuje wyżej. |
| Total page weight | 3-5 MB | <600 KB 5x lżej | Strona ładuje się też w słabym zasięgu - pacjentka w domu wieczorem na słabym Wi-Fi nie zostaje z pustym ekranem. |
| Aktywne wtyczki WordPress | 30-50 | 1 (LiteSpeed Cache) jedna | Cała logika strony (RODO, integracje, cennik) funkcjonuje w oparciu o autorski kod motywu i jedną wtyczkę cache'ującą, co minimalizuje powierzchnię ataku i eliminuje ryzyko wycieku danych pacjentek. |
| Rozmiar CSS w produkcji | nieznany (wszystko) | <20 KB Tailwind JIT | Tylko używane style trafiają do produkcji. Reszta wycinana przez purge. CSS nie blokuje renderowania pierwszego ekranu. |
| Aktualizacja cennika przez recepcję | ticket / login | Excel · sync 5 min solved | Recepcja ma kontrolę bez wiedzy technicznej. Pani doktor nie musi pisać do agencji za każdym razem, gdy zmieni się cena botoksu. |
| Pacjentki z formularza w systemie | ręczne przepisywanie z maila | automat (REST API) solved | Brak utraconych zgłoszeń, brak pomyłek w przepisywaniu, dane pacjentek nie zostają w skrzynce mailowej, która jest poza kontrolą RODO. |
| Zgody RODO | generyczny banner | audit log per zgoda art. 9 | Zgodność z art. 9 RODO dla danych medycznych. Każda zgoda audytowalna - timestamp, hash IP, wersja klauzul. Spokój przy audycie RODO Office. |
| Core Web Vitals (LCP/CLS/INP) | brak danych | PASSED all 3 | Google rankuje wyżej w YMYL. Każdy z trzech podstawowych sygnałów wydajności w progu „dobry". |
| Konfiguracja analityki | brak / fragmenty | GA4 · GTM · Meta CAPI · Clarity natywnie | Marketing widzi pełny lejek od reklamy do umówionej konsultacji. Server-side CAPI obchodzi blokery, heatmapy Clarity pokazują, gdzie pacjentki klikają. |
| Aktualizacja treści przez Panią doktor | „wyślij do agencji" | panel WordPress autonomia | Pani doktor publikuje wpis blogowy w 10 minut, nie czekając tydzień na agencję. Autonomia, brak ticketów. |
| Bezpieczeństwo | shared hosting | VPS · CF WAF · daily backup isolated | Geo-fence na wp-admin (PL/UK/DE), backup na zewnętrzny serwer, WAF Cloudflare blokuje 73% złośliwego ruchu. Dane pacjentek nie wypływają z hacka WordPress. |
Największa zaleta? Nie muszę myśleć o stronie. Ona po prostu zarabia na siebie i działa w tle. Pacjentki dzwonią, bo znalazły tam potrzebne informacje, recepcja na bieżąco aktualizuje cennik, a formularze automatycznie wpadają do systemu. Stworzono dla mnie rozwiązanie, które odciąża mnie z pracy, pozwalając mi być tam, gdzie powinnam – przy pacjentkach.
Rozpoznajesz swoją branżę w tej historii?
Branże o wysokim progu zaufania — lekarze prywatni, dentyści, kosmetolodzy z licencjami, kancelarie prawne, biura księgowe, doradcy finansowi — dzielą te same wymagania techniczne, których nie spełnia generyczna „strona dla małej firmy". Jeśli któreś z poniższych pytań brzmi znajomo, prawdopodobnie warto porozmawiać.
W branży YMYL (medycyna, finanse, prawo) Google traktuje wydajność jako pierwszorzędny sygnał rankingowy. Rozwiązanie: dedykowany motyw bez page buildera, Tailwind w trybie purge, WebP + lazy loading, CDN. Realny LCP poniżej 1.5s na mobile jest osiągalny.
Najczęstsza frustracja w gabinetach prywatnych - „bo agencja akurat ma weekend, a ja chcę dziś zmienić cenę". Rozwiązanie: cennik jako Excel z auto-syncem do CMS-a. Recepcja używa narzędzia, które już zna, strona aktualizuje się sama.
To największa luka w polskich gabinetach - dane pacjentów / klientów wędrują przez skrzynki Gmail, Outlook, GoDaddy. Każda taka skrzynka to potencjalny wyciek. Rozwiązanie: formularz → bezpośrednio do Twojego systemu (klinicznego, prawniczego, księgowego) przez REST API. Mail tylko jako fallback.
Generyczny cookie banner nie wystarczy dla danych szczególnej kategorii (medycznych, finansowych, prawnych). Rozwiązanie: indywidualne zgody per cel (kontakt / marketing / profilowanie), audit log z timestamp i wersją klauzul, możliwość usunięcia danych na żądanie - zgodność z art. 9 RODO.
Często wygrywa nie ten z lepszą treścią, tylko ten z szybszą stroną i lepszym schematem markup. Rozwiązanie: techniczne SEO oparte o realne pomiary (CrUX, Search Console), schema.org per branża (MedicalBusiness / LegalService / AccountingService), znaczniki Article + FAQPage.
Dla developerów: stack, decyzje, kod.
14 elementów stacka, 3 decyzje architektoniczne, 7 bullet-decyzji, 3 bloki kodu PHP (Excel→CPT sync, formularz→system pacjentów, RODO logger).
Engineering appendix Stack, decyzje, kod, plan rozwoju Rozwiń, aby zobaczyć stack produkcyjny, decyzje architektoniczne, kod pluginu, diagram flow requestu.
Stack produkcyjny
14 elementów, które wjeżdżają w produkcję
Decyzje architektoniczne
Trzy decyzje, które niosą cały projekt
Dedykowany motyw z Tailwind zamiast page buildera
Page builder (Elementor, Bricks, Divi) daje samodzielność, ale za 200 KB JavaScriptu, którego pacjentka nigdy nie potrzebuje, i za brak kontroli nad detalami SEO. W YMYL te 200 KB to cztery miejsca w rankingu Google. Tailwind w produkcji to ~20 KB CSS - każda klasa używana, reszta wycięta przez purge.
Tailwind v3 z JIT compiler. Build przez npm run build generuje main.css tylko z klasami faktycznie używanymi w plikach motywu (skanowanie templates + ACF blocks). Zero unused CSS. Klasy utility-first, ale per-component abstractions w PHP dla powtarzalnych wzorców (karta zabiegu, formularz, blok cennika).
Cennik jako Excel z auto-syncem zamiast formularza w panelu WordPress
Recepcja Pani doktor już używa Excela codziennie (rozliczenia, dyżury, faktury). Dodanie nowego narzędzia jest oporem organizacyjnym. Korzystając z tego, co już mają, eliminujemy szkolenie i opór. Plik Excel parsowany regularnie, mapowany na CPT „Zabieg" - z idempotencją (zmiana ceny istniejącego zabiegu nie tworzy duplikatu).
Plik cennik.xlsx w shared folderze (Dropbox sync z VPS). Cron WordPress co 5 minut sprawdza filemtime - jeśli nie zmienił się od ostatniego sync, pomija. Jeśli tak: parsowanie przez PhpSpreadsheet, upsert po polu SKU (find_zabieg_by_sku → wp_update_post lub wp_insert_post). Idempotentne.
Formularz → bezpośrednio do systemu pacjentów (nie do maila)
Największa luka w polskich gabinetach: dane pacjentek wędrują przez skrzynki Gmail / Outlook / GoDaddy. Każda taka skrzynka to potencjalny wyciek - złamane hasło Google to wyciek całej kartoteki potencjalnych pacjentów. Płynna integracja z systemem klinicznym, który Pani doktor już posiada, eliminuje ten wektor.
Hook wpcf7_before_send_mail Contact Form 7 - przed wysłaniem maila wykonujemy POST do REST API systemu klinicznego z tokenem Bearer. Payload sanityzowany (sanitize_text_field, sanitize_email). Timeout 10s. Fallback do maila tylko gdy API zwraca błąd ≥400 albo timeout. Alert do administratora przy fallback.
Pozostałe decyzje - krótko
- 04
Tailwind w trybie JIT z purge w produkcji
Zero unused CSS. Build skanuje wszystkie pliki PHP motywu, ACF blocks i template parts, generuje tylko używane klasy. ~20 KB CSS zamiast typowych 200 KB dla szablonu medycznego.
- 05
WebP z fallbackiem do JPG, lazy loading natywny
Wtyczka generuje WebP w kilku rozmiarach przy uploadzie.
<picture>z fallbackiem do JPG dla starych przeglądarek.loading="lazy"natywny (nie JS plugin) dla obrazów poza viewportem. - 06
Schema.org MedicalBusiness + Person + Article + FAQPage
Strukturalna treść per szablon.
MedicalBusinessdla strony głównej,Persondla profilu Pani doktor,MedicalProceduredla każdej strony zabiegu,ArticleiFAQPagedla bloga. - 07
Cloudflare WAF: geo-fence na wp-admin
Reguła WAF zezwala na dostęp do
/wp-admini/wp-login.phptylko z krajów PL/UK/DE/AT/CH/EU. 92% prób brute-force pochodzi spoza tej puli i nie dochodzi do origin. - 08
Wszystkie zewnętrzne zasoby self-hosted lub przez Cloudflare
Fonty self-hosted (preload + font-display swap). Google Tag Manager, GA4, Meta Pixel - przez Cloudflare worker (server-side proxy). Brak third-party CDN, brak wycieku referer do zewnętrznych serwerów.
- 09
Auto-backup codzienny na zewnętrzny serwer
Backup pełny (pliki + baza) codziennie o 03:00, retencja 30 dni. Trzymany na zupełnie innym VPS niż produkcja - hack jednego nie kompromituje drugiego. Restore testowane raz w miesiącu, automatycznie do staging env.
- 10
WP-CLI deploy + staging env
Każda zmiana motywu trafia najpierw na staging (subdomain za basic auth), tam testowana wizualnie + automatycznie (Lighthouse CLI). Promocja do produkcji przez WP-CLI i deploy plików z git.
Kod
Trzy bloki, które niosą cały plugin
PHP 1. 1. Excel → CPT „Zabieg" - cron z idempotencją pricing-sync.php
// Cron 'pricing_excel_sync' uruchamiany co 5 minut przez wp_schedule_event
// Plik /srv/shared/cennik.xlsx parsowany, mapowany do CPT 'zabieg', upsert po SKU
add_action('pricing_excel_sync', 'lps_sync_pricing_from_excel');
function lps_sync_pricing_from_excel(): void {
$file = '/srv/shared/cennik.xlsx';
if (! file_exists($file)) {
error_log('[lps] Excel file not found: ' . $file);
return;
}
// mtime check - pomijamy jeśli plik się nie zmienił
$last_sync = get_option('lps_pricing_last_sync', 0);
if (filemtime($file) <= $last_sync) {
return;
}
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file);
$rows = $spreadsheet->getActiveSheet()->toArray();
array_shift($rows); // header
foreach ($rows as $row) {
[$sku, $name, $category, $price, $promo, $desc] = $row;
if (!$sku) continue;
// idempotentny upsert po SKU
$existing = lps_find_zabieg_by_sku($sku);
$data = [
'post_title' => $name,
'post_type' => 'zabieg',
'post_status'=> 'publish',
'meta_input' => [
'sku' => $sku,
'category' => $category,
'price' => $price,
'promo_price' => $promo ?: null,
'description' => $desc,
],
];
if ($existing) {
$data['ID'] = $existing->ID;
wp_update_post($data);
} else {
wp_insert_post($data);
}
}
update_option('lps_pricing_last_sync', time());
error_log('[lps] Cennik zsync, wierszy: ' . count($rows));
}PHP 2. 2. Formularz → REST API systemu pacjentów (fallback do maila) patient-form-handler.php
// Hook do submission Contact Form 7
add_action('wpcf7_before_send_mail', 'lps_send_to_clinic_system', 10, 3);
function lps_send_to_clinic_system($contact_form, &$abort, $submission): void {
$data = $submission->get_posted_data();
$payload = [
'first_name' => sanitize_text_field($data['first-name'] ?? ''),
'last_name' => sanitize_text_field($data['last-name'] ?? ''),
'email' => sanitize_email($data['email'] ?? ''),
'phone' => sanitize_text_field($data['phone'] ?? ''),
'message' => sanitize_textarea_field($data['message'] ?? ''),
'zabieg_id' => intval($data['zabieg-id'] ?? 0),
'source' => 'website-form',
'created_at' => current_time('mysql'),
];
// loguj zgody RODO przed wysłaniem (patrz blok 3)
lps_log_rodo_consents($data, $payload);
$response = wp_remote_post(LPS_CLINIC_API_URL . '/patients/inquiry', [
'headers' => [
'Authorization' => 'Bearer ' . LPS_CLINIC_API_TOKEN,
'Content-Type' => 'application/json',
],
'body' => wp_json_encode($payload),
'timeout' => 10,
]);
if (is_wp_error($response) || wp_remote_retrieve_response_code($response) >= 400) {
// fallback - mail do recepcji + alert do admina
error_log('[lps] Clinic API failed, falling back to email');
lps_fallback_email_to_reception($payload);
// nie przerywamy submission - pacjentka dostaje thank-you
} else {
lps_log_successful_inquiry($payload, $response);
}
}PHP 3. 3. RODO consent logger - audit trail dla art. 9 RODO rodo-consent-logger.php
// Tabela wp_lps_consent_log utworzona w migracji aktywacji motywu
// Zawiera: id, timestamp, ip_hash, consent_version, consents_json,
// consent_texts (snapshot klauzul z dnia), form_payload_hash
function lps_log_rodo_consents(array $form_data, array $payload): void {
global $wpdb;
$consents = [
'contact' => !empty($form_data['consent-contact']),
'marketing' => !empty($form_data['consent-marketing']),
'profiling' => !empty($form_data['consent-profiling']),
];
// aktualnie obowiązująca wersja klauzul
$consent_version = get_option('lps_consent_version', '2026-01-01');
$consent_texts = get_option('lps_consent_texts_' . $consent_version);
$wpdb->insert(
$wpdb->prefix . 'lps_consent_log',
[
'timestamp' => current_time('mysql'),
'ip_hash' => hash('sha256', $_SERVER['REMOTE_ADDR'] ?? 'unknown'),
'consent_version' => $consent_version,
'consents_json' => wp_json_encode($consents),
'consent_texts' => wp_json_encode($consent_texts),
'form_payload_hash' => hash('sha256', wp_json_encode($payload)),
]
);
}Plan rozwoju
Co dalej z projektem
Najczęstsze pytania.
Dlaczego WordPress, skoro Wix/Squarespace są łatwiejsze?
WordPress (bez page buildera) jest najbardziej elastyczny w integracjach z polskimi systemami branżowymi - klinicznymi, fakturującymi, RODO. Wix i Squarespace nie potrafią natywnie zintegrować się z polskim systemem dla pacjentów. Każda integracja byłaby workaroundem przez Zapier albo IFTTT, z opóźnieniami i ryzykiem braku zgodności RODO. WordPress to też CMS, który Pani doktor już zna.
Czemu Excel do cennika, a nie panel WordPress?
Bo recepcja gabinetu już używa Excela codziennie - rozliczenia, dyżury, faktury, plan dnia. Dodanie nowego narzędzia („zaloguj się do WordPressa, znajdź odpowiedni Custom Post Type, edytuj cenę") to opór organizacyjny i ryzyko pomyłki. Strona aktualizuje się sama - dla recepcji zmiana ceny to zapis Excela, jak każdego innego dnia.
Czy taką stronę zrobicie dla każdego lekarza?
Tak, ale stawiamy na pełną specjalizację – budujemy pod konkretną branżę i jej unikalne integracje. Mimo wspólnego zaplecza technologicznego, zupełnie inaczej projektujemy stronę dla pediatry, a inaczej dla chirurga estetycznego. Nasza pierwsza rozmowa służy zbadaniu, czego dokładnie wymaga Twoja profesja. Na co dzień wspieramy gabinety stomatologiczne, kosmetologów z licencją, kancelarie prawne, biura rachunkowe i doradców finansowych.
Co kosztuje taka strona?
Zależy od skali integracji - liczba Custom Post Types (zabieg, blog, opinie, FAQ, zespół), integracja z systemem pacjentów (jest API czy nie), RODO logger, analityka (ile celów konwersji, server-side CAPI), liczba kampanii reklamowych do skonfigurowania, copywriting. Każdy projekt zaczynamy od rozmowy, w której mówimy, co byśmy zrobili dla Twojego gabinetu - z konkretną wyceną z góry.
Następny krok
Prowadzisz gabinet lekarski, stomatologiczny, usługi kosmetologiczne, kancelarię lub biuro rachunkowe? Porozmawiajmy o Twojej stronie internetowej!
Zacznijmy od 30-minutowej rozmowy. Ty powiesz nam, co najbardziej irytuje Cię w Twojej obecnej witrynie, a my damy Ci znać, czy wiemy, jak to skutecznie zmienić. Krótko i na temat.
- Audyt techniczny Twojej strony - LCP, CLS, INP, lista wtyczek, schema markup, podstawa RODO
- Konkretne rekomendacje - co możemy zbudować, w jakiej kolejności, za jaką kwotę
- Plan migracji z obecnej strony (zachowanie URL-i, redirect 301, SEO bez utraty pozycji)
- Estymacja z góry, bez „wycenimy potem" i bez zobowiązania współpracy
®