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ć.
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.
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ę.
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.
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.
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.
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ć.
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ąć.
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.
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.
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