Building a Headless WordPress Site with SvelteKit
The Ultimate Modern Stack: WordPress + SvelteKit
Combining WordPress’s powerful CMS with SvelteKit’s lightning-fast frontend delivers:
- ⚡ 90+ Lighthouse scores out of the box
- 🔄 Real-time content updates via GraphQL or REST
- 🛠️ Component-driven development with scoped styles
- 🚀 Static-site generation (SSG) or server-side rendering (SSR)
Why This Stack Wins
✔ WordPress familiarity for content teams
✔ Svelte’s compiler-driven performance
✔ Built-in routing, layouts, and API endpoints
✔ Progressive enhancement by default. Our YouTube channel; https://www.youtube.com/@easythemestore
Step 1: Setup Your WordPress Backend
1. Configure WordPress as a Headless CMS
// Disable frontend themes add_action('init', function() { if (!is_admin() && !wp_is_json_request()) { wp_redirect(home_url('/wp-admin')); exit; } }); // Enable REST API features add_filter('rest_authentication_errors', function($result) { return is_user_logged_in() ? $result : true; });
2. Essential Plugins
- WPGraphQL (GraphQL API)
- JWT Authentication (for secure endpoints)
- Advanced Custom Fields (structured content)
Step 2: Create Your SvelteKit Project
1. Initialize Project
npm create svelte@latest wp-sveltekit cd wp-sveltekit npm install @apollo/client graphql
2. Configure Apollo Client
// src/lib/client.js import { ApolloClient, InMemoryCache } from '@apollo/client'; export const client = new ApolloClient({ uri: 'https://your-wp-site.com/graphql', cache: new InMemoryCache() });
Step 3: Fetch WordPress Data
1. Page Routes (SSG Recommended)
<!-- src/routes/blog/[slug]/+page.svelte -->
<script>
import { client } from '$lib/client';
import { gql } from '@apollo/client';
export async function load({ params }) {
const { data } = await client.query({
query: gql`
query GetPost($slug: ID!) {
post(id: $slug, idType: SLUG) {
title
content
featuredImage {
node {
sourceUrl
}
}
}
}
`,
variables: { slug: params.slug }
});
return { post: data.post };
}
</script>
{#if post}
<h1>{post.title}</h1>
{@html post.content}
{/if}2. Dynamic Menu System
<!-- src/lib/Menu.svelte -->
<script>
let menuItems = [];
const fetchMenu = async () => {
const response = await fetch('/api/menu');
menuItems = await response.json();
};
fetchMenu();
</script>
<nav>
{#each menuItems as item}
<a href={item.url}>{item.title}</a>
{/each}
</nav>Step 4: Optimize for Production
1. Image Handling
<!-- Use the @sveltejs/image plugin -->
<Image
src={post.featuredImage.node.sourceUrl}
width={800}
height={450}
alt={post.title}
/>2. Incremental Static Regeneration
// src/routes/blog/+page.js export const config = { isr: { expiration: 60 // Revalidate every 60 seconds } };
3. Preview Mode
// src/routes/api/preview/+server.js export function GET({ url }) { const secret = url.searchParams.get('secret'); const slug = url.searchParams.get('slug'); if (secret !== 'YOUR_SECRET') { return new Response('Invalid token', { status: 401 }); } return new Response(null, { headers: { 'Set-Cookie': `preview_mode=true; Path=/; HttpOnly`, Location: `/blog/${slug}` }, status: 307 }); }
Advanced Patterns
1. Real-Time Updates with WebSockets
// src/routes/api/realtime/+server.js import { createServer } from 'http'; import { Server } from 'socket.io'; const httpServer = createServer(); const io = new Server(httpServer); io.on('connection', (socket) => { socket.on('contentUpdate', (slug) => { io.emit('refreshContent', slug); }); }); httpServer.listen(3001);
2. Hybrid Rendering
<!-- +page.svelte -->
<script context="module">
export const prerender = true; // SSG for SEO
export const csr = true; // Client-side hydration
</script>Deployment Strategies
| Platform | Advantage | Config Tip |
|---|---|---|
| Vercel | Instant cache invalidation | Set WP webhooks |
| Netlify | Built-in form handling | Use On-Demand Builders |
| Cloudflare | Edge-side WASM | Enable Smart Edge Caching |
Performance Benchmarks
| Metric | Traditional WP | SvelteKit Frontend |
|---|---|---|
| TTI | 4.2s | 0.8s |
| TBT | 290ms | 30ms |
| Bundle Size | 450KB | 12KB (gzipped) |
This architecture delivers sub-100ms page transitions while maintaining WordPress’s editing experience. Perfect for marketing sites, blogs, and content portals needing top-tier performance.
🚀 Pro Tip: Use KITQL to supercharge your GraphQL queries with SvelteKit!
