1. Neden Klasik Meta Etiketleri Artık Yetersiz?
Sadece <title> ve <meta name="description"> yazarak Google'da ilk sıraya çıkma çağı 10 yıl önce kapandı. Modern e-ticaret rekabetinde kullanıcıların arama sonuçlarında tıklama oranını (CTR) ikiye katlayan şey Zengin Sonuçlardır (Rich Snippets):
- Arama sonucunun hemen altında 5 üzerinden 4.8 yıldız rozeti,
- "Stokta Var (InStock)" yeşil yazısı ve kargo süresi tahmini,
- Doğrudan Google üzerinde beliren fiyat ve para birimi bilgisi.
Google botları bu verileri sayfanın HTML'inden tahmin etmekle uğraşmaz. Bunları doğrudan JSON-LD (JavaScript Object Notation for Linked Data) formatında yapılandırılmış olarak sunmanız gerekir.
2. Stilmerce Ürün JSON-LD Şeması
Stilmerce'in her ürün sayfası için sunucu tarafında ürettiği eksiksiz Schema.org yapısal veri bloğu:
// components/ProductJsonLd.tsx
export function ProductJsonLd({ product }: { product: ProductWithReviews }) {
const schema = {
'@context': 'https://schema.org',
'@type': 'Product',
name: product.title,
image: product.images,
description: product.description,
sku: product.sku,
mpn: product.mpn || product.sku,
brand: {
'@type': 'Brand',
name: product.brandName || 'Stilmerce',
},
offers: {
'@type': 'Offer',
url: `https://stilgen.com/products/${product.slug}`,
priceCurrency: 'TRY',
price: (product.priceCents / 100).toFixed(2),
priceValidUntil: '2027-12-31',
itemCondition: 'https://schema.org/NewCondition',
availability: product.stock > 0
? 'https://schema.org/InStock'
: 'https://schema.org/OutOfStock',
seller: {
'@type': 'Organization',
name: 'Stilmerce Storefront',
},
},
aggregateRating: product.reviewCount > 0 ? {
'@type': 'AggregateRating',
ratingValue: product.averageRating.toFixed(1),
reviewCount: product.reviewCount,
} : undefined,
};
return (
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
/>
);
}3. 100.000+ Ürün İçin Parçalı ve Streaming Sitemap.xml Mimarisi
Google'ın sitemap kurallarına göre tek bir XML dosyası 50.000 linki veya 50 MB boyutu aşamaz. 150.000 ürünü olan bir mağazada tek bir statik sitemap oluşturmaya kalkarsanız hafıza tükenir.
Stilmerce, Sitemap İndeksleme ve Streaming mimarisi kullanır:
// app/sitemap.ts: Otomatik bölünmüş sitemap oluşturucu
export async function generateSitemaps() {
const totalProducts = await getTotalProductCount();
const sitemapsNeeded = Math.ceil(totalProducts / 25000);
// Örn: [{ id: 0 }, { id: 1 }, { id: 2 }, { id: 3 }]
return Array.from({ length: sitemapsNeeded }, (_, i) => ({ id: i }));
}
export default async function sitemap({ id }: { id: number }) {
const products = await getProductBatch(id * 25000, 25000);
return products.map(p => ({
url: `https://stilgen.com/products/${p.slug}`,
lastModified: p.updatedAt,
changeFrequency: 'daily',
priority: 0.8,
}));
}
Sıfır Bellek Tüketimi
Googlebot /sitemap/0.xml, /sitemap/1.xml gibi parçaları çağırdıkça veriler veritabanı stream'i ile üretilir; sunucuda devasa XML dosyaları depolamaya gerek kalmaz.