Skip to content

SEO / Meta

Bu belge sayfa başlığı, açıklama, sosyal önizleme ve dil alternatifleri içindir.

Sitemap (URL listesi, robots.txt) ayrı sayfada: Sitemap — burada tekrarlanmaz.


Arama motorları ve sosyal ağlar her sayfada şunlara bakar:

ÖğeKullanıcıda görünenNerede tanımlı
TitleSekme / arama başlığı<title>
DescriptionArama sonucu özeti<meta name="description">
Canonical“Asıl URL bu”<link rel="canonical">
hreflangDil alternatifleri<link rel="alternate" hreflang="...">
Open GraphWhatsApp, LinkedIn önizlemesiog:* meta
Twitter CardX (Twitter) önizlemesitwitter:* meta

Falcon’da bunların çoğu tek yerden (BaseLayout) ve varsayılan config (seo.ts, site.ts) ile yönetilir.


Site geneli yedek değerler:

  • defaultTitle, defaultDescription
  • defaultImage/og/default.svg
  • twitterHandle (boş olabilir)
  • ogLocale → dil başına (en_GB, tr_TR, …)

Sayfa kendi title / description vermezse bunlar kullanılır.

  • url — canonical, OG görsel ve hreflang’de tam adres için (https://...)
  • name, logo — OrganizationSchema JSON-LD’de kullanılır

Sitemap de aynı site.url’i kullanır; production’da birlikte güncellenir.

3. Dil URL Eşlemesi — src/i18n/routing.ts

Section titled “3. Dil URL Eşlemesi — src/i18n/routing.ts”

getAlternatePaths(pathname):

  • src/config/routes.ts içindeki sitePages (ör. home, blog) için EN/TR/DE/FR path’leri üretir
  • Bilinmeyen path’lerde önek swap fallback (/tr, /de, /fr)

Bu liste hreflang linklerinin kaynağıdır.

4. Layout — src/layouts/BaseLayout.astro

Section titled “4. Layout — src/layouts/BaseLayout.astro”

Her public sayfa bu layout’u kullanır; <head> içinde otomatik:

  • title, description
  • canonical = site.url + pathname
  • hreflang (4 dil + x-default → EN)
  • Open Graph + Twitter Card
  • og:image = site.url + defaultImage (veya sayfa image prop’u)

Props:

<BaseLayout
title="Sayfa başlığı"
description="Kısa açıklama"
image="/og/ozel.svg"
alternatePaths={...}
/>

alternatePaths yalnızca blog çevirisi gibi özel durumlarda verilir; yoksa getAlternatePaths devreye girer.

Sosyal paylaşımda kullanılan varsayılan görsel. Önemli sayfalar için ileride image prop ile override edilebilir.

Aynı yazının dilleri frontmatter ile eşlenir:

translationKey: welcome
locale: en

src/lib/blog.tsgetBlogAlternatePaths() aynı key’e sahip yazıların URL’lerini hreflang’e yazar.

Örnek: /blog/welcome//tr/blog/hos-geldiniz/ birbirine hreflang ile bağlı.

  • Key varsa → tüm çeviri URL’leri hreflang’de
  • Key yoksa → yalnızca o yazının dili (tek dil, doğru)

Blog slug sayfaları SSR ile findPostBySlug + alternatePaths kullanır.


Yeni Statik Sayfa (Contact; Hakkımızda Henüz Yok — Aynı Akışla Eklenebilir)

Section titled “Yeni Statik Sayfa (Contact; Hakkımızda Henüz Yok — Aynı Akışla Eklenebilir)”
  1. src/config/routes.ts → yeni pageId ve her dilin path’i
  2. src/pages/... + mirror (tr/, de/, fr/)
  3. Layout’ta kendi title ve description:
<BaseLayout
title="İletişim — Falcon"
description="Bize ulaşın."
>

Açıklama vermezseniz tüm sayfalar Google’da aynı defaultDescription ile görünebilir.

Zaten description prop’u var; metinleri seo.ts veya sayfa bazlı güncelleyin.

  1. Her dil için ayrı MDX (welcome.mdx, hos-geldiniz.mdx)
  2. Aynı translationKey, farklı locale ve farklı slug (id)
  3. Build sonrası her URL’nin kaynak kodunda hreflang’i kontrol edin

Önce routes.ts’e ekleyin. getAlternatePaths yalnızca sitePages’te kayıtlı path’leri tam eşler; kayıtsız sayfalar fallback (prefix swap) kullanır — mümkünse her sayfayı sitePages’e ekleyin.


DosyaNe
src/config/site.tsurl → canlı domain
src/config/contact.tsTelefon, e-posta, adres (OrganizationSchema)
src/config/social.tsDolu sosyal profil URL’leri
src/config/sector.tsİşletme tipi → schema @type
src/config/seo.tsdefaultTitle, defaultDescription, twitterHandle
public/robots.txtSitemap satırı (Sitemap sayfasına bakın)
public/og/default.svgİsterseniz marka görseli ile değiştirin

Domain değişince mutlaka site.url güncelleyin; canonical ve OG kırık domain göstermesin.


YapYapma
Önemli sayfalara özel title + descriptionHer sayfayı varsayılan SEO’ya bırakma
Çeviri blog’da aynı translationKeyAynı içeriği key’siz farklı slug’larda bırakma
Path’leri routes.ts’te tanımlahreflang için URL’yi elle <head>’e yazma
Paylaşım görseli 1200×630 civarı düşün (OG)Çok küçük veya göreli path (og:image mutlak URL ister)

Sitemap ile ilişki: Sitemap URL keşfi; meta etiketleri tıklama/snippet kalitesi. İkisi birbirini tamamlar, biri diğerinin yerine geçmez.


Google’a sitenin kim olduğunu JSON-LD ile anlatır (işletme adı, telefon, e-posta, adres, logo, sosyal profiller). Arama sonucu başlığı değiştirmez; zengin sonuç / bilgi paneli için kullanılır.

DosyaGörevi
src/config/contact.tsTelefon, e-posta, WhatsApp, adres
src/config/social.tsSosyal URL’ler → sameAs (boş olanlar dahil edilmez)
src/config/sector.tsİşletme tipi → schema @type
src/components/layout/OrganizationSchema.astroJSON-LD üretir
BaseLayout.astroHer sayfada <OrganizationSchema />
sector.typeJSON-LD @type
generic (varsayılan)LocalBusiness
agencyProfessionalService
  1. contact.ts — gerçek iletişim bilgileri
  2. social.ts — dolu profil linkleri
  3. site.tsurl (canlı domain)

Sayfa kaynağında application/ld+json ve schema.org arayın. Google Rich Results Test ile doğrulayabilirsiniz.


src/config/seo.ts → varsayılan title, description, OG locale
src/config/site.ts → url, name, logo
src/config/contact.ts → telefon, e-posta, adres
src/config/social.ts → sameAs (sosyal profiller)
src/config/sector.ts → LocalBusiness / ProfessionalService
src/config/routes.ts → sitePages (hreflang kaynağı)
src/i18n/routing.ts → getAlternatePaths
src/layouts/BaseLayout.astro → tüm meta etiketleri + OrganizationSchema
src/components/layout/OrganizationSchema.astro → JSON-LD
src/lib/blog.ts → getBlogAlternatePaths
public/og/default.svg → varsayılan paylaşım görseli

Build sonrası bir sayfanın kaynak kodunda arayın:

  • <link rel="canonical"
  • <meta property="og:title"
  • <link rel="alternate" hreflang="tr"
  • application/ld+json ve schema.org (OrganizationSchema)

Blog çifti: EN ve TR yazı sayfalarında karşılıklı hreflang linkleri.


SEO / Meta = her sayfanın başlık, açıklama, canonical, dil alternatifleri ve sosyal önizlemesi. Falcon’da merkez: seo.ts, site.ts, routes.ts, BaseLayout. Blog çevirisi: translationKey. Yapısal veri: contact.ts, social.ts, sector.ts, OrganizationSchema. Sitemap ayrı belgede.