helban.dev

Klonowanie strony WordPress: co kopia zachowuje, a co się psuje

Kopia strony WordPress zrobiona razem z bazą danych zachowuje formularze, menu i zdjęcia, bo numery, którymi się ze sobą łączą, przechodzą razem z bazą. Psuje się strona odbudowana z kodu motywu w nowej bazie: każdy numer wpisany na stałe we wzorzec bloków prowadzi tam donikąd. Zbudowałem dla klienta stronę-wzorzec pod kolejne lokalne strony i niżej opisuję, jak radzi sobie w obu przypadkach i gdzie ten projekt się kończy.

Stack: WordPress · GeneratePress Premium · GenerateBlocks Pro · WP-CLI Zakres: motyw potomny + skrypty wdrożeniowe Oddane: lipiec 2026
9
pól do wpisania przy nowej stronie
0
numerów z bazy w motywie i jego wzorcach
8
asercji w teście migracji treści

Po co budować stronę WordPress pod kopiowanie?

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ą. Każdą można budować osobno, tylko że wtedy dwudziesta strona kosztuje tyle samo co pierwsza.

Zlecenie objęło więc najpierw stronę-wzorzec, a w kolejnym etapie skrypt, który ją klonuje. Od siebie dodałem skrypty, które wzorzec instalują i aktualizują. Od takiej strony wymaga się więcej niż od zwykłej: ma dalej działać, kiedy ktoś ją skopiuje i zmieni dane firmy, a dobry wygląd w dniu oddania to łatwiejsza część.

Jak skopiować całą stronę WordPress, żeby niczego nie zgubiła?

Skopiować ją razem z bazą danych. Tak działają narzędzia do klonowania w panelach hostingu i wtyczki do migracji; Duplicator na przykład pakuje pliki strony i bazę do jednego pliku. Formularz na stronie, menu w nagłówku i zdjęcie w bloku wskazują w WordPressie na inne rekordy przez numer. Kopia bazy przenosi wszystkie te numery bez zmian, więc każde odwołanie dalej trafia tam, gdzie trzeba.

Zanim oddałem stronę-wzorzec, sprawdziłem to na niej, zamiast zakładać. Skopiowałem jej bazę i wgrane pliki do drugiego, pustego WordPressa pod innym adresem, doinstalowałem ten sam motyw i wtyczki, a stary adres podmieniłem w całej bazie. Kopia miała wszystkie 28 klas globalnych GenerateBlocks, w których zapisany jest wygląd (tyle ich wtedy było), a obliczone style nie różniły się od oryginału ani w jednym miejscu. Formularz wyświetlił się ze wszystkimi polami, dane firmy były w danych strukturalnych, a starego adresu nie było nigdzie w kodzie strony.

Ten test ma dwa ograniczenia. Kopię zrobiłem sam, na drugim WordPressie, a nie narzędziem do klonowania w panelu hostingu klienta, choć mechanizm jest ten sam: pliki i baza pod nowym adresem. Poza tym zrobiłem go, zanim powstały menu w nagłówku i zdjęcia na kafelkach, więc dla tych dwóch rzeczy argument jest w następnej sekcji.

Kiedy numery rekordów z bazy przestają działać?

Kiedy stronę się odbudowuje, a nie kopiuje. Strona-wzorzec jest zapisana w plikach motywu: każdą jej sekcję opisuje wzorzec bloków, a skrypt instaluje te wzorce w pustym WordPressie. Nowa instalacja to nowa baza, która numeruje wszystko od początku.

Wyszło to przy pierwszej instalacji. Wzorzec bloków sekcji z formularzem trzymał formularz jako "formId":28, bo taki numer formularz dostał w mojej lokalnej bazie. Na serwerze klienta ten sam formularz był wpisem numer 6. GenerateBlocks Pro osadza formularz właśnie po numerze, więc wzorzec w tej postaci pokazałby formularz na jednej maszynie, mojej, a wszędzie indziej nic.

Dlatego w motywie i jego wzorcach bloków nie ma żadnego numeru wymyślonego przez bazę. Formularz odnajduje się po slugu, czyli po stałej nazwie, w chwili składania strony. Menu w nagłówku też jest odczytywane po slugu, a skrypt aktualizacji zakłada to menu, jeśli go nie ma. Zdjęcie zastępcze na kafelkach usług to plik motywu, a nie wgrany obraz, bo numer wgranego obrazu należy do bazy, do której go wgrano. Przeszukanie motywu nie znajduje ani jednego takiego numeru. Skopiowana strona poradziłaby sobie bez szukania po slugu i bez zdjęcia w motywie, formularz straciłaby dopiero strona odbudowana z motywu.

Co ma się różnić między kopiami?

Wszystko, co różni strony, jest w jednym miejscu w Customizerze: nazwa firmy, logo, kolor marki, telefon, e-mail i adres. To sześć rzeczy do ustalenia, wpisywanych w dziewięć pól, i nic poza tym nie trzeba ruszać po skopiowaniu strony.

Adres zajmuje cztery z tych dziewięciu pól, celowo. Google chce adresu firmy w rozbiciu na składniki, a nie jako jednej linijki dowolnego tekstu. Jedno pole trzeba by potem rozbijać na oko, a pierwszy adres wpisany w nieoczekiwanej postaci bez żadnego ostrzeżenia dał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 czyta Google, nie mogą się rozjechać.

Czy wszystkie kopie mają wyglądać tak samo?

Radziłem trzymać wygląd w kodzie motywu, 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ł. Jednakowe strony mają sens, kiedy sprzedaje się markę. Tutaj każda strona sama jest towarem i ma sprawiać wrażenie innej lokalnej firmy. Wygląd został więc w bazie jako klasy globalne, które da się zmieniać na każdej stronie osobno, a ja, zamiast pilnować, żeby strony się nie rozjechały, miałem sprawić, żeby rozjazd był tani.

Kopia testowa pokazała, co to znaczy w praktyce. Zmieniłem kolor marki i nazwę firmy tylko na kopii. Kopia zmieniła się wszędzie, gdzie ten kolor występuje, a oryginał obok został dokładnie taki, jaki był.

Jak aktualizować skopiowane strony, kiedy już działają?

Trzema skryptami. Pierwszy, instalator, robi z pustego WordPressa stronę-wzorzec. Drugi wdraża zmiany: przenosi motyw, usuwa pliki, które wypadły z repozytorium, uruchamia trzeci skrypt i czyści cache. Trzeci, migracja treści, zmienia to, co już stoi na stronach.

Każdy z nich można puścić drugi raz bez szkody. Instalator uruchomiony ponownie naprawia, zamiast dublować. Porównuje też to, co stoi na stronie, z tym, co sam by zapisał, przy różnicy odmawia i podaje, który skrypt puścić zamiast niego. To zabezpieczenie wzięło się z sytuacji, do której prawie doszło: kiedy pierwsza runda poprawek była gotowa, ponowne uruchomienie instalatora zastąpiłoby własny nagłówek klienta, jego tekst i dane firmy moimi przykładowymi. Klient sam edytuje swoje strony, więc każdy skrypt, który ich dotyka, musi zakładać, że jest tam jego tekst.

Migracja czyta bloki już stojące na stronie i zmienia tylko to, co musi, a sformułowania klienta zostawia w spokoju. Migracja ma test z ośmioma asercjami. Dwie z nich sprawdzają, że tekst klienta przechodzi słowo w słowo i że drugi przebieg zostawia kod HTML identyczny co do bajta.

Co sprawdzić po przeniesieniu kopii strony WordPress na inną domenę?

Pierwsza rzecz to cache strony. Na hostingu klienta zapisanie nazwy firmy w Customizerze od razu czyściło stronę zapisaną w cache. Zmiana tego samego pola z wiersza poleceń cache już nie czyściła: niezalogowany gość dalej dostawał starą nazwę. Skrypt, który wpisuje dane nowej strony, musi sam wyczyścić cache, bo inaczej nowa strona może pokazać pierwszym gościom dane strony, z której ją skopiowano.

Druga rzecz: dokąd formularz wysyła zgłoszenia

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.

Gdzie kończy się ten projekt?

Samo kopiowanie stron było drugim etapem i klient nigdy go nie opłacił. Nie zbudowałem skryptu do klonowania i ani razu nie użyłem narzędzia do klonowania w panelu hostingowym klienta. Pokazać mogę stronę-wzorzec, skrypty, które ją instalują i aktualizują, oraz kopię testową opisaną wyżej.

Nie ma tu więc żadnych liczb o działających stronach, ruchu ani pozycjach, bo żadnych nie mierzyłem.

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