Dostępne w Bazylei

Programista WordPress w Bazylei

Profesjonalne usługi WordPress w Bazylei - Twoja firma zasługuje na najlepsze rozwiązania cyfrowe

Programista WordPress → Bazylea

Wspieramy społeczność WordPress w Bazylei

Nie jesteśmy tylko zdalną agencją. Jesteśmy aktywną częścią ekosystemu. Wierzymy w Open Source i wnosimy wkład w społeczność, która napędza ponad 40% sieci (W3Techs).

    Programista WordPress & WooCommerce w Bazylei

    01. Wydajność dla lokalnego SEO

    W Bazylei, gdzie konkurencja jest wysoka, szybkość strony to Twój najważniejszy atut SEO. Nasz stack Astro + Headless WP gwarantuje wyniki, które zostawiają konkurencję w tyle.

    02. Bezpieczeństwo poziomu Enterprise

    Dla firm w Bazylei obsługujących sektor Lokalne MŚP i firmy korporacyjne, bezpieczeństwo danych jest priorytetem. Architektura Headless wirtualnie eliminuje najczęstsze wektory ataków na WordPressa.

    Serwis firmowy w Bazylei stoi obok Roche przy Grenzacherstrasse, Novartis Campus przy Fabrikstrasse, acceleratorów DayOne w hubie BaselArea, kalendarza Art Basel przy Messe Basel i trójjęzycznego regionu, w którym impressum musi zgadzać się z Zefix, a nie z niemieckim Amtsgericht. To nie jest powód, żeby WordPress udawał system GxP albo portal kliniczny klasy Novartis. To powód, żeby motyw blokowy, wtyczki i model treści były napisane tak, jak oczekuje bazylejski dział compliance i polski redaktor, który codziennie publikuje po polsku, a front ma wersje DE, FR i EN.

    WPPoland buduje ten WordPress z polskiego zespołu seniorów dla firm w Bazylei i w regionie life sciences. Zakres to programowanie WordPress: motyw blokowy albo klasyczny, własne wtyczki, Gutenberg, CPT, ACF albo natywne bloki, integracje REST i przegląd kodu na Git. Sklep WooCommerce, checkout z TWINT i abonament opieki są osobnymi tematami, z linkami na końcu.

    #Programowanie WordPress dla firm w Bazylei i klastrze life sciences

    Bazylea spina trzy rzeczy, które rzadko spotykają się w jednym mieście w takiej skali. Po pierwsze farmaceutykę i biotechnologię: Roche i Novartis ustawiają poprzeczkę dla dokumentacji, onboardingu partnerów i rekrutacji naukowców. Wokół nich rośnie ekosystem CRO, dostawców, spin-offów i acceleratorów promowanych przez BaselArea (baselarea.swiss). Po drugie trójjęzyczność: Basel-Stadt ma niemiecki jako język urzędowy, region graniczny z Francją (Weg bis nach Saint-Louis) tłumaczy treści regulacyjne i B2B na francuski, a angielski jest językiem operacyjnym w life sciences. Po trzecie Szwajcarię jako jurysdykcję: nDSG (zrewidowana ustawa federalna o ochronie danych), rezydencja danych w CH, hosting u Cyon z Bazylei, Infomaniak albo Metanet, a nie „najtańszy VPS za oceanem”.

    Dla strony WordPress te fakty nie oznaczają, że motyw ma liczyć próbki kliniczne albo synchronizować dane z systemem LIMS. Oznaczają trzy twardsze wymagania. Treść bywa regulowana (Datenschutzerklärung, impressum z UID i Firmenwortlaut z Zefix, wersje DE/FR/EN). Interfejs dla gościa musi trzymać spójność między językami bez rozjechanych hreflang. Hosting, retencja logów i pytanie o origin w Szwajcarii są tematem rozmowy na kickoffie, bo obok siedzi ktoś, kto pyta o nDSG, o EDÖB albo o transfer danych za granicę.

    Typowy brief, który trafia do seniorów Bazylei, nie brzmi „zróbcie ładną stronę”. Brzmi: odziedziczony motyw z 35 wtyczkami, redakcja w Polsce, compliance w Basel-Stadt, Gutenberg używany jak klasyczny edytor, a nowa podstrona pod konferencję life sciences powstaje przez kopiowanie strony z zeszłego roku i ręczne podmienianie dat. To jest problem modelu treści i procesu Git, nie problem szablonu z marketplace.

    WPPoland nie jest dostawcą Roche, Novartis ani BaselArea. Sąsiedztwo klastra pharma ustawia poprzeczkę dokumentacji, ról i Git. Nie ustawia listy referencji.

    #Motyw blokowy, motyw klasyczny i własna wtyczka

    Nowa budowa w Bazylei startuje od decyzji, która później kosztuje miesiącami: czy prezentacja żyje w motywie blokowym z theme.json, czy w klasycznych szablonach PHP, i co idzie do wtyczki. Ta decyzja jest zapisywana przed pierwszym commitem.

    #theme.json, wzorce i granica odpowiedzialności motywu

    Motyw blokowy trzyma tokeny: paletę, skalę typografii, odstępy, szerokości treści. Dla bazylejskiego B2B w life sciences oznacza to stonowaną paletę korporacyjną, czytelny krój bez ozdobników i przyciski, które nie pękają na niemieckich złożeniach w stylu Forschungspartnerschaft albo francuskich łącznikach w tytułach sekcji. Wzorce bloków (block patterns) opisują powtarzalne układy: hero z zastrzeżeniem prawnym, siatka osób z działu, blok cytatu z atrybucją, stopka z impressum zgodnym z Handelsregisteramt des Kantons Basel-Stadt. Redaktor składa stronę z wzorców, zamiast prosić programistę o nowy szablon na każde wydarzenie w inkubatorze DayOne albo na każdą edycję publikacji naukowej.

    Pełna edycja witryny (FSE) ma sens, gdy zespół redakcyjny naprawdę ma dostać kontrolę nad nagłówkiem i stopką. W praktyce wiele firm w Bazylei tej kontroli nie chce: nagłówek jest elementem brandu i compliance, a nie placem zabaw. Wtedy motyw blokowy zostaje, ale szablony części (header, footer) są zablokowane, a redakcja pracuje w obrębie wzorców i własnych bloków. To kompromis, nie półśrodek.

    Każdy własny blok dostaje block.json, kategorię, ikonę i atrybuty ze schematem. Tam, gdzie treść ma trafić do wyszukiwarki i do RSS, render idzie po stronie serwera. React w edytorze służy do InspectorControls i podglądu, nie do tego, żeby front był aplikacją SPA udającą WordPressa. Dokumentacja Block Editor Handbook jest punktem odniesienia przy projektowaniu bloków, nie blogiem marketingowym.

    #Kiedy klasyczny motyw PHP zostaje

    Odziedziczone instalacje w Bazylei często mają pięć, siedem lat: child theme na komercyjnym szkielecie, ACF wklejone w page.php, shortcode’y w treściach, jQuery z epoki przed blokami. Przepisanie tego na FSE „bo tak wypada w 2026” jest droższe niż naprawa hierarchii szablonów, wyciągnięcie logiki do wtyczki i dokładanie Gutenberg tylko tam, gdzie redakcja naprawdę składa nowe landingi.

    Klasyczny motyw zostaje, gdy:

    • logika warunkowa siedzi w szablonach (inne menu dla partnera CRO, inne dla inwestora, inne dla kandydata) i przeniesienie jej do theme.json nic nie upraszcza;
    • zespół redakcyjny publikuje setki stron w klasycznym edytorze i szkolenie z FSE byłoby większym ryzykiem niż dług;
    • child theme jest cienki, a problemem są wtyczki i autoload, nie sam silnik szablonów.

    Nawet wtedy nowe klocki idą jako bloki, nie jako kolejne shortcode’y. Shortcode w treści z 2019 roku zostaje do migracji, nowy kod go nie dokłada.

    #Funkcja do wtyczki, wygląd do motywu

    Granica jest prosta i zapisana w runbooku. Motyw umie pokazać. Wtyczka umie wiedzieć. CPT publikacji naukowych, kolejka do CRM, endpoint REST dla intranetu, rola użytkownika „redaktor PL” bez capability publish_pages na produkcji niemieckiej: to wtyczka. Kolory, siatka, wzorzec hero: to motyw. Jeśli po zmianie motywu znika kalendarz wydarzeń, architektura była zła.

    Własna wtyczka ma własny prefix, autoload PSR-4, plik główny z nagłówkiem Plugin Name i wersją semver, oraz testy tam, gdzie logika liczy (daty wydarzeń, mapowanie pól do CRM, walidacja formularza). Logika biznesowa nie trafia do functions.php motywu, bo functions.php umiera razem z motywem, a bazylejski serwis zmienia agencję brandingową częściej niż model treści.

    Porównanie warstw, którego używamy przy kickoffie:

    WarstwaCo tam żyjePrzykład w Bazylei
    Motywprezentacja, tokeny, wzorcelanding pod konferencję life sciences, stopka z impressum
    WtyczkaCPT, role, REST, integracjekatalog publikacji, kolejka do CRM, logi audytowe
    Gutenbergredakcja bez HTMLwzorzec z zastrzeżeniem, blok osoby z działu
    środowisko testowe i Gitproces, nie featuregałąź, review, promocja na produkcję

    #Gutenberg, CPT i ACF w modelu treści

    Gutenberg bez modelu treści kończy się tym, że każda podstrona jest unikalnym kolażem bloków i nikt nie potrafi zrobić listy. W Bazylei listy są konkretne: publikacje naukowe, wydarzenia, osoby, stanowiska, lokalizacje biur (Kleinbasel to nie Grenzach, Campus Novartis to nie Messe Basel). To są obiekty, nie „kolejne strony w drzewie”.

    #Własne typy treści pod realne obiekty

    CPT rejestrujemy z własnymi capabilities, nie z mapowaniem na post. Redaktor w Polsce ma edytować publikację, a nie kasować wtyczek. Archiwum CPT dostaje szablon albo wzorzec zapytań, a pojedynczy obiekt ma szablon, który nie pozwala redaktorowi rozpychać layoutu poza ustalony układ. Taksonomie są osobne: typ wydarzenia (kongres, webinar, konferencja) nie miesza się z tagami bloga.

    ACF ma tu miejsce, ale nie jako substytut bloków. Pola ACF na CPT sprawdzają się przy danych, które są polami, nie layoutem: data rozpoczęcia, lokalizacja w hubie BaselArea, język wystąpienia, plik PDF z regulaminem. Layout strony osoby albo artykułu składa Gutenberg. Mieszanie ACF Flexible Content z pełnym edytorem bloków na tym samym obiekcie kończy się dwoma źródłami prawdy i redaktorem, który nie wie, gdzie kliknąć.

    Gdzie ACF jest zbędne, atrybuty bloku w block.json wystarczą. Blok „osoba z cytatem” nie potrzebuje grupy pól na każdej stronie. Potrzebuje atrybutów i ewentualnie InnerBlocks na biogram. Mniej wtyczek w panelu to mniej powierzchni ataku i mniej konfliktów z wtyczkami consent i cache.

    #Bloki serwerowe zamiast shortcode’ów

    Shortcode w treści to dług, który widać dopiero przy migracji. Nowy kod w Bazylei idzie jako blok z renderem serwerowym: znaczniki semantyczne, atrybuty w komentarzu bloku, możliwość filtrowania wyjścia. Blok listy wydarzeń czyta CPT, cache’uje zapytanie transjentem z jawnym TTL i invalidacją przy save_post, a nie przy każdym request.

    Dla redakcji trójjęzycznej każdy ciąg w bloku przechodzi przez funkcje i18n WordPressa. Niemiecki string w kodzie PHP jest wyjątkiem, nie regułą. Tłumaczenia leżą w plikach po, nie w hardcoded tablicy w motywie. WPML albo Polylang dokładamy dopiero gdy naprawdę są trzy języki na froncie (DE, FR, EN). Sam panel w DE i treści w PL da się ogarnąć rolami i locale użytkownika, bez pełnego stacku wielojęzycznego.

    przegląd kodu bloku sprawdza trzy rzeczy, zanim gałąź wpadnie do main: czy blok działa po wyłączeniu JS w podglądzie frontu, czy atrybuty mają typy i defaulty, czy nie ładuje całego builda edytora na froncie. Gutenberg, który dokłada megabajt Reacta do strony osoby z zarządu, nie przejdzie review.

    Landing pod konferencję life sciences albo pod wydarzenie w Messe Basel nie powstaje jako kopia strony z zeszłego roku. Powstaje jako obiekt CPT z datą, lokalizacją, językiem i wzorcem. Po wydarzeniu obiekt zostaje w archiwum, a nie jako osierocona podstrona w drzewie.

    #Bazylea: pharma, trójjęzyczność i freeze Art Basel

    Bazylea nie jest węzłem finansowym nad Menem i nie jest portem kontenerowym nad Elbą. Tu liczy się life sciences, trójjęzyczność i kalendarz, który zmienia priorytety wdrożeń. Te trzy osie ustawiają priorytety techniczne dla WordPressa, który ma działać w Bazylei, a nie tylko nosić to miasto w tytule.

    #Life sciences: Roche, Novartis i ekosystem wokół

    Roche ma siedzibę przy Grenzacherstrasse. Novartis Campus siedzi przy Fabrikstrasse. Wokół nich rośnie ekosystem CRO, dostawców, spin-offów i acceleratorów rodzaju DayOne przy BaselArea. To nie jest lista klientów WPPoland i nie jest obietnica certyfikacji GxP. To jest geografia rynku, z której wynika prosta rzecz: serwis „firmowy” w Bazylei bywa wejściem do onboardingu partnera, do rekrutacji naukowca albo do publikacji wyników, które kto inny nadzoruje.

    Basel Digital Hub i BaselArea promują region jako life sciences cluster z dostępem do trzech krajów: Szwajcarii, Niemiec i Francji w rejonie Dreiländereck. Dla WordPressa wynika stąd druga oś: treść i formularze muszą działać po niemiecku, często po francusku i po angielsku, bez rozjechanych hreflang i bez impressum skopiowanego z szablonu dla Zurychu albo Genewy.

    Uniwersytet Bazylejski, Departament Biosystemów i Szpital Uniwersytecki Basel (USB) ustawiają poprzeczkę inaczej niż „strona wizytówkowa agencji”. Komunikacja tych instytucji jest osobnym światem. Dla firm, które z tym klastrem sąsiadują, wynika prosta rzecz: Datenschutzerklärung, impressum i hosting w CH są sprawdzane wcześniej niż kolor przycisku CTA.

    Łatka, która w piątek wyłącza formularz rekrutacyjny z załącznikiem CV, zostawia HR z pustą skrzynką w tygodniu kampanii. Dlatego integracje REST i webhooki idą do wtyczki z testami, a nie do functions.php motywu.

    #Art Basel freeze: kalendarz, który zmienia priorytety wdrożeń

    Art Basel co roku w czerwcu wypełnia Messe Basel i cały region ruchem: galerie, hotele, cateringu, transport, media. Serwisy powiązane z wydarzeniem, ale też strony restauracji, hoteli i usług w promieniu kilku kilometrów od Messeplatz dostają skok ruchu, którego nie widać w „normalnym” CrUX.

    Runbook developmentu dla klientów Bazylei uwzględnia okno Art Basel jako okres podwyższonego ryzyka operacyjnego. W tym tygodniu nie planuje się wdrożeń motywu, nowych bloków ani zmian w wtyczkach, chyba że to hotfix bezpieczeństwa z pisemną zgodą właściciela produktu. środowisko testowe dostaje zmiany, produkcja czeka do poniedziałku po targach. To nie jest superstycja eventowa. To jest uzgodniony freeze wdrożeń, który compliance officer w pharma rozpoznaje z własnych procedur change management.

    #SwissIX i hosting w Szwajcarii

    SwissIX łączy szwajcarskie centra danych. Dla operatora strony w regionie Basel oznacza to, że origin w CH skraca drogę do użytkowników kraju i do sieci, które i tak peerują na giełdzie. Awaria DNS albo certyfikatu jest widoczna od razu; monitoring musi łapać więcej niż „ping do strony głównej”.

    Dane osobowe pod nDSG ciągną pytanie: w której jurysdykcji stoi serwer i kopia. Cyon działa z Bazylei i jest jednym z hosterów, których lokalni operatorzy rozpoznają bez tłumaczenia „dlaczego nie AWS w Virginia”. Infomaniak rozwija infrastrukturę w Szwajcarii. Metanet ma centra w kraju. Rozmowa o hostingu na kickoffie jest merytoryczna, nie wizerunkowa. Czy produkcja jest w CH? Czy kopia wyjeżdża nocą poza kraj? Czy CDN kończy TLS w Szwajcarii, w UE, czy w USA?

    #Operacje trójjęzyczne DE/FR/EN

    Polski zespół zna WordPressa. Klient w Bazylei pyta o coś innego: czy wersja francuska ma ten sam impressum co niemiecka, czy hreflang wskazuje de-CH a nie de-DE, czy formularz zgody ma tekst zgodny z Datenschutzerklärung we wszystkich językach, czy redaktor z Saint-Louis nie publikuje draftu na produkcji.

    #Wielojęzyczność to architektura, nie jednorazowa konfiguracja

    WPML, Polylang albo motyw blokowy z własnym routingiem i18n wymagają regresji po każdej aktualizacji wtyczki tłumaczeń, motywu albo page buildera. Checklista stagingu obejmuje: zapis posta w DE, podgląd FR, przełączenie EN, tagi hreflang w źródle strony, mapę URL bez duplikatów canonical, formularze z polami wymaganymi per locale.

    Basel-Stadt ma niemiecki jako język urzędowy, ale region graniczny z Francją tłumaczy treści regulacyjne i B2B na francuski. Angielski jest językiem operacyjnym w life sciences. Szablon skopiowany wyłącznie z rynku niemieckiego (Amtsgericht, USt-IdNr, Straße z ß) na stronie bazylejskiej AG albo GmbH jest błędem, który prawnik klienta zobaczy szybciej niż Lighthouse.

    Niemiecki język CH nie jest niemieckim z RFN. W tekstach urzędowych i na stronie: ss zamiast ß (Strasse, nicht Straße), MWST zamiast MwSt, Gross zamiast groß. Wersja francuska musi trzymać spójność z niemiecką w danych firmowych (UID, siedziba), nawet gdy copy marketingowe jest lokalne.

    Praktyczne zasady, które wpisujemy w dokumentację motywu:

    • Ciągi interfejsu (przyciski, błędy formularza, aria-label, placeholder) są po niemiecku w formalnym rejestrze, jeśli front DE. Wersja francuska i angielska też są formalne. Polski wariant, jeśli powstaje, nie kopiuje niemieckiego jeden do jednego, tylko naturalny polski rejestr B2B.
    • Redaktorzy w Polsce dostają locale panelu, w którym potrają pracować. To nie musi być ten sam język co front. Mieszanie locale użytkownika z locale strony bez testu kończy się datami w złym formacie i menu, które ucieka z „Beiträge” na „Wpisy” w połowie ekranu.
    • Impressum, Datenschutz i oświadczenie o dostępności są szablonami z polami, nie blokami, które redaktor może przypadkiem usunąć z drzewa. W Bazylei te strony są elementem zgodności, nie stopką marketingową.

    Polylang i WPML rozwiązują hreflang i kopie językowe. Nie rozwiązują procesu: kto akceptuje niemiecki tekst, zanim pójdzie na produkcję. W briefie zapisujemy, czy akceptacja leży po stronie klienta w Bazylei, czy po stronie polskiego content leada. środowisko testowe pokazuje wszystkie trzy wersje językowe, bo regresja „DE się zepsuło, bo ktoś edytował FR” wychodzi dopiero na porównaniu, nie w Lighthouse.

    #Handelsregister, Zefix i rejestr kantonu Basel-Stadt

    Impressum i stopka to nie „wpisz nazwę firmy z wizytówki”. W kantonie Basel-Stadt rejestr prowadzi Handelsregisteramt des Kantons Basel-Stadt (Clarastrasse 28). Federacyjny indeks nazw: Zefix (Zentraler Firmenindex). UID w formacie CHE-xxx.xxx.xxx nadaje BFS; na fakturze MWST ten sam numer dostaje przyrostek MWST. Firmenwortlaut, siedziba i forma prawna mają się zgadzać z wyciągiem, nie z brandingiem z Figma.

    To nie jest rejestr zuryski ani genewski. Szablon impressum skopiowany z Handelsregisteramt des Kantons Zürich albo z genewskiego urzędu na stronie firmy z Basel-Stadt jest błędem widocznym dla lokalnego prawnika szybciej niż regresja LCP. Motyw blokowy trzyma te pola w szablonie stopki zablokowanym przed przypadkową edycją.

    #Dostępność: WCAG 2.1 AA i szwajcarski kontekst

    Dostępność w Bazylei nie jest jednym przepisem. Sektor publiczny i instytucje badawcze coraz częściej wymagają WCAG 2.1 na poziomie AA. Sektor prywatny w life sciences traktuje dostępność jako element reputacji i onboardingu partnerów, nawet gdy nie ma formalnego obowiązku jak niemieckie BFSG. Zespół nie sprzedaje „certyfikatu dostępności” bez testu. Na kickoffie zapisujemy, który reżim w ogóle dotyczy witryny, a potem testujemy to, co da się przetestować w motywie i blokach.

    Co konkretnie robi zespół w kodzie:

    • Semantyka: jeden h1, kolejność nagłówków, przycisk jako button, link jako a, nie div z kliknięciem.
    • Klawiatura i focus: omijanie powtarzalnej nawigacji, widoczny focus, brak pułapek w mega menu.
    • Kontrast i ruch: tokeny w theme.json, szacunek dla prefers-reduced-motion, brak informacji niesionej samym kolorem.
    • Formularze: etykiety powiązane z polami, błędy w tekście, nie tylko w kolorze ramki. Formularz rekrutacyjny z załącznikiem CV musi dać się obsłużyć klawiaturą i czytnikiem ekranu.
    • Media: tekst alternatywny jako pole wymagane w procesie redakcji, nie jako „uzupełnimy później”.
    • PDF: jeśli regulamin, karta produktu albo raport roczny idzie jako załącznik, dostępność dokumentu trafia do briefu. WordPress nie zrobi z JPG-a dostępnego PDF-a.

    Skan automatyczny (axe, Lighthouse) jest bramką CI, nie dowodem zgodności. Dla klienta z sektora publicznego albo z wymogiem WCAG w umowie dostawcy dokładamy ręczną ścieżkę klawiatury i porównanie z listą WCAG. Zespół nie obiecuje poziomu AAA, jeśli brief tego nie wymaga i budżet na to nie pozwala.

    Formularze z danymi osobowymi (rekrutacja, portal partnera, newsletter z profilem) są testowane w trzech wersjach językowych. Błąd walidacji po francusku musi być czytelny po francusku, nie kopią niemieckiego stringa z tłumaczenia maszynowego.

    #Bezpieczeństwo przy stronach w sektorze life sciences

    Sąsiedztwo Roche i Novartis nie czyni marketingowego WordPressa systemem GxP ani certyfikowanym środowiskiem klinicznym. Zespół nie pisze, że strona „spełnia GxP” albo „jest certyfikowana ISO 27001”. Większość korporacyjnych stron WordPress w Bazylei nie jest samodzielnym podmiotem tych reżimów. Część stoi obok organizacji, które są. Wtedy WordPress ma dostarczyć inwentarz, ślad dostępu i dyscyplinę Git, które klient wkleja do własnej dokumentacji.

    Postawa, którą da się utrzymać w kodzie i procesie, bez udawania audytu:

    • Sekretów nie ma w Git. Klucze, hasła bazy i tokeny CRM idą przez zmienne środowiska albo poza repo. wp-config.php w historii Gita z hasłem to incydent, nie „drobiazg na później”.
    • Konta administracyjne mają 2FA. Redaktorzy PL nie dostają install_plugins na produkcji. Rola jest cięta do tego, czego wymaga Gutenberg.
    • XML-RPC zostaje wyłączony, jeśli nie ma uzasadnionego klienta. File editor w panelu też.
    • Nagłówki: HTTPS, HSTS tam gdzie certyfikat i CDN na to pozwalają, CSP dopasowane do realnych skryptów (consent, tag manager, czcionki), nie skopiowane z bloga.
    • Zależności: Composer albo zapisane wersje wtyczek, skan CVE w CI, aktualizacje na stagingu przed produkcją.
    • Kopie i odtworzenie: backup bez przetestowanego restore to ozdoba. Test odtworzenia na stagingu jest w runbooku.
    • Logi: kto zalogował się do wp-admin, skąd poszła zmiana wtyczki. Retencja uzgodniona z nDSG, nie „trzymamy wszystko wiecznie”.

    nDSG (zrewidowana ustawa federalna o ochronie danych, ang. revised FADP) weszła w życie 1 września 2023. Nadzór: Eidgenössischer Datenschutz- und Öffentlichkeitsbeauftragter (EDÖB / FDPIC). Przy stronach przetwarzających dane osobowe przygotowujemy konfigurację zgód, umowy powierzenia i minimalizację danych do weryfikacji z właścicielem procesu. RODO nadal dotyczy przetwarzania, które celuje w osoby w UE. Serwis firmy w Bazylei z ruchem z Unii ma więc dwie warstwy, nie jedną.

    Hosting „w Szwajcarii” (Cyon, Infomaniak, Metanet) jest argumentem o jurysdykcji, nie magiczną tarczą. Firma z Kleinbasel nie naprawi wtyczki, która trzyma CV kandydatów wp_posts bez limitu dostępu.

    #Git, środowisko testowe i przegląd kodu

    To jest warstwa, która odróżnia seniorskie prace WordPress od „wgrania ZIP-a na FTP”. W Bazylei klient z działem IT i tak zapyta o to na drugim spotkaniu, zwłaszcza jeśli recenzent przychodzi z Basel Digital Hub albo z wewnętrznego IT dostawcy CRO.

    Repozytorium trzyma motyw i własne wtyczki. Wtyczki z katalogu WordPress.org i Core nie żyją jako skopiowane foldery w Gicie, chyba że jest twardy powód (fork, łatka, air-gap). Gałąź funkcyjna na jedną zmianę: nowy blok, nowy CPT, poprawka a11y. Pull request ma opis, ekrany albo nagranie z edytora, i checklistę: i18n, dostępność, brak sekretów, czy blok nie psuje klasycznego szablonu jeśli jeszcze żyje.

    przegląd kodu robi senior, który nie pisał tej gałęzi. Review czyta WordPress Coding Standards (PHPCS, sniffs WordPress-Core), ale też czyta intencję: czy CPT nie powinien być wtyczką, czy ACF nie dubluje atrybutów bloku, czy hook nie wisi na init bez potrzeby. Komentarz w PR jest po angielsku albo po polsku, zależnie od recenzenta po stronie klienta; szwajcarskie IT w Bazylei zwykle woli angielski w diffie i niemiecki w dokumentacji redakcyjnej.

    Środowisko testowe jest kopią produkcji z zanonimizowanymi danymi. WP-CLI search-replace na URL, osobne klucze, wyłączone crony, które wysyłają maile do prawdziwych kandydatów. Redakcja klika po stagingu z prawdziwymi wzorcami Gutenberg, nie po localhostcie programisty. Regresja trójjęzyczna (DE, FR, EN), regresja klawiatury i regresja formularza rekrutacyjnego z uploadem CV dzieją się tutaj. Promocja na produkcję jest udokumentowanym krokiem: tag albo merge do main, build zasobów, cache warmup, ścieżka wycofania (poprzedni tag). Zespół nie wgrywa „na szybko” jednego pliku PHP przez SFTP, bo potem nikt nie odtworzy, co stało na produkcji w piątek przed Art Basel.

    WP-CLI jest narzędziem operacyjnym: flush transients, wp scaffold, import CPT, sprawdzanie autoload. Nie zastępuje testów. Tam, gdzie wtyczka liczy (daty, mapowanie, walidacja), idzie PHPUnit. Bloki z nietrywialnym UI dostają test w edytorze na stagingu, bo jsdom nie złapie, że InspectorControls zasłania przycisk Speichern w niemieckim locale.

    Budżet wydajności jest częścią odbioru, nie osobnym projektem. Lighthouse i Core Web Vitals na szablonach, które naprawdę istnieją: archiwum CPT, single, strona z wzorcem hero. Obrazy w AVIF/WebP przez proces budowania, CSS motywu bez importu całego uniwersum bloków, JS edytora nie na froncie. Redis i obiektowy cache mają sens, gdy transjenty i zapytania CPT to pokazują, nie gdy „tak się robi przy firmach pharma”.

    Dla serwisu B2B w Bazylei liczy się czas do pierwszego bajtu z sieci korporacyjnej w CH i z campusu pharma, nie tylko z telefonu na Rheinu. Monitoring z jednego regionu USA kłamie. Punkt pomiaru w Szwajcarii albo przynajmniej w Europie Środkowej jest częścią kontraktu operatorskiego, nie dodatkiem. Polska i Bazylea dzielą CET/CEST, więc okno diagnostyki w dzień roboczy pokrywa się.

    #Przypadek: formularz rekrutacyjny, trójjęzyczność i środowisko testowe

    Serwis korporacyjny prowadzony przez polski zespół, rekrutacja naukowców i specjalistów regulacyjnych w regionie Basel, formularz z załącznikiem CV, wersje DE/EN/FR, zgoda na przetwarzanie zgodna z Datenschutzerklärung. W kolejce do produkcji leżała aktualizacja wtyczki formularzy plus patch wtyczki wielojęzycznej.

    Na środowisku testowym, sklonowanym z produkcji razem z tłumaczeniami, upload CV w wersji FR zwracał 500 po zmianie limitu rozmiaru pliku w nowej wersji wtyczki. Równolegle hreflang wskazywał de-DE zamiast de-CH, bo motyw nadpisał tagi po aktualizacji SEO. Na produkcji ten sam zestaw poszedłby w tygodniu, kiedy HR liczy na ruch z kampanii. Rekruter dostałby pustą skrzynkę, a kandydat komunikat błędu bez numeru ticketu.

    środowisko testowe zatrzymał promocję. wycofanie zmian na kopii testowej potwierdził, że sama wtyczka formularzy jest niewinna, gdy motyw nie woła usuniętego haka i gdy mapowanie locale zgadza się z runbookiem. Motyw dostał poprawkę, checklista (DE, FR, EN, upload, mail do HR, zapis zgody) przeszła, dopiero potem produkcja. Nie ma tu nazwy firmy, bo to kształt zdarzenia, nie case study z logotypem. Jest mechanizm: najpierw kopia, potem produkcja. Bez kopii zostałby post-mortem i ręczne zbieranie CV z maili.

    Ten sam kształt wraca przy wtyczkach consent, przy cache obiektowym, który serwuje starą wersję strony kariery, i przy „drobnej” aktualizacji w tygodniu Art Basel, która obciąża origin w szczycie ruchu. Bazylea nie wybacza tego ciszej niż inny rynek. Wygląda to gorzej, bo obok siedzi ktoś, kto pyta o nDSG i o Zefix.

    #Sklep WooCommerce to osobny zakres

    Ta strona nie buduje checkoutu, bramek ani katalogu produktów. Jeśli brief schodzi na sklep, MWST, QR-Rechnung, TWINT albo bramkę, zakres zmienia właściciela i opisuje go programista WooCommerce w Bazylei. Pillar bez miasta: programista WooCommerce. Mieszanie sklepu z motywem korporacyjnym w jednym repozytorium bez granicy wtyczek to najszybsza droga do tego, żeby aktualizacja Woo rozwaliła landing pod konferencję life sciences, albo odwrotnie.

    Korporacyjna strona z jednym przyciskiem „sklep” do zewnętrznego Woo może zostać w motywie jako link. Sama logika koszyka nie.

    #Po wdrożeniu: przekazanie albo opieka

    Zlecenie programistyczne kończy się dokumentacją, sesją przekazania i dostępem Git dla zespołu klienta. Runbook opisuje: jak dodać wzorzec, jak zarejestrować nowy CPT, jak wypuścić gałąź, jak odtworzyć środowisko testowe, kogo wołać gdy edytor nie zapisuje. Jeśli po starcie potrzebne są aktualizacje Core, monitoring i stały dyżur, to jest opieka techniczna WordPress w Bazylei, nie ukryty aneks do motywu. Pillar bez miasta: utrzymanie stron WordPress.

    Wycena prac programistycznych jest indywidualna i wychodzi na piśmie po ustaleniu zakresu. Na tej stronie nie ma cennika ani „pakietów godzin”. Zmiana zakresu (nagle FSE, nagle trzeci język, nagle integracja z intranetem) wraca do zapisu, zanim wejdzie w sprint.

    #Jak zacząć projekt w Bazylei

    Do rozmowy wystarczy krótki opis: jaki motyw i jakie wtyczki są dziś, kto redaguje (PL/DE/FR/EN), czy front ma wersje DE/FR/EN, czy w grze jest CPT pod publikacje i wydarzenia, czy IT po stronie Bazylei wymaga Git i stagingu od dnia zero, czy hosting musi zostać w Szwajcarii. Zespół ogląda instalację, spisuje ryzyka (Gutenberg używany jak notatnik, sekrety w repo, brak oświadczenia o dostępności, ACF zdublowane z blokami, impressum z niemieckim ß) i proponuje plan z kryteriami odbioru.

    Kontakt: formularz WPPoland. Pillar usługowy, bez miasta w slugach, zostaje przy programiście WordPress.

    Mapa w Bazylei i okolic

    Obsługujemy klientów w Bazylei i pobliskich miejscowościach.

    Treść dedykowana:

    Ta strona zawiera informacje przygotowane specjalnie dla Bazylea.

    Serwis firmowy w Bazylei stoi obok Roche przy Grenzacherstrasse, Novartis Campus przy Fabrikstrasse, acceleratorów DayOne w hubie BaselArea, kalendarza Art Basel przy Messe Basel i trójjęzycznego regionu, w którym impressum musi zgadzać się z Zefix, a nie z niemieckim Amtsgericht. To nie jest powód, żeby WordPress udawał system GxP albo portal kliniczny klasy Novartis. To powód, żeby motyw blokowy, wtyczki i model treści były napisane tak, jak oczekuje bazylejski dział compliance i polski redaktor, który codziennie publikuje po polsku, a front ma wersje DE, FR i EN.

    WPPoland buduje ten WordPress z polskiego zespołu seniorów dla firm w Bazylei i w regionie life sciences. Zakres to programowanie WordPress: motyw blokowy albo klasyczny, własne wtyczki, Gutenberg, CPT, ACF albo natywne bloki, integracje REST i przegląd kodu na Git. Sklep WooCommerce, checkout z TWINT i abonament opieki są osobnymi tematami, z linkami na końcu.

    #Programowanie WordPress dla firm w Bazylei i klastrze life sciences

    Bazylea spina trzy rzeczy, które rzadko spotykają się w jednym mieście w takiej skali. Po pierwsze farmaceutykę i biotechnologię: Roche i Novartis ustawiają poprzeczkę dla dokumentacji, onboardingu partnerów i rekrutacji naukowców. Wokół nich rośnie ekosystem CRO, dostawców, spin-offów i acceleratorów promowanych przez BaselArea (baselarea.swiss). Po drugie trójjęzyczność: Basel-Stadt ma niemiecki jako język urzędowy, region graniczny z Francją (Weg bis nach Saint-Louis) tłumaczy treści regulacyjne i B2B na francuski, a angielski jest językiem operacyjnym w life sciences. Po trzecie Szwajcarię jako jurysdykcję: nDSG (zrewidowana ustawa federalna o ochronie danych), rezydencja danych w CH, hosting u Cyon z Bazylei, Infomaniak albo Metanet, a nie „najtańszy VPS za oceanem”.

    Dla strony WordPress te fakty nie oznaczają, że motyw ma liczyć próbki kliniczne albo synchronizować dane z systemem LIMS. Oznaczają trzy twardsze wymagania. Treść bywa regulowana (Datenschutzerklärung, impressum z UID i Firmenwortlaut z Zefix, wersje DE/FR/EN). Interfejs dla gościa musi trzymać spójność między językami bez rozjechanych hreflang. Hosting, retencja logów i pytanie o origin w Szwajcarii są tematem rozmowy na kickoffie, bo obok siedzi ktoś, kto pyta o nDSG, o EDÖB albo o transfer danych za granicę.

    Typowy brief, który trafia do seniorów Bazylei, nie brzmi „zróbcie ładną stronę”. Brzmi: odziedziczony motyw z 35 wtyczkami, redakcja w Polsce, compliance w Basel-Stadt, Gutenberg używany jak klasyczny edytor, a nowa podstrona pod konferencję life sciences powstaje przez kopiowanie strony z zeszłego roku i ręczne podmienianie dat. To jest problem modelu treści i procesu Git, nie problem szablonu z marketplace.

    WPPoland nie jest dostawcą Roche, Novartis ani BaselArea. Sąsiedztwo klastra pharma ustawia poprzeczkę dokumentacji, ról i Git. Nie ustawia listy referencji.

    #Motyw blokowy, motyw klasyczny i własna wtyczka

    Nowa budowa w Bazylei startuje od decyzji, która później kosztuje miesiącami: czy prezentacja żyje w motywie blokowym z theme.json, czy w klasycznych szablonach PHP, i co idzie do wtyczki. Ta decyzja jest zapisywana przed pierwszym commitem.

    #theme.json, wzorce i granica odpowiedzialności motywu

    Motyw blokowy trzyma tokeny: paletę, skalę typografii, odstępy, szerokości treści. Dla bazylejskiego B2B w life sciences oznacza to stonowaną paletę korporacyjną, czytelny krój bez ozdobników i przyciski, które nie pękają na niemieckich złożeniach w stylu Forschungspartnerschaft albo francuskich łącznikach w tytułach sekcji. Wzorce bloków (block patterns) opisują powtarzalne układy: hero z zastrzeżeniem prawnym, siatka osób z działu, blok cytatu z atrybucją, stopka z impressum zgodnym z Handelsregisteramt des Kantons Basel-Stadt. Redaktor składa stronę z wzorców, zamiast prosić programistę o nowy szablon na każde wydarzenie w inkubatorze DayOne albo na każdą edycję publikacji naukowej.

    Pełna edycja witryny (FSE) ma sens, gdy zespół redakcyjny naprawdę ma dostać kontrolę nad nagłówkiem i stopką. W praktyce wiele firm w Bazylei tej kontroli nie chce: nagłówek jest elementem brandu i compliance, a nie placem zabaw. Wtedy motyw blokowy zostaje, ale szablony części (header, footer) są zablokowane, a redakcja pracuje w obrębie wzorców i własnych bloków. To kompromis, nie półśrodek.

    Każdy własny blok dostaje block.json, kategorię, ikonę i atrybuty ze schematem. Tam, gdzie treść ma trafić do wyszukiwarki i do RSS, render idzie po stronie serwera. React w edytorze służy do InspectorControls i podglądu, nie do tego, żeby front był aplikacją SPA udającą WordPressa. Dokumentacja Block Editor Handbook jest punktem odniesienia przy projektowaniu bloków, nie blogiem marketingowym.

    #Kiedy klasyczny motyw PHP zostaje

    Odziedziczone instalacje w Bazylei często mają pięć, siedem lat: child theme na komercyjnym szkielecie, ACF wklejone w page.php, shortcode’y w treściach, jQuery z epoki przed blokami. Przepisanie tego na FSE „bo tak wypada w 2026” jest droższe niż naprawa hierarchii szablonów, wyciągnięcie logiki do wtyczki i dokładanie Gutenberg tylko tam, gdzie redakcja naprawdę składa nowe landingi.

    Klasyczny motyw zostaje, gdy:

    • logika warunkowa siedzi w szablonach (inne menu dla partnera CRO, inne dla inwestora, inne dla kandydata) i przeniesienie jej do theme.json nic nie upraszcza;
    • zespół redakcyjny publikuje setki stron w klasycznym edytorze i szkolenie z FSE byłoby większym ryzykiem niż dług;
    • child theme jest cienki, a problemem są wtyczki i autoload, nie sam silnik szablonów.

    Nawet wtedy nowe klocki idą jako bloki, nie jako kolejne shortcode’y. Shortcode w treści z 2019 roku zostaje do migracji, nowy kod go nie dokłada.

    #Funkcja do wtyczki, wygląd do motywu

    Granica jest prosta i zapisana w runbooku. Motyw umie pokazać. Wtyczka umie wiedzieć. CPT publikacji naukowych, kolejka do CRM, endpoint REST dla intranetu, rola użytkownika „redaktor PL” bez capability publish_pages na produkcji niemieckiej: to wtyczka. Kolory, siatka, wzorzec hero: to motyw. Jeśli po zmianie motywu znika kalendarz wydarzeń, architektura była zła.

    Własna wtyczka ma własny prefix, autoload PSR-4, plik główny z nagłówkiem Plugin Name i wersją semver, oraz testy tam, gdzie logika liczy (daty wydarzeń, mapowanie pól do CRM, walidacja formularza). Logika biznesowa nie trafia do functions.php motywu, bo functions.php umiera razem z motywem, a bazylejski serwis zmienia agencję brandingową częściej niż model treści.

    Porównanie warstw, którego używamy przy kickoffie:

    WarstwaCo tam żyjePrzykład w Bazylei
    Motywprezentacja, tokeny, wzorcelanding pod konferencję life sciences, stopka z impressum
    WtyczkaCPT, role, REST, integracjekatalog publikacji, kolejka do CRM, logi audytowe
    Gutenbergredakcja bez HTMLwzorzec z zastrzeżeniem, blok osoby z działu
    środowisko testowe i Gitproces, nie featuregałąź, review, promocja na produkcję

    #Gutenberg, CPT i ACF w modelu treści

    Gutenberg bez modelu treści kończy się tym, że każda podstrona jest unikalnym kolażem bloków i nikt nie potrafi zrobić listy. W Bazylei listy są konkretne: publikacje naukowe, wydarzenia, osoby, stanowiska, lokalizacje biur (Kleinbasel to nie Grenzach, Campus Novartis to nie Messe Basel). To są obiekty, nie „kolejne strony w drzewie”.

    #Własne typy treści pod realne obiekty

    CPT rejestrujemy z własnymi capabilities, nie z mapowaniem na post. Redaktor w Polsce ma edytować publikację, a nie kasować wtyczek. Archiwum CPT dostaje szablon albo wzorzec zapytań, a pojedynczy obiekt ma szablon, który nie pozwala redaktorowi rozpychać layoutu poza ustalony układ. Taksonomie są osobne: typ wydarzenia (kongres, webinar, konferencja) nie miesza się z tagami bloga.

    ACF ma tu miejsce, ale nie jako substytut bloków. Pola ACF na CPT sprawdzają się przy danych, które są polami, nie layoutem: data rozpoczęcia, lokalizacja w hubie BaselArea, język wystąpienia, plik PDF z regulaminem. Layout strony osoby albo artykułu składa Gutenberg. Mieszanie ACF Flexible Content z pełnym edytorem bloków na tym samym obiekcie kończy się dwoma źródłami prawdy i redaktorem, który nie wie, gdzie kliknąć.

    Gdzie ACF jest zbędne, atrybuty bloku w block.json wystarczą. Blok „osoba z cytatem” nie potrzebuje grupy pól na każdej stronie. Potrzebuje atrybutów i ewentualnie InnerBlocks na biogram. Mniej wtyczek w panelu to mniej powierzchni ataku i mniej konfliktów z wtyczkami consent i cache.

    #Bloki serwerowe zamiast shortcode’ów

    Shortcode w treści to dług, który widać dopiero przy migracji. Nowy kod w Bazylei idzie jako blok z renderem serwerowym: znaczniki semantyczne, atrybuty w komentarzu bloku, możliwość filtrowania wyjścia. Blok listy wydarzeń czyta CPT, cache’uje zapytanie transjentem z jawnym TTL i invalidacją przy save_post, a nie przy każdym request.

    Dla redakcji trójjęzycznej każdy ciąg w bloku przechodzi przez funkcje i18n WordPressa. Niemiecki string w kodzie PHP jest wyjątkiem, nie regułą. Tłumaczenia leżą w plikach po, nie w hardcoded tablicy w motywie. WPML albo Polylang dokładamy dopiero gdy naprawdę są trzy języki na froncie (DE, FR, EN). Sam panel w DE i treści w PL da się ogarnąć rolami i locale użytkownika, bez pełnego stacku wielojęzycznego.

    przegląd kodu bloku sprawdza trzy rzeczy, zanim gałąź wpadnie do main: czy blok działa po wyłączeniu JS w podglądzie frontu, czy atrybuty mają typy i defaulty, czy nie ładuje całego builda edytora na froncie. Gutenberg, który dokłada megabajt Reacta do strony osoby z zarządu, nie przejdzie review.

    Landing pod konferencję life sciences albo pod wydarzenie w Messe Basel nie powstaje jako kopia strony z zeszłego roku. Powstaje jako obiekt CPT z datą, lokalizacją, językiem i wzorcem. Po wydarzeniu obiekt zostaje w archiwum, a nie jako osierocona podstrona w drzewie.

    #Bazylea: pharma, trójjęzyczność i freeze Art Basel

    Bazylea nie jest węzłem finansowym nad Menem i nie jest portem kontenerowym nad Elbą. Tu liczy się life sciences, trójjęzyczność i kalendarz, który zmienia priorytety wdrożeń. Te trzy osie ustawiają priorytety techniczne dla WordPressa, który ma działać w Bazylei, a nie tylko nosić to miasto w tytule.

    #Life sciences: Roche, Novartis i ekosystem wokół

    Roche ma siedzibę przy Grenzacherstrasse. Novartis Campus siedzi przy Fabrikstrasse. Wokół nich rośnie ekosystem CRO, dostawców, spin-offów i acceleratorów rodzaju DayOne przy BaselArea. To nie jest lista klientów WPPoland i nie jest obietnica certyfikacji GxP. To jest geografia rynku, z której wynika prosta rzecz: serwis „firmowy” w Bazylei bywa wejściem do onboardingu partnera, do rekrutacji naukowca albo do publikacji wyników, które kto inny nadzoruje.

    Basel Digital Hub i BaselArea promują region jako life sciences cluster z dostępem do trzech krajów: Szwajcarii, Niemiec i Francji w rejonie Dreiländereck. Dla WordPressa wynika stąd druga oś: treść i formularze muszą działać po niemiecku, często po francusku i po angielsku, bez rozjechanych hreflang i bez impressum skopiowanego z szablonu dla Zurychu albo Genewy.

    Uniwersytet Bazylejski, Departament Biosystemów i Szpital Uniwersytecki Basel (USB) ustawiają poprzeczkę inaczej niż „strona wizytówkowa agencji”. Komunikacja tych instytucji jest osobnym światem. Dla firm, które z tym klastrem sąsiadują, wynika prosta rzecz: Datenschutzerklärung, impressum i hosting w CH są sprawdzane wcześniej niż kolor przycisku CTA.

    Łatka, która w piątek wyłącza formularz rekrutacyjny z załącznikiem CV, zostawia HR z pustą skrzynką w tygodniu kampanii. Dlatego integracje REST i webhooki idą do wtyczki z testami, a nie do functions.php motywu.

    #Art Basel freeze: kalendarz, który zmienia priorytety wdrożeń

    Art Basel co roku w czerwcu wypełnia Messe Basel i cały region ruchem: galerie, hotele, cateringu, transport, media. Serwisy powiązane z wydarzeniem, ale też strony restauracji, hoteli i usług w promieniu kilku kilometrów od Messeplatz dostają skok ruchu, którego nie widać w „normalnym” CrUX.

    Runbook developmentu dla klientów Bazylei uwzględnia okno Art Basel jako okres podwyższonego ryzyka operacyjnego. W tym tygodniu nie planuje się wdrożeń motywu, nowych bloków ani zmian w wtyczkach, chyba że to hotfix bezpieczeństwa z pisemną zgodą właściciela produktu. środowisko testowe dostaje zmiany, produkcja czeka do poniedziałku po targach. To nie jest superstycja eventowa. To jest uzgodniony freeze wdrożeń, który compliance officer w pharma rozpoznaje z własnych procedur change management.

    #SwissIX i hosting w Szwajcarii

    SwissIX łączy szwajcarskie centra danych. Dla operatora strony w regionie Basel oznacza to, że origin w CH skraca drogę do użytkowników kraju i do sieci, które i tak peerują na giełdzie. Awaria DNS albo certyfikatu jest widoczna od razu; monitoring musi łapać więcej niż „ping do strony głównej”.

    Dane osobowe pod nDSG ciągną pytanie: w której jurysdykcji stoi serwer i kopia. Cyon działa z Bazylei i jest jednym z hosterów, których lokalni operatorzy rozpoznają bez tłumaczenia „dlaczego nie AWS w Virginia”. Infomaniak rozwija infrastrukturę w Szwajcarii. Metanet ma centra w kraju. Rozmowa o hostingu na kickoffie jest merytoryczna, nie wizerunkowa. Czy produkcja jest w CH? Czy kopia wyjeżdża nocą poza kraj? Czy CDN kończy TLS w Szwajcarii, w UE, czy w USA?

    #Operacje trójjęzyczne DE/FR/EN

    Polski zespół zna WordPressa. Klient w Bazylei pyta o coś innego: czy wersja francuska ma ten sam impressum co niemiecka, czy hreflang wskazuje de-CH a nie de-DE, czy formularz zgody ma tekst zgodny z Datenschutzerklärung we wszystkich językach, czy redaktor z Saint-Louis nie publikuje draftu na produkcji.

    #Wielojęzyczność to architektura, nie jednorazowa konfiguracja

    WPML, Polylang albo motyw blokowy z własnym routingiem i18n wymagają regresji po każdej aktualizacji wtyczki tłumaczeń, motywu albo page buildera. Checklista stagingu obejmuje: zapis posta w DE, podgląd FR, przełączenie EN, tagi hreflang w źródle strony, mapę URL bez duplikatów canonical, formularze z polami wymaganymi per locale.

    Basel-Stadt ma niemiecki jako język urzędowy, ale region graniczny z Francją tłumaczy treści regulacyjne i B2B na francuski. Angielski jest językiem operacyjnym w life sciences. Szablon skopiowany wyłącznie z rynku niemieckiego (Amtsgericht, USt-IdNr, Straße z ß) na stronie bazylejskiej AG albo GmbH jest błędem, który prawnik klienta zobaczy szybciej niż Lighthouse.

    Niemiecki język CH nie jest niemieckim z RFN. W tekstach urzędowych i na stronie: ss zamiast ß (Strasse, nicht Straße), MWST zamiast MwSt, Gross zamiast groß. Wersja francuska musi trzymać spójność z niemiecką w danych firmowych (UID, siedziba), nawet gdy copy marketingowe jest lokalne.

    Praktyczne zasady, które wpisujemy w dokumentację motywu:

    • Ciągi interfejsu (przyciski, błędy formularza, aria-label, placeholder) są po niemiecku w formalnym rejestrze, jeśli front DE. Wersja francuska i angielska też są formalne. Polski wariant, jeśli powstaje, nie kopiuje niemieckiego jeden do jednego, tylko naturalny polski rejestr B2B.
    • Redaktorzy w Polsce dostają locale panelu, w którym potrają pracować. To nie musi być ten sam język co front. Mieszanie locale użytkownika z locale strony bez testu kończy się datami w złym formacie i menu, które ucieka z „Beiträge” na „Wpisy” w połowie ekranu.
    • Impressum, Datenschutz i oświadczenie o dostępności są szablonami z polami, nie blokami, które redaktor może przypadkiem usunąć z drzewa. W Bazylei te strony są elementem zgodności, nie stopką marketingową.

    Polylang i WPML rozwiązują hreflang i kopie językowe. Nie rozwiązują procesu: kto akceptuje niemiecki tekst, zanim pójdzie na produkcję. W briefie zapisujemy, czy akceptacja leży po stronie klienta w Bazylei, czy po stronie polskiego content leada. środowisko testowe pokazuje wszystkie trzy wersje językowe, bo regresja „DE się zepsuło, bo ktoś edytował FR” wychodzi dopiero na porównaniu, nie w Lighthouse.

    #Handelsregister, Zefix i rejestr kantonu Basel-Stadt

    Impressum i stopka to nie „wpisz nazwę firmy z wizytówki”. W kantonie Basel-Stadt rejestr prowadzi Handelsregisteramt des Kantons Basel-Stadt (Clarastrasse 28). Federacyjny indeks nazw: Zefix (Zentraler Firmenindex). UID w formacie CHE-xxx.xxx.xxx nadaje BFS; na fakturze MWST ten sam numer dostaje przyrostek MWST. Firmenwortlaut, siedziba i forma prawna mają się zgadzać z wyciągiem, nie z brandingiem z Figma.

    To nie jest rejestr zuryski ani genewski. Szablon impressum skopiowany z Handelsregisteramt des Kantons Zürich albo z genewskiego urzędu na stronie firmy z Basel-Stadt jest błędem widocznym dla lokalnego prawnika szybciej niż regresja LCP. Motyw blokowy trzyma te pola w szablonie stopki zablokowanym przed przypadkową edycją.

    #Dostępność: WCAG 2.1 AA i szwajcarski kontekst

    Dostępność w Bazylei nie jest jednym przepisem. Sektor publiczny i instytucje badawcze coraz częściej wymagają WCAG 2.1 na poziomie AA. Sektor prywatny w life sciences traktuje dostępność jako element reputacji i onboardingu partnerów, nawet gdy nie ma formalnego obowiązku jak niemieckie BFSG. Zespół nie sprzedaje „certyfikatu dostępności” bez testu. Na kickoffie zapisujemy, który reżim w ogóle dotyczy witryny, a potem testujemy to, co da się przetestować w motywie i blokach.

    Co konkretnie robi zespół w kodzie:

    • Semantyka: jeden h1, kolejność nagłówków, przycisk jako button, link jako a, nie div z kliknięciem.
    • Klawiatura i focus: omijanie powtarzalnej nawigacji, widoczny focus, brak pułapek w mega menu.
    • Kontrast i ruch: tokeny w theme.json, szacunek dla prefers-reduced-motion, brak informacji niesionej samym kolorem.
    • Formularze: etykiety powiązane z polami, błędy w tekście, nie tylko w kolorze ramki. Formularz rekrutacyjny z załącznikiem CV musi dać się obsłużyć klawiaturą i czytnikiem ekranu.
    • Media: tekst alternatywny jako pole wymagane w procesie redakcji, nie jako „uzupełnimy później”.
    • PDF: jeśli regulamin, karta produktu albo raport roczny idzie jako załącznik, dostępność dokumentu trafia do briefu. WordPress nie zrobi z JPG-a dostępnego PDF-a.

    Skan automatyczny (axe, Lighthouse) jest bramką CI, nie dowodem zgodności. Dla klienta z sektora publicznego albo z wymogiem WCAG w umowie dostawcy dokładamy ręczną ścieżkę klawiatury i porównanie z listą WCAG. Zespół nie obiecuje poziomu AAA, jeśli brief tego nie wymaga i budżet na to nie pozwala.

    Formularze z danymi osobowymi (rekrutacja, portal partnera, newsletter z profilem) są testowane w trzech wersjach językowych. Błąd walidacji po francusku musi być czytelny po francusku, nie kopią niemieckiego stringa z tłumaczenia maszynowego.

    #Bezpieczeństwo przy stronach w sektorze life sciences

    Sąsiedztwo Roche i Novartis nie czyni marketingowego WordPressa systemem GxP ani certyfikowanym środowiskiem klinicznym. Zespół nie pisze, że strona „spełnia GxP” albo „jest certyfikowana ISO 27001”. Większość korporacyjnych stron WordPress w Bazylei nie jest samodzielnym podmiotem tych reżimów. Część stoi obok organizacji, które są. Wtedy WordPress ma dostarczyć inwentarz, ślad dostępu i dyscyplinę Git, które klient wkleja do własnej dokumentacji.

    Postawa, którą da się utrzymać w kodzie i procesie, bez udawania audytu:

    • Sekretów nie ma w Git. Klucze, hasła bazy i tokeny CRM idą przez zmienne środowiska albo poza repo. wp-config.php w historii Gita z hasłem to incydent, nie „drobiazg na później”.
    • Konta administracyjne mają 2FA. Redaktorzy PL nie dostają install_plugins na produkcji. Rola jest cięta do tego, czego wymaga Gutenberg.
    • XML-RPC zostaje wyłączony, jeśli nie ma uzasadnionego klienta. File editor w panelu też.
    • Nagłówki: HTTPS, HSTS tam gdzie certyfikat i CDN na to pozwalają, CSP dopasowane do realnych skryptów (consent, tag manager, czcionki), nie skopiowane z bloga.
    • Zależności: Composer albo zapisane wersje wtyczek, skan CVE w CI, aktualizacje na stagingu przed produkcją.
    • Kopie i odtworzenie: backup bez przetestowanego restore to ozdoba. Test odtworzenia na stagingu jest w runbooku.
    • Logi: kto zalogował się do wp-admin, skąd poszła zmiana wtyczki. Retencja uzgodniona z nDSG, nie „trzymamy wszystko wiecznie”.

    nDSG (zrewidowana ustawa federalna o ochronie danych, ang. revised FADP) weszła w życie 1 września 2023. Nadzór: Eidgenössischer Datenschutz- und Öffentlichkeitsbeauftragter (EDÖB / FDPIC). Przy stronach przetwarzających dane osobowe przygotowujemy konfigurację zgód, umowy powierzenia i minimalizację danych do weryfikacji z właścicielem procesu. RODO nadal dotyczy przetwarzania, które celuje w osoby w UE. Serwis firmy w Bazylei z ruchem z Unii ma więc dwie warstwy, nie jedną.

    Hosting „w Szwajcarii” (Cyon, Infomaniak, Metanet) jest argumentem o jurysdykcji, nie magiczną tarczą. Firma z Kleinbasel nie naprawi wtyczki, która trzyma CV kandydatów wp_posts bez limitu dostępu.

    #Git, środowisko testowe i przegląd kodu

    To jest warstwa, która odróżnia seniorskie prace WordPress od „wgrania ZIP-a na FTP”. W Bazylei klient z działem IT i tak zapyta o to na drugim spotkaniu, zwłaszcza jeśli recenzent przychodzi z Basel Digital Hub albo z wewnętrznego IT dostawcy CRO.

    Repozytorium trzyma motyw i własne wtyczki. Wtyczki z katalogu WordPress.org i Core nie żyją jako skopiowane foldery w Gicie, chyba że jest twardy powód (fork, łatka, air-gap). Gałąź funkcyjna na jedną zmianę: nowy blok, nowy CPT, poprawka a11y. Pull request ma opis, ekrany albo nagranie z edytora, i checklistę: i18n, dostępność, brak sekretów, czy blok nie psuje klasycznego szablonu jeśli jeszcze żyje.

    przegląd kodu robi senior, który nie pisał tej gałęzi. Review czyta WordPress Coding Standards (PHPCS, sniffs WordPress-Core), ale też czyta intencję: czy CPT nie powinien być wtyczką, czy ACF nie dubluje atrybutów bloku, czy hook nie wisi na init bez potrzeby. Komentarz w PR jest po angielsku albo po polsku, zależnie od recenzenta po stronie klienta; szwajcarskie IT w Bazylei zwykle woli angielski w diffie i niemiecki w dokumentacji redakcyjnej.

    Środowisko testowe jest kopią produkcji z zanonimizowanymi danymi. WP-CLI search-replace na URL, osobne klucze, wyłączone crony, które wysyłają maile do prawdziwych kandydatów. Redakcja klika po stagingu z prawdziwymi wzorcami Gutenberg, nie po localhostcie programisty. Regresja trójjęzyczna (DE, FR, EN), regresja klawiatury i regresja formularza rekrutacyjnego z uploadem CV dzieją się tutaj. Promocja na produkcję jest udokumentowanym krokiem: tag albo merge do main, build zasobów, cache warmup, ścieżka wycofania (poprzedni tag). Zespół nie wgrywa „na szybko” jednego pliku PHP przez SFTP, bo potem nikt nie odtworzy, co stało na produkcji w piątek przed Art Basel.

    WP-CLI jest narzędziem operacyjnym: flush transients, wp scaffold, import CPT, sprawdzanie autoload. Nie zastępuje testów. Tam, gdzie wtyczka liczy (daty, mapowanie, walidacja), idzie PHPUnit. Bloki z nietrywialnym UI dostają test w edytorze na stagingu, bo jsdom nie złapie, że InspectorControls zasłania przycisk Speichern w niemieckim locale.

    Budżet wydajności jest częścią odbioru, nie osobnym projektem. Lighthouse i Core Web Vitals na szablonach, które naprawdę istnieją: archiwum CPT, single, strona z wzorcem hero. Obrazy w AVIF/WebP przez proces budowania, CSS motywu bez importu całego uniwersum bloków, JS edytora nie na froncie. Redis i obiektowy cache mają sens, gdy transjenty i zapytania CPT to pokazują, nie gdy „tak się robi przy firmach pharma”.

    Dla serwisu B2B w Bazylei liczy się czas do pierwszego bajtu z sieci korporacyjnej w CH i z campusu pharma, nie tylko z telefonu na Rheinu. Monitoring z jednego regionu USA kłamie. Punkt pomiaru w Szwajcarii albo przynajmniej w Europie Środkowej jest częścią kontraktu operatorskiego, nie dodatkiem. Polska i Bazylea dzielą CET/CEST, więc okno diagnostyki w dzień roboczy pokrywa się.

    #Przypadek: formularz rekrutacyjny, trójjęzyczność i środowisko testowe

    Serwis korporacyjny prowadzony przez polski zespół, rekrutacja naukowców i specjalistów regulacyjnych w regionie Basel, formularz z załącznikiem CV, wersje DE/EN/FR, zgoda na przetwarzanie zgodna z Datenschutzerklärung. W kolejce do produkcji leżała aktualizacja wtyczki formularzy plus patch wtyczki wielojęzycznej.

    Na środowisku testowym, sklonowanym z produkcji razem z tłumaczeniami, upload CV w wersji FR zwracał 500 po zmianie limitu rozmiaru pliku w nowej wersji wtyczki. Równolegle hreflang wskazywał de-DE zamiast de-CH, bo motyw nadpisał tagi po aktualizacji SEO. Na produkcji ten sam zestaw poszedłby w tygodniu, kiedy HR liczy na ruch z kampanii. Rekruter dostałby pustą skrzynkę, a kandydat komunikat błędu bez numeru ticketu.

    środowisko testowe zatrzymał promocję. wycofanie zmian na kopii testowej potwierdził, że sama wtyczka formularzy jest niewinna, gdy motyw nie woła usuniętego haka i gdy mapowanie locale zgadza się z runbookiem. Motyw dostał poprawkę, checklista (DE, FR, EN, upload, mail do HR, zapis zgody) przeszła, dopiero potem produkcja. Nie ma tu nazwy firmy, bo to kształt zdarzenia, nie case study z logotypem. Jest mechanizm: najpierw kopia, potem produkcja. Bez kopii zostałby post-mortem i ręczne zbieranie CV z maili.

    Ten sam kształt wraca przy wtyczkach consent, przy cache obiektowym, który serwuje starą wersję strony kariery, i przy „drobnej” aktualizacji w tygodniu Art Basel, która obciąża origin w szczycie ruchu. Bazylea nie wybacza tego ciszej niż inny rynek. Wygląda to gorzej, bo obok siedzi ktoś, kto pyta o nDSG i o Zefix.

    #Sklep WooCommerce to osobny zakres

    Ta strona nie buduje checkoutu, bramek ani katalogu produktów. Jeśli brief schodzi na sklep, MWST, QR-Rechnung, TWINT albo bramkę, zakres zmienia właściciela i opisuje go programista WooCommerce w Bazylei. Pillar bez miasta: programista WooCommerce. Mieszanie sklepu z motywem korporacyjnym w jednym repozytorium bez granicy wtyczek to najszybsza droga do tego, żeby aktualizacja Woo rozwaliła landing pod konferencję life sciences, albo odwrotnie.

    Korporacyjna strona z jednym przyciskiem „sklep” do zewnętrznego Woo może zostać w motywie jako link. Sama logika koszyka nie.

    #Po wdrożeniu: przekazanie albo opieka

    Zlecenie programistyczne kończy się dokumentacją, sesją przekazania i dostępem Git dla zespołu klienta. Runbook opisuje: jak dodać wzorzec, jak zarejestrować nowy CPT, jak wypuścić gałąź, jak odtworzyć środowisko testowe, kogo wołać gdy edytor nie zapisuje. Jeśli po starcie potrzebne są aktualizacje Core, monitoring i stały dyżur, to jest opieka techniczna WordPress w Bazylei, nie ukryty aneks do motywu. Pillar bez miasta: utrzymanie stron WordPress.

    Wycena prac programistycznych jest indywidualna i wychodzi na piśmie po ustaleniu zakresu. Na tej stronie nie ma cennika ani „pakietów godzin”. Zmiana zakresu (nagle FSE, nagle trzeci język, nagle integracja z intranetem) wraca do zapisu, zanim wejdzie w sprint.

    #Jak zacząć projekt w Bazylei

    Do rozmowy wystarczy krótki opis: jaki motyw i jakie wtyczki są dziś, kto redaguje (PL/DE/FR/EN), czy front ma wersje DE/FR/EN, czy w grze jest CPT pod publikacje i wydarzenia, czy IT po stronie Bazylei wymaga Git i stagingu od dnia zero, czy hosting musi zostać w Szwajcarii. Zespół ogląda instalację, spisuje ryzyka (Gutenberg używany jak notatnik, sekrety w repo, brak oświadczenia o dostępności, ACF zdublowane z blokami, impressum z niemieckim ß) i proponuje plan z kryteriami odbioru.

    Kontakt: formularz WPPoland. Pillar usługowy, bez miasta w slugach, zostaje przy programiście WordPress.

    Przewodniki metodyczne (SEO, GEO, compliance)

    Te materiały opisują, jak pracujemy nad cytowaniami w modelach językowych, modernizacją WooCommerce B2B oraz odpornością operacyjną pod NIS2 i przetargi - niezależnie od miasta realizacji.

    Zobacz też w innych miastach Szwajcarii

    Co wyróżnia w Bazylei

    Lokalna ekspertyza: - Seniorskie prace WordPress dla firm w Bazylei i klastrze life sciences - Motywy blokowe, wtyczki, wzorce Gutenberg oraz model treści pod DE/FR/EN - WordPress Coding Standards, WCAG 2.1 AA i i18n wpisane w proces realizacji Nasz zespół rozumie specyfikę rynku w Bazylei i dostosowuje rozwiązania do lokalnych potrzeb biznesowych. Największą przewagą jest połączenie technicznej jakości z lokalnym kontekstem biznesowym Bazylei.

    Potrzebujesz usługi: Programista WordPress w Bazylei?

    Porozmawiajmy o tym, jak możemy wprowadzić Twoją stronę na wyższy poziom wydajności.

    Umów bezpłatną konsultację w Bazylei

    FAQ - Programista WordPress w Bazylei

    Jakie projekty WordPress podejmujecie w Bazylei?

    Dedykowane motywy zgodne z WordPress Coding Standards, własne wtyczki, wzorce bloków Gutenberg, modele treści oparte na CPT plus ACF albo natywne atrybuty bloków, integracje REST oraz refaktoryzacje starszych motywów. Zakres trzyma się prac programistycznych WordPress dla firm w Bazylei i regionie life sciences. Jeśli inny stack faktycznie byłby lepszy, zespół zapisuje to na piśmie zamiast zmieniać temat strony.

    Motyw od zera czy rozszerzenie istniejącego?

    Oba podejścia. Nowy projekt w Bazylei zwykle zaczyna się od motywu blokowego opartego o API edytora: theme.json, wzorce bloków, warianty. Odziedziczone instalacje częściej potrzebują skoncentrowanej refaktoryzacji hierarchii szablonów i procesu budowania zasobów niż przepisywania od zera. Decyzja zapada na bazie kosztu względem długu, a nie tego, co ciekawiej się buduje.

    Gutenberg i FSE czy motyw klasyczny?

    Dla nowych budów domyślem jest motyw blokowy z edycją całej witryny, bo tam zmierza edytor WordPressa. Klasyczne motywy PHP zostają, gdy istniejąca warstwa logiki w szablonach jest zbyt kosztowna do przeniesienia, albo gdy zespół redakcyjny pracuje w klasycznym edytorze i zmiana narzędzia byłaby większym ryzykiem niż dług techniczny. Wybór trafia do pisemnego kompromisu technicznego, nie do decyzji ideologicznej.

    Czy budujecie też wtyczki, czy tylko motywy?

    Jeśli funkcjonalność jest logiczna, a nie prezentacyjna, trafia do wtyczki, żeby przetrwała zmianę motywu. Motywy opisują prezentację i strukturę redakcyjną. Wtyczki trzymają integracje, własne typy treści, logikę biznesową, endpointy REST i narzędzia administracyjne. Granica zapada na etapie architektury i jest zapisana w runbooku.

    Jak wygląda przekazanie i dalsze utrzymanie?

    Żyjąca dokumentacja dla redaktorów i programistów, ślad przegląd kodu na każdej gałęzi, pisemny zapis decyzji architektonicznych oraz sesja przekazania na koniec zlecenia. Projekt może następnie trafić do zespołu klienta albo na opcjonalną opiekę z tą samą dokumentacją. Stałe aktualizacje i monitoring opisuje osobna strona opieki, nie ten brief.

    Technologie i Specjalizacje - w Bazylei

    Wspominamy o:

    WordPressNovartisRocheSEOWydajność stron internetowych
    Powiązany klaster

    Sprawdź inne usługi WordPress i bazę wiedzy

    Wzmocnij swój biznes dzięki profesjonalnemu wsparciu technicznemu w kluczowych obszarach ekosystemu WordPress.