Next.js ile zamanlı blog yayını
Bu blogda yazılar önceden hazırlanıp belirli bir gün ve saatte kendiliğinden yayına çıkıyor. Bunun için ne bir veritabanı tablosu ne de zamanlanmış bir iş (cron) kullanıyorum. Bütün mekanizma MDX dosyalarının front-matter'ı ve Next.js'in periyodik yeniden oluşturmasına (ISR) dayanıyor.
Yayın zamanı dosyada
Her yazının başında tarih ve saat var:
date: "2026-10-31"
time: "18:00"
İçerik okunurken bu ikisi tek bir ana çevriliyor. Saat dilimini açıkça yazmak önemli; sunucu UTC'de çalışır, yazılar ise İstanbul saatine göre planlanır:
const publishAt = (date?: string, time?: string) =>
date ? Date.parse(`${date}T${time ?? "00:00"}:00+03:00`) || 0 : 0;
const scheduled = publishAt(data.date, data.time) > Date.now();
Zamanı gelmemiş yazılar üretimde listeden çıkarılıyor; yerel geliştirmede ise hepsi görünüyor, böylece yazıyı yayından önce önizleyebiliyorum.
Sayfalar kendini tazeliyor
Filtre, sayfa oluşturulurken çalışır. Sayfa bir kez statik olarak üretilip sonsuza kadar sunulsaydı, zamanı gelen yazı yeni bir yayın yapılana kadar görünmezdi. Çözüm, blog sayfalarında yeniden doğrulama süresi tanımlamak:
export const revalidate = 600; // 10 dakika
Böylece sayfa en fazla on dakikada bir yeniden oluşturulur ve zamanı gelen yazı en geç on dakika içinde listede, site haritasında ve RSS akışında görünür.
Dikkat edilecek üç ayrıntı
- Doğrudan adres de gizli olmalı. Yalnızca listeden çıkarmak yetmez; zamanı gelmemiş yazının adresine gidildiğinde 404 dönmeli. Aynı filtre yazı sayfasında da kullanılmalı.
- Site haritası ve RSS aynı kaynaktan beslenmeli. Aksi hâlde arama motorları henüz yayında olmayan bir adresi görür.
- Yayından önce üretim davranışını test edin. Geliştirme modu her şeyi gösterdiği için, üretim derlemesini yerelde çalıştırıp zamanlı bir yazının 404 döndüğünü kontrol etmek gerekiyor.
Bu yöntem, yazıların git deposunda yaşadığı küçük bir blog için yeterince basit ve güvenilir. Aynı sitenin veritabanı tarafını SQLite ve libSQL yazısında, genel mimarisini kişisel finans paneli yazısında anlattım.