# SEO: Sitemap & Meta Tag Yönetimi

TYPO3 v13'te SEO yapılandırması, XML sitemap oluşturma ve meta tag yönetimini kapsar. Bu doküman, **birden fazla sayfadan** (ör. Home, Product, Blog/News, Contact vb.) oluşan siteler için geçerlidir; sitemap ve meta ayarları sayfa ağacındaki tüm sayfalara uygulanır.

---

## Genel Yapı

| Bölüm | Açıklama |
| ----- | -------- |
| **SEO Extension** | Kurulum ve site set bağımlılığı |
| **XML Sitemap** | Sayfa ağacındaki tüm indekslenebilir sayfalar + isteğe bağlı kayıt sitemap'leri (news vb.) |
| **Meta Tag** | Site geneli TypoScript + her sayfa için Backend SEO sekmesi |
| **robots.txt** | Site config veya statik dosya |
| **Canonical / hreflang** | Extension ile otomatik; sayfa bazlı geçersiz kılma mümkün |

---

## SEO Extension Kurulumu

```bash
ddev composer require typo3/cms-seo
ddev exec vendor/bin/typo3 extension:setup
ddev exec vendor/bin/typo3 cache:flush
```

Site yapılandırmasında SEO Sitemap set'inin tanımlı olduğundan emin olun. **config/sites/&lt;site&gt;/config.yaml** içinde:

```yaml
dependencies:
  - typo3/seo-sitemap
```

---

## Meta Tag Yapılandırması

### TypoScript ile

```typoscript
page {
    meta {
        viewport = width=device-width, initial-scale=1
        robots = index,follow
        author = My Company
        charset = utf-8

        # Open Graph
        og:title.field = title
        og:description.field = description
        og:type = website
        og:site_name = My Website
        og:image.stdWrap.cObject = FILES
        og:image.stdWrap.cObject {
            references {
                fieldName = og_image
            }
            renderObj = TEXT
            renderObj.stdWrap.typolink {
                parameter.data = file:current:publicUrl
                returnLast = url
                forceAbsoluteUrl = 1
            }
        }

        # Twitter Card
        twitter:card = summary_large_image
        twitter:title.field = title
        twitter:description.field = description
    }
}
```

### Sayfa Bazlı Meta (Backend)

Birden fazla sayfalı yapıda her sayfa için meta bilgileri ayrı ayrı verilebilir. SEO extension yüklü olduğunda sayfa ağacındaki her sayfada **Edit page properties → SEO** sekmesi görünür:

| Alan           | Açıklama                       |
| -------------- | ------------------------------ |
| SEO Title      | Arama motoru için özel başlık  |
| Description    | Meta description               |
| Robots         | index/noindex, follow/nofollow |
| Canonical URL  | Kanonik URL                    |
| OG Title       | Open Graph başlığı             |
| OG Description | Open Graph açıklaması          |
| OG Image       | Open Graph görseli             |
| Twitter Card   | Twitter kart ayarları          |

---

## XML Sitemap

### Sitemap ne içerir?

SEO extension varsayılan olarak **sayfa ağacındaki (page tree) tüm indekslenebilir sayfaları** sitemap'e ekler: root sayfa (örn. Home) ve alt sayfalar (Product, Who we are, Blog/News, Shop, Contact vb.). `no_index` olan veya belirli doktype'lardaki sayfalar hariç tutulur. İsteğe bağlı olarak News veya diğer kayıt tabloları için ayrı sitemap'ler eklenebilir.

### Otomatik Sitemap

Sitemap otomatik oluşturulur. Varsayılan erişim adresi `?type=1533906435` ile verilir. Okunabilir URL (`/sitemap.xml`) için site config'de routing tanımlanmalıdır.

### Routing: /sitemap.xml Erişimi

`/sitemap.xml` adresinin 404 vermemesi için site yapılandırma dosyasına **routeEnhancers** ekleyin. Aksi halde sitemap yalnızca `https://example.com/?type=1533906435` üzerinden erişilebilir.

**config/sites/&lt;site&gt;/config.yaml** içine ekleyin:

```yaml
routeEnhancers:
  PageTypeSuffix:
    type: PageType
    map:
      /: 0
      sitemap.xml: 1533906435
```

- `/: 0` — Normal sayfalar (type 0).
- `sitemap.xml: 1533906435` — `/sitemap.xml` isteğini sitemap page type'ına yönlendirir.

Birden fazla sitemap türü (örn. sayfalar + news) için alt sitemap URL'lerini de güzelleştirmek isterseniz:

```yaml
routeEnhancers:
  PageTypeSuffix:
    type: PageType
    map:
      /: 0
      sitemap.xml: 1533906435
  Sitemap:
    type: Simple
    routePath: 'sitemap-type/{sitemap}'
    aspects:
      sitemap:
        type: StaticValueMapper
        map:
          pages: pages
          tx_news: tx_news
```

Yapılandırmadan sonra cache temizleyin:

```bash
ddev exec vendor/bin/typo3 cache:flush
```

### Sitemap index vs. sayfa listesi

`/sitemap.xml` bir **sitemap index** sayfasıdır; burada sitenizdeki sitemap *türleri* listelenir (örn. "pages", varsa "tx_news"). Gördüğünüz "This XML Sitemap Index file contains 1 sitemaps" ifadesi, yalnızca **bir tane alt sitemap** (sayfalar sitemap'ı) tanımlı olduğu anlamına gelir. Gerçek sayfa URL'leri (Home, Product, Contact vb.) **"pages"** satırındaki linke tıklayınca açılan sayfada yer alır (`/sitemap.xml?sitemap=pages&cHash=...`).

### Sitemap'ta sayfa çıkmıyorsa (sorun giderme)

"pages" sitemap'ını açtığınızda hiç URL görünmüyorsa aşağıdakileri kontrol edin:

| Olası neden | Kontrol |
| ----------- | ------- |
| **no_index** | Sayfa özelliklerinde **Edit page properties → SEO** sekmesinde "Index this page" **açık** olmalı. Kapalıysa sayfa sitemap'a alınmaz. |
| **Canonical link** | **SEO** sekmesinde "Canonical link" alanı **boş** bırakılmalı. Bu alan doldurulursa TYPO3 sayfayı XML sitemap'tan **çıkarır** (duplicate sayfa kabul eder). |
| **Sayfa gizli (hidden)** | **Edit page properties → General** sekmesinde sayfa "Hide" ile gizli olmamalı. Gizli sayfalar sitemap'a eklenmez. |
| **Hariç tutulan sayfa türleri (doktype)** | Varsayılan olarak belirli doktype'lar (ör. shortcut, mount, spacer, sys folder) sitemap'tan çıkarılır. Product gibi normal sayfalar doktype 1 (Standard) olmalı. |
| **excludePagesRecursive** | Site set veya ayarlarda belirli sayfa UID'leri (veya alt ağaçları) sitemap'tan tamamen çıkarılmış olabilir. |
| **Cache** | SEO veya "Hide" değiştirdikten sonra sitemap eski hâliyle önbellekte kalabilir. `ddev exec vendor/bin/typo3 cache:flush` çalıştırıp tekrar `/sitemap.xml` → "pages" linkine bakın. |
| **Root page / dil** | Sitemap, site root (rootPageId) ve seçili dil için üretilir. Doğru sitede ve dilde olduğunuzdan emin olun. |

**TypoScript ile sayfa sitemap koşullarını gevşetmek** (sadece gerekirse):

```typoscript
plugin.tx_seo {
    config {
        xmlSitemap {
            sitemaps {
                pages {
                    config {
                        excludedDoktypes = 3,4,6,7,199,254,255
                        additionalWhere = no_index = 0
                    }
                }
            }
        }
    }
}
```

`additionalWhere = no_index = 0` kaldırılırsa no_index işaretli sayfalar da sitemap'a girer (genelde önerilmez). Önce Backend'de ilgili sayfaların **SEO** sekmesinde "Index this page" açık mı kontrol edin.

### TypoScript ile Özelleştirme

`pages` provider, root sayfadan itibaren sayfa ağacındaki tüm uygun sayfaları sitemap'e dahil eder. Hariç tutulacak sayfa türleri ve `no_index` koşulu aşağıda özelleştirilebilir:

```typoscript
plugin.tx_seo {
    config {
        xmlSitemap {
            sitemaps {
                pages {
                    provider = TYPO3\CMS\Seo\XmlSitemap\PagesXmlSitemapDataProvider
                    config {
                        excludedDoktypes = 3,4,6,7,199,254,255
                        additionalWhere = no_index = 0
                    }
                }

                # Haber sitemap'ı (isteğe bağlı)
                news {
                    provider = GeorgRinger\News\Seo\NewsXmlSitemapDataProvider
                    config {
                        table = tx_news_domain_model_news
                        sortField = datetime
                        lastModifiedField = tstamp
                        pid = 10
                        recursive = 2
                        url {
                            pageId = 5
                            fieldToParameterMap {
                                uid = tx_news_pi1[news]
                            }
                            additionalGetParameters {
                                tx_news_pi1.controller = News
                                tx_news_pi1.action = detail
                            }
                            useCacheHash = 1
                        }
                    }
                }
            }
        }
    }
}
```

---

## robots.txt

### Otomatik (Site Configuration)

TYPO3, site configuration üzerinden robots.txt yönetir. `config/sites/main/config.yaml`:

```yaml
base: "https://example.com/"
rootPageId: 1
```

**Tüm Siteyi İndekse Kapatma (Geliştirme Ortamı İçin):**

Eğer sitenizin (özellikle geliştirme veya test ortamlarında) arama motorları tarafından indekslenmesini tamamen engellemek istiyorsanız `config.yaml` içine aşağıdaki yapılandırmayı ekleyebilirsiniz:

```yaml
robotsTxt: |
  User-agent: *
  Disallow: /
```

### Manuel robots.txt

`public/robots.txt`:

```
User-agent: *
Allow: /

# Sitemap
Sitemap: https://example.com/sitemap.xml

# Backend'i engelle
Disallow: /typo3/
Disallow: /typo3temp/
Disallow: /typo3conf/
```

---

## Canonical URL

### Otomatik

SEO extension otomatik canonical tag ekler. Her sayfada benzersiz canonical URL oluşturulur.

### Manuel Geçersiz Kılma

Backend'de sayfa düzenlerken **SEO** sekmesinde **Canonical URL** alanından özel canonical URL belirtebilirsiniz.

---

## Yapısal Veri (Structured Data)

### JSON-LD ile

```typoscript
page.headerData {
    100 = TEXT
    100.value (
        <script type="application/ld+json">
        {
            "@context": "https://schema.org",
            "@type": "Organization",
            "name": "My Company",
            "url": "https://example.com",
            "logo": "https://example.com/logo.png",
            "contactPoint": {
                "@type": "ContactPoint",
                "telephone": "+90-212-000-0000",
                "contactType": "customer service"
            }
        }
        </script>
    )
}
```

### schema Extension ile

```bash
ddev composer require brotkrueml/schema
```

Fluid'de:

```html
<schema:type.organization
  name="My Company"
  url="https://example.com"
  -as="organization"
/>
```

---

## hreflang Etiketleri

Çok dilli siteler için otomatik olarak SEO extension tarafından eklenir:

```html
<link rel="alternate" hreflang="tr" href="https://example.com/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />
```

---

## SEO Kontrol Listesi

- [ ] Meta title ve description sayfa ağacındaki her sayfada tanımlı (Edit page properties → SEO)
- [ ] XML sitemap oluşturulmuş, `/sitemap.xml` erişilebilir ve Google'a gönderilmiş
- [ ] robots.txt doğru yapılandırılmış
- [ ] Canonical URL'ler doğru
- [ ] hreflang etiketleri (çok dilli site için)
- [ ] Open Graph meta tagları
- [ ] Yapısal veri (Schema.org)
- [ ] Sayfa hızı optimize edilmiş
- [ ] Responsive tasarım
- [ ] SSL/HTTPS aktif

---

## Kaynaklar

- [TYPO3 SEO Extension](https://docs.typo3.org/c/typo3/cms-seo/main/en-us/)
- [Schema.org Extension](https://docs.typo3.org/p/brotkrueml/schema/main/en-us/)
