Mehmet

WFN Üye
Konular
1,204
Mesajlar
1,205
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
PHP ile sitemap oluşturmak için indekslenebilir URL'leri XML yapısında üretip örneğin /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.

DurumYaklaşım
Az sayıda URLDOMDocument ile tek XML oluşturun
Büyük URL listesiXMLWriter ile akış halinde yazın
Seyrek değişen içerikXML'i dosya olarak önceden üretin
Sık değişen içerikDinamik çı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ı​


  1. Sitemap'e girecek URL'leri belirleyin ve her birinin uygulamadaki canonical adres olduğunu kontrol edin.
  2. Veritabanı sorgusunda yalnızca yayınlanmış, herkese açık ve erişilebilir kayıtları seçin.
  3. Her kaydı url altında loc ile tam URL olarak yazın.
  4. Yalnızca güvenilir bir içerik tarihi varsa lastmod ekleyin.
  5. Yanıt vermeden önce Content-Type: application/xml; charset=UTF-8 başlığını gönderin.
  6. Çı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.
  7. Ç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.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic