- Konu sahibi
- #1
PHP ile sitemap oluşturmak için indekslenebilir URL'leri XML yapısında üretip örneğin
Bir sitemap belgesinde kök element
URL değerlerini göreli yol yerine tam adres olarak üretin. Yönetim ekranları, oturum gerektiren sayfalar, 404 dönen adresler, yönlendirme yapan eski URL'ler ve canonical olarak tercih edilmeyen varyasyonlar listeye alınmamalıdır.
Aşağıdaki örnek, sitemap'i doğrudan HTTP yanıtı olarak üretir. Gerçek projede sabit dizi yerine veritabanından yalnızca yayınlanmış kayıtları getirebilirsiniz.
Örneğin içerik tablonuzda
Tarih alanı güvenilir değilse
XMLWriter ileri yönde yazabilir; fakat
Dosya yolu kullanıcı girdisinden oluşturulmamalıdır. Yeni XML tamamlanıp doğrulanmadan mevcut çalışan haritanın üzerine yarım çıktı sunmayın. Sitemap başına en fazla 50.000 URL ve sıkıştırılmamış 50 MB sınırını aşan listeleri parçalara ayırıp sitemap indeksiyle bildirin.
PHP dosyasında
Diğer yaygın hatalar; göreli URL kullanmak,
Hayır. PHP yorumlayıcısının web sunucusunda doğru çalışması gerekir. .php uzantısını .xml olarak değiştirmek PHP'yi çalıştırmaz. Kodun kendisi herkese görünüyorsa önce sunucu PHP işleyicisini düzeltin; yapılandırma sırlarının açığa çıkıp çıkmadığını da inceleyin.
Hayır. İki yaklaşım da aynı
/sitemap.php adresinden sunabilirsiniz. /sitemap.xml adresini kullanmak istiyorsanız ayrıca bu dosyayı üretmeli veya o yolu PHP uç noktasına bağlayan bir sunucu/uygulama rotası tanımlamalısınız. PHP dosyası oluşturmak tek başına XML uzantılı adresi açmaz. Küçük listelerde DOMDocument pratik bir seçimdir; büyük listelerde XML'in tamamını bellekte tutmamak için XMLWriter ile akış halinde üretim daha uygundur. Sitemap'e yalnızca gerçekten yayınlanan, herkese açık ve tercih edilen URL'leri ekleyin.Sitemap oluşturma mantığı
Bir sitemap belgesinde kök element
urlset olur. Her adres ayrı bir url elementi içinde loc alanıyla yazılır. Güvenilir bir içerik değişiklik tarihi tutuluyorsa lastmod eklenebilir; tahmini veya her istekte yenilenen tarihler kullanılmamalıdır.URL değerlerini göreli yol yerine tam adres olarak üretin. Yönetim ekranları, oturum gerektiren sayfalar, 404 dönen adresler, yönlendirme yapan eski URL'ler ve canonical olarak tercih edilmeyen varyasyonlar listeye alınmamalıdır.
DOMDocument ile temel örnek
Aşağıdaki örnek, sitemap'i doğrudan HTTP yanıtı olarak üretir. Gerçek projede sabit dizi yerine veritabanından yalnızca yayınlanmış kayıtları getirebilirsiniz.
PHP:
<?php
declare(strict_types=1);
header('Content-Type: application/xml; charset=UTF-8');
$urls = [
[
'loc' => 'https://example.com/',
'lastmod' => '2026-11-01',
],
[
'loc' => 'https://example.com/urun/ornek-urun',
'lastmod' => '2026-11-05',
],
];
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;
$urlset = $dom->createElement('urlset');
$urlset->setAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
$dom->appendChild($urlset);
foreach ($urls as $item) {
$url = $dom->createElement('url');
$loc = $dom->createElement('loc');
$loc->appendChild($dom->createTextNode($item['loc']));
$url->appendChild($loc);
if (!empty($item['lastmod'])) {
$lastmod = $dom->createElement('lastmod');
$lastmod->appendChild($dom->createTextNode($item['lastmod']));
$url->appendChild($lastmod);
}
$urlset->appendChild($url);
}
echo $dom->saveXML();
createTextNode() kullanmak, URL metnini XML düğümü olarak eklemenizi sağlar. URL'nin kendisi de geçerli olmalıdır: yol bileşenlerini uygulamanın URL üreticisiyle doğru kodlayın; tüm tam URL'ye rawurlencode uygulamayın. XML kaçışı URL kodlamasının yerine geçmez. Böylece & gibi XML içinde özel anlam taşıyan karakterleri elle birleştirmeye çalışmazsınız. PHP'nin DOM uzantısı UTF-8 ile çalıştığından, veritabanından gelen metinlerin kodlamasını da kontrol edin.Veritabanından URL seçme
Örneğin içerik tablonuzda
slug, status ve updated_at alanları varsa sorguyu yalnızca yayınlanmış kayıtları döndürecek şekilde sınırlandırın. Alan adını uygulama içinde sabit bir yapılandırmadan alın; istemciden gelen Host başlığıyla sitemap URL'si oluşturmayın.Tarih alanı güvenilir değilse
lastmod göndermemek, yanlış tarih göndermekten daha sağlıklıdır. URL üretirken slug değerinin uygulamanızdaki gerçek route kurallarıyla aynı olduğundan emin olun.| Durum | Yaklaşım |
|---|---|
| Az sayıda URL | DOMDocument ile tek XML oluşturun |
| Büyük URL listesi | XMLWriter ile akış halinde yazın |
| Seyrek değişen içerik | XML'i dosya olarak önceden üretin |
| Sık değişen içerik | Dinamik çıktıyı önbellekleyin veya görev zamanlayıcısıyla yenileyin |
Büyük listelerde bellek ve dosya üretimi
XMLWriter ileri yönde yazabilir; fakat
openMemory() seçerseniz çıktı yine bellekte birikir. Bu yöntem tek başına akış halinde ve sınırsız belleksiz üretim sağlamaz. Gerçek dosya/akış çıkışı için openUri() ve uygun çıktı akışı kullanılır; veritabanı kayıtları da tümüyle bir diziye doldurulmadan partiler hâlinde okunmalıdır.Dosya yolu kullanıcı girdisinden oluşturulmamalıdır. Yeni XML tamamlanıp doğrulanmadan mevcut çalışan haritanın üzerine yarım çıktı sunmayın. Sitemap başına en fazla 50.000 URL ve sıkıştırılmamış 50 MB sınırını aşan listeleri parçalara ayırıp sitemap indeksiyle bildirin.
Uygulama ve kontrol adımları
- Sitemap'e girecek URL'leri belirleyin ve her birinin uygulamadaki canonical adres olduğunu kontrol edin.
- Veritabanı sorgusunda yalnızca yayınlanmış, herkese açık ve erişilebilir kayıtları seçin.
- Her kaydı
urlaltındalocile tam URL olarak yazın. - Yalnızca güvenilir bir içerik tarihi varsa
lastmodekleyin. - Yanıt vermeden önce
Content-Type: application/xml; charset=UTF-8başlığını gönderin. - Çıktıyı XML ayrıştırıcısıyla test edin; ayrıca listedeki örnek URL'lerin beklenen HTTP yanıtını verdiğini doğrulayın.
- Çok büyük çıktılarda sitemap'i parçalara ayırma ve index dosyası kullanma gereksinimini ayrıca değerlendirin.
Sık yapılan hatalar
PHP dosyasında
header() çağrısından önce boşluk, HTML veya hata çıktısı olması içerik türü başlığının gönderilememesine yol açabilir. Bu yüzden dosyanın başında gereksiz çıktı bırakmayın.Diğer yaygın hatalar; göreli URL kullanmak,
& karakterlerini elle ve hatalı biçimde kaçırmak, taslak veya gizli sayfaları listelemek, her istekte pahalı veritabanı sorgusu çalıştırmak ve başarısız URL'leri kontrol etmeden eklemektir. Sitemap keşfe yardımcı olur; tek başına bir sayfanın indeksleneceği garantisini vermez.Sık sorulan sorular
PHP kodu tarayıcıda metin olarak görünüyorsa sitemap çalışır mı?
Hayır. PHP yorumlayıcısının web sunucusunda doğru çalışması gerekir. .php uzantısını .xml olarak değiştirmek PHP'yi çalıştırmaz. Kodun kendisi herkese görünüyorsa önce sunucu PHP işleyicisini düzeltin; yapılandırma sırlarının açığa çıkıp çıkmadığını da inceleyin.
DOMDocument yerine XMLWriter kullanınca XML yapısı değişir mi?
Hayır. İki yaklaşım da aynı
urlset, url, loc ve isteğe bağlı lastmod yapısını üretebilir. Fark, DOMDocument'in belge ağacını bellekte tutması; XMLWriter'ın ise ileri yönde yazabilmesidir.