Headless WordPress: Next.js ile Decoupled Mimari Nasıl Kurulur?

Headless WordPress: Next.js ile Decoupled Mimari Nasıl Kurulur?

Geleneksel WordPress, hem içerik yönetimini hem de frontend sunumunu tek başına üstlenir. Headless mimaride ise WordPress yalnızca backend CMS olarak çalışır, frontend'i Next.js gibi modern bir framework üstlenir. Sonuç: daha hızlı sayfa yükleme, daha iyi geliştirici deneyimi ve sınırsız frontend es

C

Can Kaya

Güvenlik Uzmanı

21 Mart 202613 dk okuma0

Geleneksel WordPress, hem içerik yönetimini hem de frontend sunumunu tek başına üstlenir. Headless mimaride ise WordPress yalnızca backend CMS olarak çalışır, frontend'i Next.js gibi modern bir framework üstlenir. Sonuç: daha hızlı sayfa yükleme, daha iyi geliştirici deneyimi ve sınırsız frontend esnekliği. Bu rehberde WordPress'i headless CMS olarak yapılandırma, WPGraphQL ile veri çekme ve Next.js ile production-ready bir frontend oluşturma adımlarını ele alıyoruz.

Headless WordPress Nedir?

Headless WordPress, WordPress'in tema katmanını (frontend) devre dışı bırakıp yalnızca REST API veya GraphQL üzerinden içerik sunan bir mimaridir. İçerik editörleri alışık oldukları WordPress admin panelini kullanmaya devam eder; ancak ziyaretçilere sunulan sayfa WordPress tarafından değil, ayrı bir frontend uygulaması tarafından oluşturulur.

Özellik Geleneksel WordPress Headless WordPress
Frontend PHP tema (Blade/Twig) Next.js / Nuxt / Astro
Sayfa Yükleme Her istekte PHP render SSG/ISR ile statik + CDN
Performans Cache'e bağımlı Varsayılan olarak hızlı
Güvenlik Tema/eklenti saldırı yüzeyi API-only, küçük saldırı yüzeyi
Geliştirici Deneyimi PHP + jQuery React/Vue + TypeScript

💡 İpucu: Headless WordPress her proje için uygun değildir. Basit blog veya kurumsal siteler için geleneksel WordPress yeterlidir. Headless mimari, özel UI gereksinimleri olan, çoklu platform (web + mobil) desteği gereken veya yüksek performans hedefleyen projeler için idealdir.

WPGraphQL ile Veri Katmanı

WordPress yerleşik REST API sunar ancak GraphQL, frontend geliştirme için daha verimlidir. WPGraphQL eklentisi, WordPress verilerinizi GraphQL endpoint'i üzerinden sunar. Tek bir sorguyla yazı, yazar, kategori ve öne çıkan görseli birlikte çekebilirsiniz - REST API'de bu 3-4 ayrı istek gerektirir.

GraphQL Query
query GetPosts {
  posts(first: 10, where: { status: PUBLISH }) {
    nodes {
      id
      title
      slug
      excerpt
      date
      featuredImage {
        node {
          sourceUrl
          altText
        }
      }
      author {
        node {
          name
          avatar { url }
        }
      }
      categories {
        nodes { name slug }
      }
    }
  }
}

WPGraphQL Kurulumu ve Yapılandırma

WordPress admin panelinden Eklentiler > Yeni Ekle yolunu izleyerek WPGraphQL'i kurun. Alternatif olarak Composer ile kurulum yapabilirsiniz:

terminal
# Composer ile WPGraphQL kurulumu
composer require wp-graphql/wp-graphql

# GraphQL endpoint'i test et
curl -X POST https://cms.example.com/graphql \
  -H "Content-Type: application/json" \
  -d '{"query": "{ generalSettings { title } }"}'

Kurulumdan sonra https://siteniz.com/graphql endpoint'i aktif olur. WordPress admin panelinde GraphQL > Settings bölümünden GraphiQL IDE'yi etkinleştirerek sorguları tarayıcıda test edebilirsiniz. Güvenlik için production ortamında introspection'ı kapatmanız önerilir.

Next.js ile Frontend Kurulumu

Next.js, headless WordPress için en popüler frontend framework'üdür. SSG (Static Site Generation), ISR (Incremental Static Regeneration) ve SSR (Server-Side Rendering) desteği ile hem performans hem SEO açısından güçlü bir kombinasyon sunar. Projeyi oluşturup WordPress'e bağlayalım.

terminal
# Next.js projesi olustur
npx create-next-app@latest headless-wp --typescript --app

# GraphQL istemcisi kur
npm install graphql-request graphql

WordPress GraphQL endpoint'ine bağlanmak için bir istemci modülü oluşturun:

lib/wordpress.ts
import { GraphQLClient, gql } from 'graphql-request';

const client = new GraphQLClient(
  process.env.WORDPRESS_GRAPHQL_ENDPOINT!
);

export async function getAllPosts() {
  const query = gql`
    query AllPosts {
      posts(first: 20, where: { status: PUBLISH }) {
        nodes {
          slug
          title
          excerpt
          date
          featuredImage {
            node { sourceUrl altText }
          }
        }
      }
    }
  `;
  const data = await client.request(query);
  return data.posts.nodes;
}

export async function getPostBySlug(slug: string) {
  const query = gql`
    query PostBySlug($slug: ID!) {
      post(id: $slug, idType: SLUG) {
        title
        content
        date
        author { node { name } }
        categories { nodes { name slug } }
        seo { title metaDesc }
      }
    }
  `;
  const data = await client.request(query, { slug });
  return data.post;
}

Blog Listeleme ve Detay Sayfaları

Next.js App Router ile blog listeleme sayfasını oluşturun. generateStaticParams fonksiyonu build zamanında tüm yazı slug'larını çeker ve statik sayfalar oluşturur:

app/blog/[slug]/page.tsx
import { getAllPosts, getPostBySlug } from '@/lib/wordpress';

export async function generateStaticParams() {
  const posts = await getAllPosts();
  return posts.map((post) => ({ slug: post.slug }));
}

export default async function BlogPost({ params }) {
  const post = await getPostBySlug(params.slug);

  return (
    <article>
      <h1>{post.title}</h1>
      <div dangerouslySetInnerHTML={{ __html: post.content }} />
    </article>
  );
}

ISR ve SSG ile Performans Stratejisi

Headless WordPress'in en büyük avantajı, sayfaları build zamanında statik HTML olarak oluşturabilmesidir. Ancak sık güncellenen içerikler için her seferinde yeniden build almak pratik değildir. ISR (Incremental Static Regeneration) bu sorunu çözer: sayfalar statik olarak sunulur, arka planda belirli aralıklarla yeniden oluşturulur.

Strateji Ne Zaman Kullanılır Yenileme Süresi
SSG (Static) Nadiren değişen sayfalar (Hakkımızda, SSS) Yalnızca build zamanı
ISR Blog yazıları, ürün sayfaları revalidate: 60-3600 sn
SSR Kullanıcıya özel, dinamik içerik Her istekte
On-Demand ISR WordPress'te içerik güncellendiğinde Webhook tetiklemesi ile anında

On-Demand Revalidation ile Anında Güncelleme

WordPress'te bir yazı güncellendiğinde Next.js'e webhook göndererek ilgili sayfayı anında yeniden oluşturabilirsiniz. Bu yöntem, ISR'ın bekleme süresini ortadan kaldırır:

app/api/revalidate/route.ts
import { revalidatePath } from 'next/cache';
import { NextRequest, NextResponse } from 'next/server';

export async function POST(request: NextRequest) {
  const secret = request.headers.get('x-revalidate-secret');

  if (secret !== process.env.REVALIDATE_SECRET) {
    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
  }

  const { slug } = await request.json();
  revalidatePath(`/blog/${slug}`);
  revalidatePath('/blog');

  return NextResponse.json({ revalidated: true });
}

💡 İpucu: WordPress tarafında save_post hook'u ile yazı kaydedildiğinde Next.js revalidation endpoint'ine otomatik POST isteği gönderebilirsiniz. WPGraphQL Smart Cache eklentisi bu süreci otomatikleştirir.

Deployment ve Sunucu Mimarisi

Headless WordPress mimarisinde iki ayrı sunucu bileşeni vardır: WordPress backend (CMS) ve Next.js frontend. Bu bileşenleri aynı sunucuda veya ayrı sunucularda barındırabilirsiniz. Ayrı sunucu yaklaşımı, bağımsız ölçekleme ve güvenlik izolasyonu sağlar.

WordPress Backend

PHP 8.2+, MySQL 8.0, Nginx. WPGraphQL eklentisi aktif. Yalnızca API isteklerine yanıt verir, tema render etmez. 2 vCPU / 4 GB RAM yeterlidir.

Next.js Frontend

Node.js 18+, PM2 process manager. ISR ile statik sayfalar sunar. CDN arkasında çalıştırılması önerilir. 2 vCPU / 2 GB RAM yeterlidir.

Next.js uygulamasını production ortamında PM2 ile çalıştırmanızı öneriyoruz. Build ve başlatma komutları:

ecosystem.config.js
module.exports = {
  apps: [{
    name: 'headless-wp',
    script: 'node_modules/.bin/next',
    args: 'start',
    instances: 'max',
    exec_mode: 'cluster',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    }
  }]
};

Sunucu Boyutlandırma Rehberi

Headless WordPress projelerinde sunucu ihtiyacı, trafik hacmine ve içerik miktarına göre değişir. Aşağıdaki tablo farklı ölçekler için önerilen yapılandırmaları gösterir:

Ölçek WordPress Backend Next.js Frontend Aylık Trafik
Küçük 2 vCPU / 2 GB RAM 1 vCPU / 1 GB RAM 50K sayfa görüntüleme
Orta 2 vCPU / 4 GB RAM 2 vCPU / 4 GB RAM 500K sayfa görüntüleme
Büyük 4 vCPU / 8 GB RAM 4 vCPU / 8 GB RAM + CDN 2M+ sayfa görüntüleme

Headless mimari için Hosted Cloud bulut sunucuları idealdir. NVMe SSD diskler ve anlık kaynak artırımı ile hem WordPress backend hem Next.js frontend için yüksek performans elde edersiniz. WordPress staging ortamı kurulumu hakkında WordPress Staging rehberimizi inceleyebilirsiniz.

⚠️ Dikkat: ISR kullanıyorsanız Next.js sunucusunun disk yazma izni olmalıdır. Read-only dosya sistemi olan ortamlarda (bazı container platformları) ISR çalışmaz. Bu durumda on-demand revalidation veya SSR tercih edin.

Sıkça Sorulan Sorular

Headless WordPress SEO'yu olumsuz etkiler mi?

Hayır, aksine olumlu etkiler. Next.js SSG/ISR ile sayfalar statik HTML olarak sunulur, bu da arama motorlarının içeriği kolayca taramasını sağlar. Core Web Vitals skorları geleneksel WordPress'e göre belirgin şekilde iyileşir.

WordPress eklentileri headless modda çalışır mı?

Backend eklentileri (SEO, form, e-ticaret) çalışır ancak frontend'e müdahale eden eklentiler (slider, page builder, tema eklentileri) çalışmaz. Yoast SEO gibi eklentiler WPGraphQL ile entegre olarak meta verilerini API üzerinden sunar.

REST API mi yoksa GraphQL mi kullanmalıyım?

GraphQL, tek istekte birden fazla kaynağı çekmenize olanak tanır ve over-fetching sorununu ortadan kaldırır. REST API yerleşik olarak gelir ve basit projeler için yeterlidir. Karmaşık veri ilişkileri olan projelerde WPGraphQL tercih edin.

Headless WordPress ile WooCommerce kullanılabilir mi?

Evet, WooCommerce REST API ve WPGraphQL WooCommerce eklentisi ile ürün listeleme, sepet ve ödeme işlemleri frontend'den yönetilebilir. Ancak checkout akışı karmaşıktır ve ek geliştirme gerektirir.

Headless WordPress için hangi hosting gerekir?

WordPress backend için PHP ve MySQL destekli bir sunucu, Next.js frontend için Node.js destekli bir sunucu gerekir. Her iki bileşen aynı VPS üzerinde çalışabilir. Minimum 4 GB RAM önerilir.

Sonuç

Headless WordPress, içerik yönetiminin gücünü modern frontend teknolojileriyle birleştirir. WPGraphQL ile verimli veri çekimi, Next.js ISR ile statik performans ve on-demand revalidation ile anlık güncelleme sağlarsınız. Bu mimari özellikle yüksek performans hedefleyen, çoklu platform desteği gereken ve özel UI tasarımı isteyen projeler için güçlü bir çözümdür.

Headless WordPress Projeniz İçin Güçlü Altyapı

Hosted Cloud'un NVMe SSD bulut sunucuları ile WordPress backend ve Next.js frontend'inizi yüksek performansla çalıştırın.

Bulut Sunucu Planlarını İncele →
C

Can Kaya

Güvenlik Uzmanı

Siber güvenlik, DDoS koruması ve sunucu sertleştirme konularında içerikler üretmektedir. CISSP sertifikalı güvenlik uzmanı.

Yorumlar yakında