helban.dev

Szablon WordPress, który przeżywa skopiowanie

Klient potrzebował jednej strony-wzorca, którą kopiuje pod kolejną lokalizację, zamiast budować każdą od zera. Skopiowany WordPress nie psuje się na plikach. Psuje się na numerach: formularz, menu i zdjęcie trzymają się identyfikatorów nadanych przez bazę, w której powstały, a w kopii te numery nic nie znaczą. W tym szablonie nie ma ani jednego takiego numeru. Niżej: co dokładnie pęka, czego użyć zamiast tego i gdzie kończy się to, co mogę o tej robocie uczciwie powiedzieć.

Stack: WordPress · GeneratePress Premium · GenerateBlocks Pro · WP-CLI Zakres: motyw potomny + skrypty wdrożeniowe Oddane: lipiec 2026
9
pól do wypełnienia przy nowej stronie
0
identyfikatorów z bazy w całym szablonie
8
asercji, że powtórzona migracja nic nie zmienia
Zadanie

Jedna strona-wzorzec, wiele kopii

Klient prowadzi lokalne strony pozyskujące zapytania, każda pod inny rodzaj usługi. Wszystkie robią to samo: opisują usługę, pokazują telefon, zbierają zgłoszenie. Różnią się nazwą, kolorami, danymi kontaktowymi i treścią. Budowanie każdej z osobna jest oczywiste i drogie: dwudziesta strona kosztuje tyle samo co pierwsza.

Zamówieniem nie była więc strona. Była nią strona, którą da się dobrze skopiować, plus skrypty, które ją instalują i aktualizują. To dwie różne poprzeczki: strona ma dobrze wyglądać, a szablon ma nadal działać, kiedy ktoś go powieli i zmieni sześć rzeczy.

Sedno

Kopia pęka na numerach, nie na plikach

Skopiuj instalację WordPressa, a pliki dojdą w całości. Baza też. Nie przeżywa znaczenie numerów, które w niej siedzą, bo pół WordPressa odwołuje się do rzeczy przez identyfikator wymyślony przez tamtą bazę.

Objaw

Skopiowana strona wygląda na gotową i po cichu nie jest. Formularz kontaktowy nie renderuje się w ogóle, menu wychodzi puste, jedno zdjęcie zostaje pustą ramką. Nikt nie widzi błędu, bo to nie są błędy: każde z tych zapytań wykonało się poprawnie i nic nie zwróciło.

Co się naprawdę dzieje

Formularz jest osadzony przez ID wpisu. Menu podpięte przez term_id. Zdjęcie na kafelku to ID załącznika. Wszystkie trzy numery nadała ta baza, która je stworzyła, więc w kopii wskazują na nic albo, gorzej, na cokolwiek innego, co akurat pod tym numerem leży.

Obejście

Nic w szablonie nie może rozwiązywać się przez numer wymyślony przez bazę. Formularz odnajduje się po slugu. Menu czyta się po slugu. Zdjęcie zastępcze przestało być wgranym plikiem, a stało się plikiem motywu, bo ID załącznika należy do bazy, która je stworzyła, a plik motywu należy do motywu.

To cała sztuczka i brzmi na zbyt drobną, żeby miała znaczenie. To różnica między kopią, która działa, a kopią, która za każdym razem wymaga popołudnia klikania.

Panel

Sześć rzeczy do zmiany, dziewięć pól

Wszystko, co różni strony, siedzi w jednym miejscu w Customizerze: nazwa firmy, logo, kolor marki, telefon, e-mail i adres. Sześć rzeczy, o których myśli człowiek, wpisywanych przez dziewięć pól, i nic poza tym nie trzeba ruszać po skopiowaniu strony.

Adres to cztery z tych dziewięciu i jest to decyzja, nie przypadek. Google chce adresu firmy w rozbiciu na składniki, a nie jako jednej linijki dowolnego tekstu. Jedno pole trzeba by potem rozbijać zgadywanką, a pierwszy adres wpisany w nieoczekiwanym kształcie po cichu wyprodukowałby błędne dane strukturalne na stronie, której cały sens to lokalne wyniki wyszukiwania. Widoczna linijka w stopce składa się z tych samych czterech części, więc to, co czyta gość, i to, co parsuje robot, nie mogą się rozjechać.

Architektura

Wygląd został w bazie, wbrew mojej rekomendacji

Rekomendowałem trzymanie wyglądu w kodzie, w motywie, gdzie da się go wersjonować i gdzie pięćdziesiąt stron nie rozjedzie się z czasem. Klient powiedział nie i w tej samej wiadomości podał powód: te strony mają się od siebie różnić, a nie być identyczne. To nie są oddziały jednej sieci.

Miał rację, a ja odpowiadałem na pytanie, którego nie zadał. Identyczne strony to problem, kiedy produktem jest marka. Tutaj produktem jest strona, a każda ma sprawiać wrażenie innej lokalnej firmy. Wygląd mieszka więc w bazie jako klasy globalne, które da się edytować per strona, a moim zadaniem przestało być zapobieganie rozjazdowi, a stało się uczynienie go tanim.

Zapisuję to, bo to jest użyteczna część. Rekomendacja była poprawna technicznie i błędna strategicznie, a dowiedziałem się o tym tylko dlatego, że klient się postawił, zamiast przytaknąć.

Wdrożenie

Instalacja i aktualizacja bez klikania

Robotę robią trzy skrypty. Pierwsza instalacja, która buduje z pustego WordPressa stronę-wzorzec. Wdrożenie przyrostowe, które przenosi motyw, usuwa pliki wypadłe z repozytorium i przebudowuje to, co trzeba. Oraz migracja, która zmienia treść już stojącą na stronie.

Wszystkie trzy są idempotentne, co znaczy więcej, niż brzmi. Druga instalacja naprawia, zamiast dublować, i odmawia wprost, kiedy treść na żywej stronie różni się od wzorcowej, bo klient edytuje własną stronę, a skrypt kasujący jego tekst jest gorszy niż brak skryptu. Migracja parsuje bloki już stojące na stronie i zmienia tylko to, co musi, przepuszczając jego własny tekst nietknięty.

Ta ostatnia własność jako jedyna ma za sobą test: osiem asercji, w tym ta, że jego dokładne brzmienie przeżywa przeniesienie i że drugi przebieg zostawia markup identyczny co do bajta. Migracja, której boisz się puścić drugi raz, to migracja, którą puścisz w złym momencie.

Granica

Czego ten szablon nie robi

Samo kopiowanie było osobnym etapem i nigdy nie zostało zamówione, więc go nie zbudowałem i ani razu nie kliknąłem narzędzia do powielania w panelu hostingowym klienta. Udowodnione jest to, co wyżej: strona, w której nie ma niczego, co kopia by zepsuła, oraz skrypty, które ją instalują i aktualizują.

Nie mam więc żadnych liczb o pięćdziesięciu działających stronach, żadnych danych o ruchu ani o pozycjach, i nie znajdziesz ich nigdzie na tej stronie. Wolę napisać krótsze case study niż nieprawdziwe.

Warto wiedzieć przed pierwszą kopią

Jedna rzecz psuje się po cichu. Formularz wysyła zgłoszenia na adres wpisany w polu e-mail w Customizerze. Zostaw to pole puste na nowej stronie, a zgłoszenia pójdą na adres administratora. Poczta nadal wychodzi, więc nic nie wygląda na zepsute. Wypełnij pola, a potem wyślij sobie jedno testowe zgłoszenie, zanim gdziekolwiek pojawi się numer telefonu.

Masz kilka lokalizacji do obsłużenia?

Napisz, ile stron przewidujesz i co naprawdę je od siebie różni. Ta odpowiedź decyduje, czy w ogóle potrzebujesz szablonu, a jeśli nie potrzebujesz, powiem to wprost.

Zapytaj o swój projekt