# Tema SEO’su

> Tecof temalarında SEO — platformun hazır verdiği sitemap, robots.txt, alan adı ve sayfa düzeyi noindex, meta/OG alanları, çok dilli adresler ve 301’ler, özel kod, ürün beslemeleri; tema tarafında hreflang ve JSON-LD ekleme.
>
> Kaynak: https://tecof-app-dev.vercel.app/seo-geo · Bölüm: SEO ve GEO · Son güncelleme: 2018-10-20

Bu sayfa bir Tecof temasında arama motoru görünürlüğünün nasıl çalıştığını anlatır: platformun hazır verdiği parçalar ve tema geliştiricinin eklemesi gerekenler. Üretken yapay zekâ motorları için mağaza dosyaları ayrı sayfada: [GEO: AI Storefront](/ai-storefront).

## Platformun hazır verdikleri

| Konu | Nasıl çalışır |
| :--- | :--- |
| Sitemap | `app/sitemap.ts`; sayfalar ve ürün/kategori/marka/CMS detay sayfaları backend’den gelir |
| robots.txt | `app/robots.txt/route.ts`; panelde girilen içerik ya da varsayılan kurallar backend’den proxy’lenir |
| Alan adı düzeyi noindex | Panelde “arama motorlarına kapalı” alan adı (ücretsiz `tecof.site` alt alan adı varsayılan olarak kapalı) ve yapım aşaması tüm sayfalarda `noindex` basar |
| Sayfa düzeyi noindex | Panel → sayfa ayarları → SEO; şablon sayfadan türeyen ürün/CMS sayfalarına miras geçer |
| Meta ve OG | Sayfa başına başlık, açıklama ve OG görseli; CMS şablon sayfalarında token’larla doldurulur |
| Çok dilli adresler | `/[locale]/[...slug]`, dile özel adresler ve doğru dilin adresine 301 |
| Özel kod | Sayfa başına `<head>` ve gövde kodu (piksel, doğrulama etiketi) |
| Ürün beslemeleri | Google Merchant / Meta XML ve OpenAI CSV kataloğu (panel → E-ticaret → Ayarlar → Beslemeler) |

### Sitemap

Mutlak adresler **ziyaret edilen host’tan** türetilir: aynı tema hem mağazanın kendi alan adında hem `tecof.site` alt alan adında yayında olabilir ve Google, sitemap’i hangi host’tan çektiyse içindeki adreslerin de o host’ta olmasını ister. Sıra: istek host’u → mağazanın birincil alan adı → `NEXT_PUBLIC_SITE_URL`. Adres çözülemezse **boş** sitemap döner (yanlış host’a işaret eden sitemap zararlıdır). Sitemap saatte bir yenilenir.

### robots.txt

Tema `GET /api/store/robots.txt?host=<host>` ucunu vitrin anahtarıyla proxy’ler; panelde içerik yoksa backend varsayılan kuralları döner. Backend’e ulaşılamazsa şu yedek servis edilir:

```text
User-agent: *
Allow: /
Disallow: /api/
Disallow: /editor/
Disallow: /preview-component/
Disallow: /*/preview-component/
Disallow: /preview-template/
Disallow: /preview-starter/
```

Önizleme rotaları kimlik doğrulaması istemez; `noindex` arama motorunu keser, erişimi değil. Bu rotalarda gizli veri basmayın.

### noindex kuralları

- **Alan adı düzeyi** karar kök layout’ta, `merchant-info`’daki `noIndex` (istek host’una göre) ya da `isUnderConstruction` ile verilir ve tüm sayfalara geçer.
- **Sayfa düzeyi** `robots` yalnız sayfa kapalıyken yazılır. Açık sayfada `index: true` yazmayın: Next.js’te sayfanın `robots` alanı layout’unkini tamamen ezer ve alan adı düzeyindeki kapatma (ör. `tecof.site`) sessizce kalkar.
- Başlangıç içeriğiyle gelen sayfalar, mağaza metinleri düzenleyip yayınlayana kadar `noindex` doğar; şablonların değeri türeyen detay sayfalarına miras geçer.

```ts title="app/[locale]/[...slug]/page.tsx (özet)"
export async function generateMetadata({ params }) {
  const { slug, locale } = await params;
  const page = await getPageData(slug.join("/"), locale, false);
  if (!page) return {};
  return {
    title: page.metaTitle || undefined,
    description: page.metaDescription || undefined,
    ...(page.noIndex && { robots: { index: false, follow: false } }),
    openGraph: { title: page.metaTitle || undefined, description: page.metaDescription || undefined },
  };
}
```

### Çok dilli adresler

`POST /api/store/render` yanıtı istenen dilin adresini (`localizedSlug`), dil → adres haritasını (`slugAlternates`) ve adres o dile ait değilse 301 hedefini (`redirectTo`) taşır. Çekirdek tema yanlış dilin adresini kalıcı olarak doğru adrese yönlendirir (`/en/blog/ilk-yazi` → `/en/blog-en/first-post`) ve haritayı dil değiştiricide kullanır. Taslak önizlemede yönlendirme yapılmaz.

## Temada eklemeniz gerekenler

### hreflang

Çekirdek tema `slugAlternates` haritasını bugün yalnız dil değiştiricide kullanır. Arama motorlarına dil karşılıklarını bildirmek için `generateMetadata` içinde `alternates.languages` üretin:

```ts
const base = `https://${host}`;
return {
  // …
  alternates: {
    canonical: `${base}/${locale}/${page.localizedSlug ?? slug.join("/")}`,
    languages: Object.fromEntries(
      Object.entries(page.slugAlternates ?? {}).map(([code, path]) => [code, `${base}/${code}/${path}`]),
    ),
  },
};
```

### Yapılandırılmış veri (JSON-LD)

Platform JSON-LD üretmez; ürün, içerik ve işletme bilgisini temanız basmalıdır. Ürün detay bölümünde:

```tsx title="components/ProductJsonLd.tsx"
export function ProductJsonLd({ product, url }: { product: Product; url: string }) {
  const data = {
    "@context": "https://schema.org",
    "@type": "Product",
    name: product.name,
    image: product.images,
    description: product.description,
    sku: product.sku,
    brand: product.brand ? { "@type": "Brand", name: product.brand } : undefined,
    offers: {
      "@type": "Offer",
      url,
      priceCurrency: product.currency,
      price: product.price,
      availability: product.inStock ? "https://schema.org/InStock" : "https://schema.org/OutOfStock",
    },
  };
  return <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(data).replace(/</g, "\\u003c") }} />;
}
```

Önerilen şemalar: ürün sayfasında `Product` + `BreadcrumbList`, blog yazısında `Article` (ya da `BlogPosting`), ana sayfada `Organization` + `WebSite`, SSS bölümünde `FAQPage`. Değerleri her zaman vitrin API’sinin döndüğü gerçek veriden üretin; `<` karakterini kaçırın.

### Görseller ve performans

- Görselleri `TecofPicture` ile basın; boyut varyantları ve odak noktası otomatik uygulanır ([Yayın render’ı](/editor-render#tecofpicture)). Anlamlı `alt` metni verin.
- Hero görselinde `loading="eager"` ve Next.js `Image` ile `priority`; diğerlerinde tembel yükleme.
- Studio stil CSS’i sayfa başına yalnız kullanılan sınıflarla üretilir; ek CSS yükü getirmez.

## SEO kontrol listesi

- [ ] Sayfa başlığı ve açıklaması her yayın sayfasında dolu; ürün/CMS şablonlarında token’larla.
- [ ] OG görseli tanımlı; görseller `TecofPicture` ile ve `alt` metniyle.
- [ ] Sayfa düzeyinde yalnız gerçekten gizlenecek sayfalar `noindex`.
- [ ] Mağazanın kendi alan adı birincil alan adı olarak seçili; `tecof.site` kapalı.
- [ ] `sitemap.xml` ve `robots.txt` canlı host’ta doğru adresleri veriyor.
- [ ] Çok dilli mağazada `hreflang` alternatifleri basılıyor.
- [ ] Ürün sayfalarında `Product` JSON-LD var.
- [ ] Ürün beslemesi Merchant Center’a bağlı.
