Uwolnij swój potencjał.

Blog
Blog

Headless WordPress: kiedy się opłaca, a kiedy jest przekombinowaniem

Development
[ 10 min reading time ]

Rozdzielenie WordPressa od warstwy prezentacji brzmi w prezentacji zawsze dobrze: szybszy front, nowoczesny stos technologiczny, treść dostępna dla dowolnego kanału. Rozmowa o kosztach zwykle kończy się na hostingu i godzinach programisty, a pomija pozycję, która w praktyce decyduje o powodzeniu projektu, czyli pracę redakcji po wdrożeniu. Headless WordPress zdejmuje z CMS-a odpowiedzialność za wygląd strony i przenosi ją do osobnej aplikacji, ale razem z wyglądem zabiera też część mechanizmów, z których redakcja korzystała codziennie. Poniżej znajdziesz, co konkretnie przestaje działać, gdzie leży pomijany koszt, dlaczego takie wdrożenie nie jest automatycznie szybsze oraz kryteria, po których widać, że w danym projekcie to nadmiar.

Co oznacza rozdzielenie CMS-a od frontendu

W klasycznym wdrożeniu WordPress odbiera żądanie, składa stronę z motywu i szablonów, i zwraca gotowy HTML. W wariancie bezgłowym WordPress zwraca wyłącznie dane, przez REST API albo przez warstwę GraphQL, a osobna aplikacja, najczęściej w Next.js, składa z nich stronę i obsługuje ruch użytkowników. Panel administracyjny zostaje bez zmian, zmienia się to, kto renderuje treść.

Konsekwencją jest istnienie dwóch aplikacji, dwóch środowisk wdrożeniowych i jednego kontraktu między nimi. Kontrakt to zestaw założeń o tym, jakie dane API zwraca i w jakiej strukturze. Dopóki nikt go nie narusza, wszystko działa. Naruszeniem jest jednak każda zmiana w CMS-ie, która dokłada nowy typ treści albo nowy blok, bo front nie wie, jak go wyświetlić.

Sposób przekazywania treści to pierwsza decyzja architektoniczna i najważniejsza. Wariant najprostszy polega na pobraniu gotowego HTML, który WordPress generuje z bloków, i wstrzyknięciu go na stronę. Uruchamia się szybko, ale front nie ma wtedy kontroli nad wyglądem elementów treści. Wariant drugi to parsowanie struktury bloków i mapowanie każdego typu na komponent aplikacji. Daje pełną kontrolę i jest zdecydowanie najdroższy. Wariant trzeci porzuca bloki i opiera treść na polach strukturalnych, co jest wygodne dla programisty i najbardziej ogranicza redakcję.

Co przestaje działać w dniu przejścia

Podgląd wpisu przestaje działać domyślnie i jest to strata odczuwana natychmiast. Przycisk podglądu w WordPressie prowadzi do adresu obsługiwanego przez motyw, którego już nie ma. Przywrócenie podglądu wymaga osobnego, uwierzytelnionego kanału: w Next.js realizuje się to trybem szkicu, w którym osobny endpoint weryfikuje sekret, ustawia ciasteczko pomijające cache i pozwala pobrać nieopublikowaną treść. To działa dobrze, ale jest osobnym elementem do zaprojektowania, wdrożenia i utrzymania, nie funkcją dostępną z pudełka.

Drugą stratą są wtyczki generujące własny front. Formularz kontaktowy, wyszukiwarka, okruszki nawigacyjne, lista powiązanych wpisów, galeria, mapa, kalkulator: wszystko, co dotąd renderowało się przez shortcode albo blok wtyczki, przestaje istnieć. Dane w bazie pozostają, ale nikt ich nie wyświetla. Każdy taki element trzeba zbudować w aplikacji frontendowej od nowa albo obsłużyć przez zewnętrzną usługę.

Trzecia strata dotyczy cache. Wtyczki cache dla WordPressa działają na poziomie generowania HTML, którego już nie ma, więc stają się bezużyteczne. Ich rolę przejmuje mechanizm rewalidacji w aplikacji frontendowej i warstwa CDN, co jest rozwiązaniem sprawnym, ale konfigurowanym ręcznie i wymagającym decyzji o tym, jak długo strona może pokazywać nieaktualną treść.

Czwarty obszar to SEO. Wtyczka SEO nadal pozwala redakcji wpisać tytuł i opis, ale nie wstawia ich do kodu strony, bo kod generuje front. Mapa witryny generowana przez wtyczkę wskazuje adresy, które nie odpowiadają adresom w nowej aplikacji. Znaczniki dla mediów społecznościowych i dane strukturalne trzeba wygenerować po stronie frontu z danych pobranych z API. Nic z tego nie jest trudne, ale wszystko trzeba zrobić świadomie, bo brak tych elementów nie objawia się błędem, tylko spadkiem widoczności kilka tygodni później.

Koszt, którego nie ma w wycenie

Mapowanie bloków na komponenty jest najczęściej niedoszacowaną pozycją całego projektu. Redakcja przywykła do zestawu kilkunastu albo kilkudziesięciu bloków, w tym bloków z wtyczek i bloków własnych opartych na polach niestandardowych. Każdy z nich wymaga komponentu w aplikacji frontendowej, uwzględniającego wszystkie warianty ustawień, które redakcja realnie stosuje: wyrównanie, szerokość, kolory tła, warianty przycisków.

Praktyczny problem jest gorszy niż sam koszt. Jeśli redaktor wstawi blok, dla którego nie ma komponentu, aplikacja nie pokaże błędu, po prostu nie wyrenderuje niczego. Publikacja przechodzi, w panelu wszystko wygląda poprawnie, a na stronie brakuje fragmentu treści. Dlatego minimalnym zabezpieczeniem jest ograniczenie palety bloków w edytorze do tych obsługiwanych oraz komponent zastępczy, który sygnalizuje nieobsługiwany blok w środowisku testowym.

Drugi ukryty koszt to utrzymanie granicy między systemami. Aktualizacja WordPressa może zmienić strukturę odpowiedzi API, aktualizacja frameworka frontendowego może wymagać przepisania sposobu pobierania danych, a każda zmiana wtyczki dokładającej pola trzeba odzwierciedlić po drugiej stronie. To praca stała, rozłożona na cały cykl życia serwisu, i przewyższa zwykle koszt hostingu dwóch aplikacji.

Trzeci to awaria synchronizacji. Publikacja treści wywołuje zwykle odświeżenie strony przez webhook. Jeśli webhook nie dojdzie, redakcja widzi opublikowany wpis w panelu, a na stronie nadal stoi stara wersja. Bez monitoringu tego mechanizmu i bez możliwości wymuszenia odświeżenia z panelu, każde takie zdarzenie kończy się zgłoszeniem do programisty.

Dlaczego headless nie jest automatycznie szybszy

Argument wydajnościowy jest najczęstszym uzasadnieniem takiego projektu i jest prawdziwy tylko warunkowo. Aplikacja frontendowa generująca strony statycznie i podająca je z CDN jest bardzo szybka, bo użytkownik dostaje gotowy plik z serwera brzegowego. Ta sama aplikacja renderująca każdą wizytę po stronie serwera i pobierająca dane z przeciążonego WordPressa jest wolniejsza niż klasyczne wdrożenie z cache stron i CDN, bo dokłada kolejny skok sieciowy.

Klasyczny WordPress z poprawnie ustawionym cache po stronie serwera również podaje gotowy HTML i również może stać za CDN. Różnica w czasie pierwszego bajtu między dobrze skonfigurowanym wdrożeniem klasycznym a wdrożeniem statycznym istnieje, ale jest mniejsza, niż zwykle sugerują prezentacje, i w większości serwisów firmowych nie przekłada się na wyniki biznesowe.

Realna przewaga wydajnościowa dotyczy warstwy interfejsu, nie serwera: aplikacja pisana w komponentach pozwala precyzyjnie kontrolować, co jest ładowane i kiedy, więc łatwiej uzyskać dobre wyniki interaktywności i stabilności układu niż w motywie obudowanym kilkoma wtyczkami. To argument prawdziwy, ale dotyczy jakości implementacji, nie samej architektury.

Jest też druga strona rachunku: GraphQL nad WordPressem pozwala pobrać dokładnie te pola, które są potrzebne, zamiast pełnych obiektów zwracanych przez REST. Przy listach o wielu elementach różnica w wielkości odpowiedzi i czasie jej przygotowania jest znacząca, więc wybór warstwy dostępu do danych ma na wydajność większy wpływ niż sam fakt rozdzielenia systemów.

Kiedy takie wdrożenie się opłaca

Pierwszy uzasadniony przypadek to istniejąca aplikacja frontendowa, z którą serwis ma dzielić komponenty i system projektowy. Jeśli firma ma już panel klienta albo konfigurator w React, budowanie strony treściowej jako drugiej aplikacji w tym samym stosie jest tańsze w utrzymaniu niż utrzymywanie osobnego motywu, który powiela te same komponenty.

Drugi to publikacja tej samej treści do kilku kanałów: strony, aplikacji mobilnej, ekranów w punktach sprzedaży, wewnętrznego intranetu. Rozdzielenie warstw ma wtedy sens, bo API jest realnie wykorzystywane przez więcej niż jednego odbiorcę, a to jest jego docelowa rola.

Trzeci to interfejs wykraczający poza to, co da się zbudować w motywie: rozbudowane filtrowanie z natychmiastowymi wynikami, wizualizacje danych, edytory, konfiguratory produktu. Tam ograniczeniem przestaje być wygląd, a staje się logika po stronie przeglądarki, i wtedy pełna kontrola nad frontem przestaje być kwestią preferencji.

Czwarty przypadek jest organizacyjny: zespół zna React i nie zna PHP, a redakcja nie chce zmieniać CMS-a, którego się nauczyła. Zachowanie panelu i przeniesienie frontu do znanego zespołowi stosu jest wtedy decyzją o kompetencjach, nie o technologii, i bywa właściwe.

Kiedy to przekombinowanie

Sygnałem najmocniejszym jest budżet. Projekt, w którym mapowanie bloków, tryb podglądu, formularze, wyszukiwarka i warstwa SEO muszą zostać zbudowane od zera, nie mieści się w budżecie przewidzianym na dobry motyw, a próba wciśnięcia go tam kończy się wdrożeniem bez podglądu treści i bez połowy bloków.

Drugi sygnał to charakter serwisu. Kilka podstron aktualizowanych raz na kwartał nie potrzebuje rozdzielonej architektury, bo nie ma tu żadnego problemu, który miałaby rozwiązać. Trzeci to brak dostępu do programistów frontendowych w perspektywie kilku lat. Aplikacja bez utrzymania starzeje się szybciej niż motyw, bo zależności frameworka wymagają regularnych aktualizacji.

Czwarty sygnał to oparcie serwisu o wtyczki z własnym frontendem oraz sklep z koszykiem i płatnościami. Proces zamówienia w WooCommerce to najbardziej wrażliwa część sklepu, obudowana rozszerzeniami płatnościowymi i wysyłkowymi, które renderują własne widoki. Przepisanie go po stronie frontu jest możliwe, ale przenosi ryzyko na obszar, w którym błąd oznacza utracone zamówienia.

Jak zweryfikować decyzję przed wdrożeniem?

Prototyp jest tańszy niż zmiana kursu w połowie projektu, ale tylko wtedy, gdy sprawdza właściwą rzecz. Samo pobranie wpisu przez API niczego nie dowodzi, bo to najprostszy element całego układu. Poniższe kroki weryfikują to, co faktycznie generuje ryzyko.

  1. Wypisz z panelu pełną listę typów bloków używanych w istniejących wpisach, razem z wariantami ustawień. Ta lista jest podstawą wyceny mapowania i zwykle jest dłuższa, niż pamięta zespół.
  2. Zbuduj prototyp obejmujący trzy najbardziej złożone szablony serwisu, nie stronę główną. Strona główna jest zawsze najłatwiejsza, bo jest projektowana ręcznie.
  3. Uruchom w prototypie tryb podglądu nieopublikowanej treści i sprawdź go z konta redaktora, nie administratora. Uprawnienia to częste źródło problemów, które ujawnia się dopiero na produkcji.
  4. Poproś redaktora, żeby opublikował wpis od zera bez instrukcji i bez pomocy programisty, a następnie zmierz, ile czasu to zajęło i ile elementów nie wyrenderowało się poprawnie.
  5. Zasymuluj awarię odświeżenia: opublikuj zmianę z wyłączonym webhookiem i sprawdź, czy redakcja ma sposób wymuszenia aktualizacji bez kontaktu z zespołem technicznym.

Podsumowanie

Headless WordPress jest dobrym rozwiązaniem dla konkretnego zestawu problemów: wspólnego systemu projektowego z istniejącą aplikacją, publikacji do wielu kanałów, interfejsu wykraczającego poza możliwości motywu oraz zespołu pracującego w stosie JavaScript. W tych sytuacjach koszt utrzymania granicy między systemami jest uzasadniony, bo rozwiązuje realne ograniczenie.

Poza nimi rachunek zwykle się nie domyka, a największym pojedynczym ryzykiem nie jest technologia, tylko proces redakcyjny. Panel, który redakcja zna, traci wartość, jeśli nie da się w nim zobaczyć efektu przed publikacją, a połowa bloków nie renderuje się na stronie. Decyzję warto więc podejmować po prototypie obejmującym pełną publikację przez redaktora, nie po prezentacji pokazującej czas ładowania strony głównej. Jeśli rozważasz taką architekturę i chcesz oszacować realny zakres prac dla swojego serwisu, umów bezpłatną konsultację.

FAQ

Headless WordPress – najczęściej zadawane pytania

01

Czy headless WordPress jest szybszy od klasycznego wdrożenia?

Tylko w określonej konfiguracji. Aplikacja generująca strony statycznie i podająca je z CDN jest bardzo szybka, ale klasyczny WordPress z cache po stronie serwera i CDN również podaje gotowy HTML. Aplikacja renderująca każdą wizytę serwerowo i pobierająca dane z obciążonego CMS-a bywa wolniejsza.

02

Które funkcje WordPressa przestają działać po rozdzieleniu warstw?

Podgląd wpisu, wszystkie wtyczki generujące własny front, w tym formularze, wyszukiwarka i okruszki nawigacyjne, wtyczki cache oraz wstawianie znaczników SEO do kodu strony. Dane pozostają w bazie, ale nikt ich nie renderuje.

03

Czy redakcja dalej korzysta z edytora blokowego?

Tak, panel pozostaje bez zmian. Warunkiem jest jednak zbudowanie komponentu frontendowego dla każdego używanego bloku. Blok bez komponentu nie wywoła błędu, tylko nie wyświetli się na stronie, dlatego paletę bloków warto ograniczyć do obsługiwanych.

04

Czy WooCommerce da się uruchomić w tej architekturze?

Technicznie tak, ale proces zamówienia obudowany rozszerzeniami płatności i wysyłki wymaga przepisania po stronie frontu. Ryzyko jest wtedy przenoszone na najbardziej wrażliwy element sklepu, dlatego przy standardowym sklepie zwykle nie jest to uzasadnione.

05

REST API czy GraphQL?

Warstwa GraphQL pozwala pobrać dokładnie potrzebne pola zamiast pełnych obiektów, co przy listach o wielu elementach istotnie zmniejsza rozmiar odpowiedzi i czas jej przygotowania. Przy prostych, nielicznych zapytaniach REST API wystarcza i nie wymaga dodatkowej wtyczki.

06

Jaki budżet trzeba założyć na taki projekt?

Zakres obejmuje mapowanie wszystkich używanych bloków, tryb podglądu treści, odtworzenie funkcji wtyczek frontendowych, warstwę SEO i mechanizm odświeżania, a do tego stałe utrzymanie dwóch aplikacji. Jeśli budżet odpowiada kosztowi dobrego motywu, ten zakres się w nim nie mieści.

Author IVN Developers Web Developer
Spis treści

Podobał Ci się ten artykuł?

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.