- 1. Kompletná Architektúra decoupled WordPressu
- Pripojenie cez GraphQL/REST API na Vercel alebo Netlify
- Stratégie renderovania: SSG, SSR a ISR
- 2. WPGraphQL vs. REST API
- Over-fetching a Under-fetching dát
- Typový systém a Developer Experience (DX)
- Kešovanie HTTP dopytov
- Výkon a záťaž databázy
- Optimalizácia WPGraphQL Query pre Vývojárov
- 3.Optimalizácia Advanced Custom Fields (ACF) cez WPGraphQL
- 3. Faust.js v Praxi: Oficiálny Framework pre Headless WordPress
- 4. Zvýšenie Výkonu, Bezpečnosť a Infrastruktúra
- 5. Výhody a Nevýhody: Kedy prejsť na Headless?
- Záver
Headless WordPress predstavuje evolučný krok, ktorý spája to najlepšie z dvoch svetov: robustnú, overenú a používateľsky prívetivú správu obsahu na strane backendu s neprekonateľnou rýchlosťou, bezpečnosťou a flexibilitou moderných JavaScriptových frameworkov na strane frontendu.
V tomto detailnom sprievodcovi sa pozrieme na kompletnú architektúru decoupled WordPressu, porovnáme komunikačné protokoly WPGraphQL a REST API, rozoberieme optimalizáciu dopytov a ukážeme si implementáciu pomocou špecializovaného frameworku Faust.js.
1. Kompletná Architektúra decoupled WordPressu
Pojem Headless CMS označuje systém správy obsahu, ktorému bola „odťatá hlava“ – teda prezentácia dát (frontend). Monolitický WordPress spája databázu MySQL, aplikáciu PHP, biznis logiku a šablónovací systém (PHP/HTML/CSS) do jedného celej. V headless architektúre sa WordPress stará výhradne o backendové úlohy:
- Správa používateľských oprávnení a rolí.
- Ukladanie textového a multimediálneho obsahu v databáze.
- Práca s Custom Post Types (CPT) a Custom Fields (napostupne ACF alebo Meta Box).
- Spracovanie redakčných pracovných postupov (publikovanie, revízie, draftovanie).
Frontend je kompletne nezávislá aplikácia napísaná v JavaScriptovom/TypeScriptovom frameworku (ako Next.js alebo Nuxt.js), ktorá komunikuje s WordPressom výhradne cez API.
Pripojenie cez GraphQL/REST API na Vercel alebo Netlify
V architektúre Headless WordPress funguje dátový tok v dvoch hlavných režimoch alebo ich kombinácii:
- Build Time (Statická generácia – SSG): Počas zostavovania (build procesu) aplikácie na platformách ako Vercel alebo Netlify si frontendový framework vyžiada všetky potrebné dáta (články, stránky, kategórie, média) z WordPress API. Výsledkom sú predpripravené statické HTML, CSS a JS súbory, ktoré sa nahrajú do siete CDN (Content Delivery Network).
- Runtime (Spracovanie na hrane/v prehliadači – SSR/ISR/Client-side): Ak používateľ navštívi stranku, alebo ak dôjde ku zmene obsahu, frontend posiela asynchrónne dopyty cez API priamo na WordPress backend, prípadne využíva Serverless/Edge funkcie hostingu na dynamické dočítanie dát.
Prítomnosť celosvetových CDN sietí ako Vercel Edge Network alebo Netlify Edge Handlers mení pravidlá hry. Namiesto toho, aby používateľ zo Slovenska čakal na odpoveď originálneho PHP servera (ktorý spracováva databázové dopyty a vykonáva PHP skripty), dostane predpripravený obsah z najbližšieho uzla CDN rádovo v jednotkách milisekúnd.
Stratégie renderovania: SSG, SSR a ISR
Voľba stratégie renderovania obsahu je kľúčovým rozhodnutím pri návrhu headless architektúry:
Static Site Generation (SSG)
Všetky stránky sa vygenerujú do statického HTML počas build procesu.
Výhody: Maximálna možná rýchlosť, nulová záťaž na backend počas návštev, neprekonateľná bezpečnosť.
Nevýhody: Pri weboch s desiatkami tisíc príspevkov trvá build proces príliš dlho.
Server-Side Rendering (SSR)
Každá požiadavka používateľa vyvolá spustenie Node.js/Edge funkcie na Verceli/Netlify, ktorá načíta čerstvé dáta z WordPressu a vygeneruje HTML za behu.
Výhody: Vždy aktuálne dáta, ideálne pre vysoce dynamické aplikácie alebo personalizovaný obsah.
Nevýhody: Vyššie TTFB než pri SSG, trvalá záťaž na WordPress API pri vysokej návštevnosti.
Incremental Static Regeneration (ISR)
Hybridný prístup spopularizovaný frameworkom Next.js. Umožňuje generovať statické stránky na pozadí podľa potreby bez nutnosti rebalansovať alebo rebuildujúce celý web.
Ako to funguje: Stránka sa vygeneruje ako statická s definovaným časom revalidácie (napr. revalidate: 60 sekúnd). Po uplynutí tohto času prvá požiadavka vráti pôvodnú statickú stránku, ale na pozadí vyvolá ob obnovu dát z WordPressu. Nasledujúci návštevník už dostane novú verziu.
On-Demand ISR: Využíva WordPress Webhooky. Ked redaktor klikne na tlačidlo „Publikovať“ alebo „Aktualizovať“, WordPress pošle signál na Vercel/Netlify, ktorý okamžite revaliduje iba konkrétnu URL kartu alebo príspevok.
2. WPGraphQL vs. REST API
Jedným z hlavných rozhodnutí pri návrhu headless WordPress architektúry je voľba protokolu na prenos dát medzi WordPressom a frontendom. WordPress natívne obsahuje rozhranie WordPress REST API. Alternatívou, ktorá sa stala štandardom v headless komunite, je plugin WPGraphQL, ktorý do WordPressu pridáva podporu pre query jazyk GraphQL.
Over-fetching a Under-fetching dát
Jedným z najväčších neduhov REST API je takzvaný Over-fetching (prijímanie nadbytočných dát) a Under-fetching (prijímanie nedostatočného množstva dát v jednom dopyte).
Príklad pri REST API: Ak chceme na frontende zobraziť zoznam 10 najnovších článkov a potrebujeme len ich titulok, slug a meno autora, natívny endpoint /wp/v2/posts vráti pre každý príspevok obrovské množstvo dát – kompletný obsah (content), vytiahnutý HTML výňatok (excerpt), stav publikácie, GUID, taxonomické ID a desiatky ďalších polí. Odpoveď môže mať stovky kilobajtov uncompressed JSONu.
Okrem toho REST API vracia pri autorovi len jeho numeric ID. Aby sme získali meno autora, musíme poslať ďalší dopyt na /wp/v2/users/{id} (Under-fetching). Pri 10 príspevkoch s rôznymi autormi to vedie k známemu N+1 problému dopytovania.
V rozhraní WPGraphQL klient presne definuje štruktúru dát, ktorú požaduje. Ak potrebujete len titulok a meno autora, v dopyte uvediete iba tieto polia. Server vráti presne to, čo ste požadovali, v jedinom HTTP požiadavke a s minimálnou veľkosťou odpovede.
query GetPostsWithAuthors {
posts(first: 10) {
nodes {
title
slug
author {
node {
name
}
}
}
}
}
Typový systém a Developer Experience (DX)
GraphQL poskytuje natívne silný typový systém (Schema). Vďaka nástrojom ako GraphQL Code Generator je možné na frontende z GraphQL schémy WordPressu automaticky vygenerovať presné TypeScript typy, rozhrania a React háky. Vývojár tak dostáva kompletné napovedanie (autocomplete) v IDE a chyby v dátových štruktúrach sa zachytia už počas kompilácie, nie až v produkčnom prostredí.
REST API disponuje schéma definíciou cez OpenAPI/Swagger, no jej integrácia do frontendového vývojového procesu býva podstatne komplikovanejšia a náchylnejšia na nepresnosti.
Kešovanie HTTP dopytov
- REST API: Využíva štandardné HTTP metódy (GET). Odpovede na endpointy ako /wp/v2/posts/123 sa dajú vynikajúco kešovať na úrovni CDN, reverzných proxy serverov (Varnish, Nginx) alebo prehliadača pomocou HTTP hlavičiek (Cache-Control, ETag).
- WPGraphQL: V základnom nastavení posiela dopyty cez HTTP POST požiadavky na jediný endpoint /graphql. Keďže HTTP POST odpovede sa podľa špecifikácie HTTP spravidla nekešujú na sieťovej úrovni, GraphQL naráža na zložitejšiu architektúru kešovania. Tento problém sa však rieši pomocou technológie Persisted Queries alebo posielaním dopytov cez HTTP GET s URL-encoded parametrom Query.
Výkon a záťaž databázy
Z hľadiska vykonávania skriptov na backendovej strane (PHP a MySQL) nie je GraphQL zázračným liekom, ktorý automatycky zrýchli databázu. WPGraphQL musí na pozadí preložiť GraphQL dopyt do interných funkcií WordPressu (WP_Query, get_post_meta atď.).
Ak napíšete hlboko zaniestnený GraphQL dopyt (napr. Zoznam príspevkov -> ich kategórie -> všetky príspevky v danej kategórii -> ich autori -> ich komentáre), môžete ľahko spôsobiť paralýzu MySQL servera.
Optimalizácia WPGraphQL Query pre Vývojárov
Pre dosiahnutie maximálneho výkonu pri používaní WPGraphQL na produkčných projektoch je nevyhnutné aplikovať nasledujúce techniky optimalizácie:
1. Použitie GraphQL Smart Cache / Automatic Persisted Queries (APQ)
Namiesto posielania celého textu GraphQL dopytu cez POST požiadavku sa dopyt na klientovi zhašuje (napr. SHA-256) a na server sa pošle iba tento hash cez HTTP GET požiadavku:
GET /graphql?queryId=
Ak backend hash pozná, okamžite vráti kešovaný výsledok zo svojej pamäte (Redis/Memcached) alebo CDN. Tým sa zásadne znižuje objem prenášaných dát v requeste a umožňuje sa kešovanie na Edge CDN uzloch.
2. Obmedzenie hĺbky dopytu a počtu položiek (Query Depth & Amount Limits)
V produkčnom prostredí je nutné zamedziť spúšťaniu nevhodne navrhnutých dopytov. Pomocou pluginov alebo custom PHP filtrov je možné obmedziť maximálnu hĺbku zaniestnenia GraphQL dopytu a nastaviť striktné limity na parameter first pri kolektívnych dopytoch:
// Obmedzenie maximálneho počtu položiek požadovaných v jednom dopyte
add_filter( 'graphql_connection_max_query_amount', function( $max_amount, $source, $args, $context, $info ) {
return 100; // Maximálne 100 položiek na jeden batch
}, 10, 5 );
3.Optimalizácia Advanced Custom Fields (ACF) cez WPGraphQL
Pri používaní populárneho pluginu ACF v spojení s WPGraphQL (cez rozšírenie WPGraphQL for Advanced Custom Fields) vzniká riziko n+1 databázových dopytov pri ACF Flexibilných obsahových poliach alebo Repeateroch.
Riešenie: Vyhýbajte sa zbytočnému dopytovaniu neuvedených polí. Využívajte GraphQL Fragmenty pre načítanie len tých dát, ktoré konkrétny UI komponent na frontende skutočne potrebuje.
fragment PostFields on Post {
id
title
date
featuredImage {
node {
sourceUrl
altText
}
}
}
query GetPageData {
posts(first: 5) {
nodes {
...PostFields
}
}
}
Použitie Object Cache (Redis / Memcached)
Keďže WPGraphQL vykonáva rozsiahle rozkladanie dátových vzťahov, trvalá objektová keš na strane WordPressu je povinnosťou. Ak je Redis správne nakonfigurovaný, opakované volania WP_Query a načítavanie post-meta dát nezaťažujú MySQL databázu, ale čítajú sa priamo z RAM pamäte.
3. Faust.js v Praxi: Oficiálny Framework pre Headless WordPress
Hoci je možné headless WordPress frontend vytvoriť v akomkoľvek frameworku (čistý Next.js, Nuxt.js, SvelteKit, Astro), vývojári často narážajú na opakujúce sa komplexné výzvy:
- Správa autorizačných tokenov a náhľadov článkov (Post Previews) pred publikovaním.
- Udržiavanie správnej relácie medzi WordPress šablónami a Next.js routovaním.
- Spracovanie Gutenberg blokov na frontende.
- Správa SEO meta tagov a relácií.
Spoločnosť WP Engine preto vyvinula Faust.js – oficiálny framework navrhnutý špeciálne pre spojenie WordPressu a Next.js. Faust.js poskytuje sadu balíčkov (@faustwp/core, @faustwp/cli), ktoré odstraňujú väčšinu prekážok pri vývoji decoupled aplikácií.
Kľúčové architektonické piliere Faust.js
- Template Hierarchy System: Faust.js prenáša známu šablónovú hierarchiu z WordPressu (napr. single.php, page.php, archive.php, category.php) priamo do Next.js prostredia.
- Native Post Previews: Zabezpečuje bezproblémové fungovanie tlačidla „Náhľad“ v administrácii WordPressu. Návštevník s redakčnými právami je bezpečne presmerovaný na frontend s dočasným autorizačným tokenom bez toho, aby bol koncept prístupný verejnosti.
- GraphQL Integration: Faust.js sa úzko spája s WPGraphQL a automatizuje načítavanie dát na základe definovaných šablón.
Vytvorenie SSG/ISR webu pomocou Faust.js a Next.js
Pozrime sa na praktickú implementáciu kompletnej architektúry od prípravy backendu až po zostavenie frontendu.
Krok 1: Príprava WordPress Backendu
Pre správne fungovanie Faust.js musíte mať na svojej inštalácii WordPressu nainštalované a aktivované nasledujúce pluginy:
- WPGraphQL: Základný plugin pridávajúci GraphQL endpoint /graphql.
- FaustWP Plugin: Oficiálny WordPress plugin pre Faust.js, ktorý zabezpečuje prepojenie autorizácie, náhľadov a nastavenie adresy frontendu.
Po aktivácii pluginu FaustWP prejdite v administrácii WP do Settings -> Faust a nastavte:
- Front-end site URL: Adresa, kde pobeží váš Next.js frontend (napr. http://localhost:3000 pri vývoji, alebo [https://moj-web.sk](https://moj-web.sk) v produkcii).
- Secret Key: Vytgenerovaný tajný kľúč pre autorizáciu náhľadov.
Krok 2: Inicializácia Faust.js / Next.js Projektu
Vytvorte novú aplikáciu pomocou CLI nástroja Faust.js vo vašom termináli:
npx create-next-app@latest my-headless-website -e @faustwp/core/template cd my-headless-website
Nainštalujte potrebné závislosti:
npm install
V koreňovom adresári projektu vytvorte súbor .env.local s konfiguráciou prepojenia:
# URL adresa vášho WordPress backendu NEXT_PUBLIC_WORDPRESS_URL=https://admin.moj-web.sk # Secret Key vygenerovaný v nastaveniach FaustWP pluginu FAUST_SECRET_KEY=c3a4f8d9-eb01-4d32-98ab-faust-secret-key
Krok 3: Konfigurácia Faust.js v projekte
V súbore faust.config.js nastavte základnú konfiguráciu frameworku:
import '../../faust.config';
import React from 'react';
import { FaustProvider } from '@faustwp/core';
import { useRouter } from 'next/router';
import '@faustwp/core/dist/css/style.css';
export default function MyApp({ Component, pageProps }) {
const router = useRouter();
return (
);
}
Krok 4: Implementácia Šablónovej Hierarchie (Faust Template System)
Faust.js používa špeciálny adresár src/wp-templates pre automatické mapovanie WordPress obsahu na Next.js komponenty. Vytvorme šablónu pre detail príspevku single.js a hlavnú indexovú stránku index.js.
Súbor: src/wp-templates/index.js (Registrátor šablón)
import single from './single';
import page from './page';
const templates = {
'single': single,
'page': page,
};
export default templates;
Súbor: src/wp-templates/single.js (Detail príspevku)
Tento komponent definuje samotný layout aj GraphQL dopyt, ktorý Faust.js automaticky vykoná pri požiadavke na detail príspevku.
import { gql } from '@apollo/client';
import Head from 'next/head';
export default function SingleTemplate(props) {
// Ak sa dáta načítavajú, zobraziť fallback
if (props.loading) {
return
Načítavam obsah...
;
}
const { title, content, date, author, featuredImage } = props.data.post;
return (
<>
<article><header>
<h1 title=""></h1>
<div>Autor: {author?.node?.name}
<time>{new Date(date).toLocaleDateString('sk-SK')}</time></div>
</header>{featuredImage?.node && (
<div><img title="" src="{featuredImage.node.sourceUrl}" alt="{featuredImage.node.altText" /></div>
)}
<div></div>
</article></>
);
}
// GraphQL Query pre načítanie presných dát príspevku
SingleTemplate.query = gql`
query GetPost($databaseId: ID!, $asPreview: Boolean!) {
post(id: $databaseId, idType: DATABASE_ID, asPreview: $asPreview) {
title
content
date
author {
node {
name
}
}
featuredImage {
node {
sourceUrl
altText
}
}
}
}
`;
// Nastavenie pre Faust routing engine
SingleTemplate.variables = ({ databaseId, asPreview }) => {
return {
databaseId,
asPreview: asPreview || false,
};
};
Krok 5: Nastavenie Catch-All Route v Next.js
Aby Faust.js prevzal kontrolu nad dynamickým smerovaním trás podľa WordPressu, vytvorte súbor src/pages/[…wordpressNode].js:
import { getWordPressProps, WordPressTemplate } from '@faustwp/core';
export default function Page(props) {
return ;
}
export async function getStaticProps(ctx) {
return getWordPressProps({
ctx,
revalidate: 60, // Nastavenie ISR: Stránka sa na pozadí revaliduje každých 60 sekúnd
});
}
export async function getStaticPaths() {
return {
paths: [],
fallback: 'blocking', // Nové trasy sa vygenerujú pri prvej požiadavke cez ISR
};
}
Týmto nastavením sme dosiahli ideálny stav:
- Stránky sa renderujú ako statické (SSG/ISR).
- Ak pribudne nový článok vo WordPress, Next.js ho vygeneruje pri prvej návšteve bez potreby redeployu celej aplikácie (ISR).
- Vďaka revalidate: 60 sú úpravy článkov aktualizované na frontende automaticky do 1 minúty.
4. Zvýšenie Výkonu, Bezpečnosť a Infrastruktúra
Prechod na headless architektúru zásadne mení pohľad na prevádzkovú bezpečnosť a systémovú infraštruktúru.
Bezpečnostné Aspekty Headless WordPressu
- Eliminácia útokov na verejný frontend: Keďže návštevníci komunikujú výhradne so statickými súbormi na CDN (Vercel/Netlify), tradičné vektory útokov na WordPress (SQL injections v témach, XSS zraniteľnosti v neprovovaných pluginoch, PHP exploit skripty) sú na verejnej vrstve úplne znefunkčnené.
- Skrytie WordPress Administrácie (Obfuscation): Backend WordPressu môže bežať na neverejnej poddoméne (napr. cms-backend-87a.internal-domain.com) chrápanej pomocou IP allow-listu, HTTP Basic Auth, alebo Cloudflare Access.
- Cross-Origin Resource Sharing (CORS): GraphQL a REST API endpointy musia mať prísne nakonfigurované CORS hlavičky tak, aby prijímali požiadavky výhradne z autorizovanej domény frontendu.// Príklad striktného nastavenia CORS v PHP pre WordPress
add_action( 'init', function() {
$allowed_origin = 'https://moj-web.sk';
header( "Access-Control-Allow-Origin: " . $allowed_origin );
header( "Access-Control-Allow-Methods: GET, POST, OPTIONS" );
header( "Access-Control-Allow-Credentials: true" );
header( "Access-Control-Allow-Headers: Authorization, Content-Type" );
if ( 'OPTIONS' === $_SERVER['REQUEST_METHOD'] ) {
status_header( 200 );
exit();
}
} );
5. Výhody a Nevýhody: Kedy prejsť na Headless?
Prístup Headless WordPress nie je univerzálnym riešením pre každý webový projekt. Vyžaduje zmenu vývojovej paradigmati a prináša so sebou špecifické výhody aj kompromisy.
Výhody (Pros)
- Extrémna Rýchlosť a Core Web Vitals: Štatické pred-generovanie a distribuovanie cez CDN zaručuje skvelé výsledky v metrikách LCP (Largest Contentful Paint) a TTFB (Time to First Byte), čo má priamy pozitívny dopad na SEO pozície.
- Neobmedzená Sloboda vo Frontend Vývoji: Vývojári nie sú viazaní obmedzeniami PHP šablón, akovými sú hlboko zaniestnené HTML štruktúry starých téme. Môžu využiť moderný ekosystém React, Vue, Tailwind CSS, Framer Motion atď.
- Vysoká Bezpečnosť: Kompletná izolácia databázy a aplikačnej logiky od návštevníka webu.
- Omnichannel Prístup: Jedna inštalácia WordPressu (rozhranie WPGraphQL) môže slúžiť ako jediný zdroj dát (Single Source of Truth) pre webovú aplikáciu, mobilnú aplikáciu (React Native / Flutter), pamäťové kiosky či smart zariadenia.
Nevýhody a Výzvy (Cons)
- Straty Funkcionality Bežných Pluginov: Pluginy, ktoré zasahujú priamo do frontendového vygenerovaného HTML (napr. Formulárové pluginy ako Contact Form 7, WooCommerce šablónové rozšírenia, alebo niektoré SEO pluginy generujúce meta tagy), nefungujú out-of-the-box. Musia sa nahradiť vlastnou logicou na frontende alebo špecializovanými GraphQL rozšíreniami.
- Narušenie Workflow Gutenberg Editora: Vizuálne úpravy blokov a Live Preview z Gutenberg editora si vyžadujú komplexné nastavenie na strane JavaScriptového frontendu (napr. Využitím balíčkov @wordpress/block-library alebo parserov ako wp-block-tools).
- Vyššie Finančné a Vývojové Náklady: Vývoj vyžaduje seniornejších vývojárov so znalosťou dvoch svetov (PHP/WordPress aj Node.js/React). Náklady na počiatočný vývoj sú podstatne vyššie než pri tvorbe klasickej WordPress témy.
Záver
Headless WordPress už dávno nie je len teoretickým konceptom alebo technologickým výstrelkom. Je to overená, produkčne nasaditeľná architektúra pre projekty, ktoré zďaleka presahujú možnosti bežného monolitického webu – či už ide o vysoko navštevované spravodajské portály, e-shopy vyžadujúce bleskové reakcie rozhrania, alebo korporátne prezentácie kladúce nekompromisné požiadavky na bezpečnosť.
Nasadenie technológií ako WPGraphQL, Next.js a špecializovaného frameworku Faust.js posúva WordPress z kategórie „jednoduchého blogovacieho systému“ do pozície plnohodnotného, enterprise-ready headless CMS. Hoci si vyžaduje vyššie vstupné investície a zmenu vývojárskeho myslenia, odmenou je mimoriadna rýchlosť načítania, špičkové Core Web Vitals a architektúra pripravená na škálovanie bez hraníc.
Zdroje a Citácie
Pre hlbšie štúdium problematiky decoupled architektúry, GraphQL optimalizácií a frameworku Faust.js odporúčame nasledujúce odborné zdroje a dokumentácie:
- WP Engine Developer Documentation – Faust.js Framework
Oficiálna dokumentácia k frameworku Faust.js, architektúre šablónovej hierarchie a integrácii náhľadov.
Odkaz: https://faustjs.org/docs/next/introduction - WPGraphQL Official Documentation & Schema Specifications
Kompletná špecifikácia GraphQL pre WordPress, návody na rozšírenie schémy a optimalizáciu databázových dopytov.
Odkaz: https://www.wpgraphql.com/docs/introduction - Next.js Documentation – Data Fetching, SSG, SSR and Incremental Static Regeneration (ISR)
Detailné podklady od spoločnosti Vercel k hybdridným stratégiám renderovania webových aplikácií.
Odkaz: https://nextjs.org/docs/pages/building-your-application/data-fetching/incremental-static-regeneration - W3C Web Architecture & Decoupled Content Management Systems Architectural Whitepaper
Odborné pohľady na oddelenie prezentácie od dátovej vrstvy v moderných webových systémoch.
Odkaz: https://www.w3.org/TR/webarch/ - GraphQL Foundation – GraphQL Performance, Caching & Best Practices
Oficiálne odporúčania neziskovej organizácie GraphQL Foundation pre návrh škálovateľných API rozhraní.
Odkaz: https://graphql.org/learn/best-practices/










