Hreflang uygulamasının üç yolu var: HTML head etiketi, HTTP header ve XML sitemap. İlk ikisi çoğu projede yeterli; ama head etiketine erişimin kısıtlı olduğu CMS ortamlarında ya da on binlerce URL içeren çok dilli sitelerde sitemap yöntemi tek pratik seçenek haline gelir.
Sitemap tabanlı hreflang, HTML head'e dokunmadan bütün dil alternatiflerini tek bir XML dosyasında tanımlamaya olanak verir. Merkezi yönetim gibi görünür; ama doğru sözdizimi, return tag zorunluluğu ve ölçekleme kararları göz ardı edildiğinde Google'ın bu eşlemeleri sessizce işlemediği durumlarla karşılaşılır.
xhtml:link yapısı ve namespace tanımı
XML sitemap normalde yalnızca <url> ve <loc> elementlerini içerir. Hreflang eklemek için sitemap namespace tanımına xmlns:xhtml eklenmesi ve her URL bloğuna <xhtml:link> elementleri yerleştirilmesi gerekir.
Temel yapı şöyle görünür:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://example.com/tr/urun</loc>
<xhtml:link rel="alternate" hreflang="tr" href="https://example.com/tr/urun"/>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/product"/>
<xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/produkt"/>
</url>
<url>
<loc>https://example.com/en/product</loc>
<xhtml:link rel="alternate" hreflang="tr" href="https://example.com/tr/urun"/>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/product"/>
<xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/produkt"/>
</url>
<url>
<loc>https://example.com/de/produkt</loc>
<xhtml:link rel="alternate" hreflang="tr" href="https://example.com/tr/urun"/>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/product"/>
<xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/produkt"/>
</url>
</urlset>
Her URL bloğunda bütün dil alternatifleri listelenir; kendisi dahil. Bu zorunluluk head etiketi yönteminden farklı değil: Google her dil için tam ve karşılıklı referanslar bekler.
xmlns:xhtml namespace tanımı olmadan <xhtml:link> elementleri parse edilemez. Sitemap XML olarak geçerli görünür ama hreflang verileri okunmaz. Bu hata Google Search Console'da açıkça raporlanmaz; veriler sessizce kaybolur.
Namespace URL'inin tam olarak http://www.w3.org/1999/xhtml şeklinde yazılması gerekir; HTTPS değil. Bu ayrıntı gözden kaçan bir sözdizimi hatasıdır. XML parser'lar namespace URI'yi kimlik olarak değerlendirdiğinden https:// ile yazan sitemap teknik olarak farklı bir namespace tanımlar ve xhtml:link elementleri bilinmeyen namespace altında işlenir. Bazı crawlerlarda fark yaratmaz; ama garantili davranış için resmi HTTP URI kullanılmalıdır.
Head etiketi mi, sitemap mı: karar kriterleri
Her iki yöntem Google tarafından eşit ağırlıkta değerlendirilir. Seçim teknik kısıtlara ve proje ölçeğine göre yapılır.
Head etiketi yöntemi şu durumlarda daha uygundur: sayfalar dinamik olarak oluşturuluyorsa ve her sayfa kendi hreflang bloğunu kendi HTML'ine gömebiliyorsa; sayfa sayısı birkaç yüzü geçmiyorsa; her dil sürümüne bağımsız geliştirici erişimi mevcutsa. Bu koşulların hepsini sağlayan projelerde sitemap yedeğe alınır.
Sitemap yöntemi şu durumlarda zorunlu ya da daha pratik hale gelir:
- HTML head'e müdahale edilemeyen CMS platformları (bazı hosted e-ticaret çözümleri, statik site generatörleri)
- Binlerce URL'in hreflang verisiyle merkezi olarak yönetilmesi gereken büyük sitelerde
- Hreflang'ın tüm siteye toplu uygulanacağı geçiş dönemleri
- PDF ve diğer HTML olmayan dosyalar için (bu dosyalarda HTTP header dışında tek seçenek sitemap)
İki yöntemi aynı anda kullanmak mümkün; ama tutarsızlık riski taşır. Aynı URL için head etiketi ve sitemap farklı alternatifler gösteriyorsa hangisinin dikkate alınacağı belirsizleşir. Tek kaynak seçip ona bağlı kalmak daha güvenlidir.
Return tag zorunluluğu ve sözdizimi hataları
Sitemap hreflang uygulamalarındaki en yaygın hata return tag eksikliğidir. Türkçe sayfanın sitemap bloğuna İngilizce alternatif eklendi; İngilizce sayfanın bloğuna Türkçe alternatif eklenmedi. Google bu durumda karşılıklılığı doğrulayamadığı için her iki eşleşmeyi de geçersiz sayar.
Yanlış yapı:
<!-- Sadece tr sayfası en'e işaret ediyor -->
<url>
<loc>https://example.com/tr/sayfa</loc>
<xhtml:link rel="alternate" hreflang="tr" href="https://example.com/tr/sayfa"/>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/page"/>
</url>
<!-- en sayfası tr'ye işaret etmiyor -->
<url>
<loc>https://example.com/en/page</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/page"/>
</url>
Return tag eksikliği, sitemap binlerce URL içerdiğinde gözden kaçması en kolay hata türüdür. Sitemap üretimini otomasyona bırakmak bu sorunu büyük ölçüde çözer; çok dilli sitemap oluşturmak için her URL bloğuna karşılıklı xhtml:link elementleri otomatik eklenir.
Diğer yaygın sözdizimi hataları:
- Hatalı büyük/küçük harf:
hreflang="TR"geçersizdir. Dil kodları küçük, bölge kodları büyük harfle yazılır:hreflang="tr"veyahreflang="tr-TR". - x-default eksikliği: Çoklu dil sürümü olan sitelerde varsayılan dil sayfası belirlenmemişse Google hangi sürümü yeni ziyaretçilere göstereceğini bilemez.
hreflang="x-default"bu iş için kullanılır. - Canonical ile çelişme: Bir sayfanın canonical etiketi farklı bir URL'e işaret ediyorsa, hreflang canonical URL'i değil gerçek sayfayı göstermelidir. Canonical'ı canonical olmayan bir URL'e yönlendirmek hreflang verilerini geçersiz kılar.
Hreflang dil ve bölge kodlarının doğru formatını üretmek için dil ve bölge kodlarını otomatik biçimlendiren bu araç kullanılabilir; oluşturulan etiketleri sitemap bloklarına entegre etmek kopyala-yapıştır işlemidir.
Büyük sitelerde sitemap indeks ile ölçekleme
Tek bir sitemap dosyası 50.000 URL ve 50 MB ile sınırlıdır. 3 dil sürümü olan 20.000 sayfalık bir sitede her URL bloğu 3 xhtml:link elementi taşır; bu, sitemap başına 60.000 kayıt anlamına gelir. Sınırı aşar.
Sitemap indeks dosyası bu sorunu çözer. Ana sitemap_index.xml birden fazla alt sitemap dosyasına işaret eder; her alt sitemap URL ve boyut sınırı dahilinde tutulur:
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://example.com/sitemap-tr.xml</loc>
</sitemap>
<sitemap>
<loc>https://example.com/sitemap-en.xml</loc>
</sitemap>
<sitemap>
<loc>https://example.com/sitemap-de.xml</loc>
</sitemap>
</sitemapindex>
Her alt sitemap kendi dil grubundaki URL'leri içerir; ama xhtml:link elementleri yine de tüm alternatifleri kapsamak zorundadır. sitemap-tr.xml içindeki bir URL bloğu hem tr hem en hem de de alternatiflerini listelemelidir. Dil bazlı bölümleme yalnızca dosya boyutunu yönetmek içindir; hreflang karşılıklılık kuralını değiştirmez.
Bir diğer bölümleme stratejisi URL tipine göredir: ürün sayfaları, kategori sayfaları ve blog yazıları ayrı sitemap dosyalarına dağıtılır. Her dosya hâlâ tüm dil alternatiflerini taşır; ama güncelleme sıklığı farklı URL tipleri için bağımsız yönetilebilir hale gelir. Sık güncellenen içerikler daha kısa aralıklarla yeniden taranırken statik kategori sayfaları daha seyrek işlenir.
Dinamik üretim ve bakım maliyeti
Sitemap hreflang'ın en büyük dezavantajı bakım yüküdür. Head etiketi yönteminde bir sayfanın hreflang bloğu yalnızca o sayfanın şablonundan yönetilir. Sitemap yönteminde ise aynı değişiklik sitemap dosyasındaki tüm ilgili URL bloklarını etkiler; bir dil sürümü kaldırıldığında ya da yeni bir pazar eklendiğinde bütün satırların güncellenmesi gerekir.
Bu nedenle sitemap hreflang'ı elle yazmak yalnızca küçük siteler için sürdürülebilir. 50 URL'den fazlası için otomatik üretim zorunludur. Üretim sistemi şu iki şeyden birini yapabilmelidir: her URL için o URL'in tüm dil alternatiflerini veri tabanından ya da yapılandırma dosyasından çekip xhtml:link elementlerini oluşturmak, ya da mevcut hreflang yapılandırmasını okuyarak sitemap çıktısını yeniden üretmek.
Dinamik sitemap üretiminde gözden kaçan gecikme kaynağı budur: sayfa yayına alındıktan sonra sitemap yeniden üretilip Search Console'a gönderilene kadar Google o sayfanın hreflang alternatiflerini göremez. Kritik lansmanlar için sitemap üretimini yayınlama akışının bir adımı haline getirmek bu gecikmeyi ortadan kaldırır.
Sitemap dosyasına erişim robots.txt üzerinden de kolaylaştırılabilir. Sitemap: https://example.com/sitemap_index.xml satırı robots.txt'e eklendiğinde arama motorları sitemap'i manuel gönderim olmaksızın keşfeder. Bu, özellikle yeni bir dil sürümü eklendiğinde ya da sitemap yapısı yeniden düzenlendiğinde tarama hızını artırır. Search Console gönderimi ise doğrulama için hâlâ önerilir; keşfedilen sitemap ile gönderilen sitemap ayrı kanallar olduğundan her ikisi de aktif tutulabilir.
Google Search Console'da doğrulama
Sitemap Google Search Console'a gönderildikten sonra "Uluslararası Hedefleme" bölümündeki "Hreflang" raporunda hata ve uyarılar görüntülenebilir. Return tag eksikliği, geçersiz dil kodu ve canonical çelişmeleri bu raporda ayrı satırlar olarak listelenir.
Bir sınırı var: rapor başarılı olarak işlenen eşleşmeleri göstermez, yalnızca hataları raporlar. Hata sayısı sıfıra inse bile "hreflang doğru çalışıyor" kesin sonucu çıkmaz. Sayfaların gerçekten doğru hedef kitleye sunulup sunulmadığını test etmenin yolu arama sonuçlarını farklı ülke lokasyonlarından sorgulamaktır.
Search Console'un "URL İnceleme" aracında belirli bir URL'yi analiz ettiğinizde Google'ın o sayfanın hangi kanonik versiyonunu seçtiğini ve hreflang verilerini nasıl yorumladığını görebilirsiniz. Bir URL'nin canonical'ı Google tarafından farklı bir URL olarak belirlendiyse, o URL bloğundaki xhtml:link elementleri değersizleşir. Tarama ve indeksleme kararları hreflang verilerinden önce işlendiğinden canonical sorunları çözülmeden hreflang optimizasyonu yapılmaz.
"Kapsam" raporunda "Bulunamadı (404)" veya "Taranmadı" olarak işaretlenen URL'ler sitemap hreflang eşleşmelerinde de sorun yaratır. Hreflang alternatifi olarak işaret edilen bir URL 404 dönüyorsa, o dil eşleşmesinin tamamı geçersiz sayılır. Sitemap hreflang hatalarını çözmeye başlamadan önce kapsam raporunu temizlemek süreci kısaltır.
Head etiketi tabanlı yapılandırmayı tercih ediyorsanız, iki yöntem arasındaki sözdizimi farkını somut örneklerle ele alan HTML link hreflang ekleme yazısı her iki yaklaşımın kısıtlarını karşılaştırmalı olarak gösteriyor.