Gereksinimler ve Ön Hazırlık
Dinamik bir site haritası sistemi kurmadan önce çalışma ortamınızın belirli standartları karşıladığından emin olmalısınız. Aşağıdaki araçların ve yapılandırmaların hazır olması, geliştirme sürecini hızlandıracaktır.
- PHP 8.2 veya üzeri: Tip güvenliği (type hinting) ve modern özellikler için gereklidir.
- Veritabanı: MySQL veya MariaDB üzerinde içeriklerinizi tutan bir tablo yapısı.
- PDO (PHP Data Objects): Veritabanı sorgularında SQL injection saldırılarını önlemek için zorunludur.
- Sunucu Yapılandırması: URL yönlendirmeleri için .htaccess veya Nginx yapılandırması.
Site Haritası İçin Veri Modeli Oluşturma
İlk adım olarak, site haritasına eklenecek verileri çekecek bir sınıf yapısı kurmalıyız. Bu sınıf, veritabanı bağlantısını yönetecek ve içerikleri nesne olarak döndürecektir. Veritabanı işlemlerinde her zaman hazır ifadeler (prepared statements) kullanmalıyız.
class SitemapProvider {
private PDO $db;
public function __construct(PDO $db) {
$this->db = $db;
}
public function getPages(): array {
$query = $this->db->query("SELECT slug, updated_at FROM posts WHERE status = 'published'");
return $query->fetchAll(PDO::FETCH_ASSOC);
}
}
Yukarıdaki kod, SitemapProvider sınıfı ile veritabanından sadece yayınlanmış olan içerikleri çeker. Bu yaklaşım, taslak halindeki veya özel sayfaların haritaya sızmasını engeller.
XML Site Haritası Oluşturucu Sınıfı
Verileri aldıktan sonra, bunları XML formatına dönüştürecek bir yapıya ihtiyacımız var. PHP'nin SimpleXMLElement sınıfı, XML dosyalarını programatik olarak oluşturmak için oldukça verimlidir.
class SitemapGenerator {
private SimpleXMLElement $xml;
public function __construct() {
$this->xml = new SimpleXMLElement('');
}
public function addUrl(string $loc, string $lastmod, string $changefreq = 'daily', float $priority = 0.8): void {
$url = $this->xml->addChild('url');
$url->addChild('loc', htmlspecialchars($loc));
$url->addChild('lastmod', $lastmod);
$url->addChild('changefreq', $changefreq);
$url->addChild('priority', (string)$priority);
}
public function render(): string {
return $this->xml->asXML();
}
}
Bu sınıf, XML düğümlerini (node) oluşturur. htmlspecialchars kullanımı, URL içerisindeki özel karakterlerin XML yapısını bozmasını engeller, bu da güvenlik için kritik bir önlemdir.
Dinamik Site Haritasını Birleştirme ve Sunma
Şimdi hazırladığımız iki sınıfı birleştirerek, tarayıcıya XML çıktısı veren bir controller mantığı kuralım. Burada doğru Content-Type başlığını (header) göndermek, arama motorlarının veriyi doğru okuması için şarttır.
// Veritabanı bağlantısı
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
$provider = new SitemapProvider($pdo);
$generator = new SitemapGenerator();
$pages = $provider->getPages();
foreach ($pages as $page) {
$generator->addUrl("https://siteadresi.com/yazi/" . $page['slug'], $page['updated_at']);
}
header('Content-Type: application/xml; charset=utf-8');
echo $generator->render();
Bu kod bloğu, veritabanından gelen verileri döngüye sokar ve her biri için XML düğümü oluşturur. Ardından, tarayıcıya bunun bir XML dosyası olduğunu bildiren başlığı gönderir.
SEO ve Performans İpuçları
Dinamik site haritaları büyüdükçe performans sorunları yaratabilir. Binlerce içeriğiniz varsa, her istekte veritabanına sorgu atmak yerine "Caching" (Önbellekleme) yöntemini kullanmalısınız. Aşağıdaki tablo, farklı yöntemlerin avantaj ve dezavantajlarını özetlemektedir.
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Dinamik (Anlık) | Her zaman güncel veri | Yüksek sunucu yükü |
| Önbellekli (Cache) | Çok hızlı yanıt | Veri gecikmeli güncellenir |
Kritik Güvenlik Uyarısı: Site haritası dosyalarınızda asla veritabanı şifreleri, kullanıcı e-postaları veya hassas kişisel veriler gibi bilgileri yayınlamayın. Sadece herkese açık olan URL'leri listeleyin.
Sıkça Sorulan Sorular
Site haritası dosyası neden 50.000 URL sınırı ile gelir?
Google'ın belirlediği teknik standartlar gereği, bir XML dosyası en fazla 50.000 URL içerebilir ve boyutu 50MB'ı geçmemelidir. Daha fazla içeriğiniz varsa "Sitemap Index" yapısını kullanmalısınız.
Dinamik site haritası SEO'yu nasıl etkiler?
Arama motoru botları, sitenizdeki yeni içerikleri daha hızlı keşfeder. Özellikle haber siteleri veya sık güncellenen bloglar için dinamik yapı olmazsa olmazdır.
PHP ile oluşturulan harita neden tarayıcıda düzgün görünmüyor?
Eğer tarayıcıda sadece metin görüyorsanız, header('Content-Type: application/xml'); komutunun kodun en başında (hiçbir çıktı üretilmeden önce) çalıştığından emin olun.
Önbellekleme için en iyi yöntem nedir?
Küçük ölçekli projelerde file_put_contents ile XML dosyasını belirli aralıklarla (örneğin 1 saatte bir) sunucuda güncellemek en performanslı yöntemdir.
Hata ayıklama (debug) için ne yapmalıyım?
XML dosyanızın geçerliliğini kontrol etmek için "XML Sitemap Validator" gibi çevrimiçi araçları kullanarak oluşturduğunuz çıktının standartlara uygunluğunu test edebilirsiniz.
Büyük Ölçekli Projeler İçin Sitemap Index Yapısı
Sitenizdeki URL sayısı 50.000 sınırını aştığında veya içerik yönetiminiz çok katmanlı hale geldiğinde, tek bir XML dosyası yerine Sitemap Index yapısını kullanmak teknik bir zorunluluktur. Bu yapı, ana bir dizin dosyası üzerinden alt haritaları (örneğin: sitemap-posts.xml, sitemap-categories.xml) arama motorlarına sunmanıza olanak tanır.
Dinamik İndeks Oluşturucu Sınıfı
Aşağıdaki sınıf, mevcut modüler yapınıza entegre edebileceğiniz, alt haritaları listeleyen bir indeks dosyası oluşturur.
class SitemapIndexGenerator {
private $sitemaps = [];
public function addSitemap($url, $lastModified = null) {
$this->sitemaps[] = [
'loc' => $url,
'lastmod' => $lastModified ?: date('Y-m-d')
];
}
public function generate() {
$xml = new SimpleXMLElement('');
foreach ($this->sitemaps as $map) {
$sitemap = $xml->addChild('sitemap');
$sitemap->addChild('loc', $map['loc']);
$sitemap->addChild('lastmod', $map['lastmod']);
}
return $xml->asXML();
}
}
Arama Motorlarını Otomatik Bilgilendirme (Ping Servisi)
Site haritanızı güncellediğinizde, Google ve Bing gibi arama motorlarını "ping" mekanizması ile haberdar etmek, indekslenme hızınızı ciddi oranda artırır. Bu işlem, arama motoru botlarına sitenizin güncellendiğini bildiren basit bir HTTP GET isteğidir.
PHP ile Ping Gönderme Fonksiyonu
Aşağıdaki kod bloğu, haritanız güncellendiğinde arama motorlarına otomatik bildirim gönderir:
function pingSearchEngines($sitemapUrl) {
$engines = [
'https://www.google.com/ping?sitemap=',
'https://www.bing.com/ping?sitemap='
];
$encodedUrl = urlencode($sitemapUrl);
foreach ($engines as $engine) {
$url = $engine . $encodedUrl;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);
}
}
// Kullanım:
// pingSearchEngines('https://siteadiniz.com/sitemap-index.xml');
Performans İçin Veritabanı Optimizasyonu
Dinamik site haritalarında en büyük darboğaz, veritabanından binlerce satır çekilmesidir. Büyük veritabanlarında performans kaybını önlemek için şu stratejileri uygulayın:
- Limit ve Offset Kullanımı: Verileri tek seferde çekmek yerine,
LIMIT 50000kullanarak parçalı sorgular çalıştırın. - İndeksleme: Veritabanındaki
created_atveyaupdated_atsütunlarına mutlakaINDEXekleyin. - Sorgu Önbelleği: Veritabanı sorgusunun sonucunu
file_put_contentsile geçici bir dosyaya yazıp, 1 saat boyunca bu dosyadan servis edin.
İleri İpucu: Eğer sitenizde çok fazla görsel veya video içeriği varsa, standarturlsetyapısına ek olarakimage:imageveyavideo:videonamespace'lerini ekleyerek Google Görseller'de daha fazla görünürlük elde edebilirsiniz.
Sonuç
PHP ile nesne yönelimli yapıda dinamik bir site haritası oluşturmak, sitenizin arama motorları tarafından daha profesyonel ve düzenli taranmasını sağlar. Bu rehberde öğrendiğiniz modüler yapı sayesinde, ileride yeni içerik tiplerini (kategoriler, etiketler, kullanıcı sayfaları) kolaylıkla sisteme entegre edebilirsiniz.
Bir sonraki adım olarak, çok büyük veritabanları için "Sitemap Index" dosyası oluşturmayı ve bu dosyayı Google Search Console üzerinden otomatik olarak ping'lemeyi (bildirmeyi) araştırmanızı öneririm. Kodunuzun her zaman güncel kalması ve güvenlik açıklarına karşı düzenli test edilmesi, SEO başarınızın anahtarıdır.
Sorumluluk Reddi: Bu makaledeki kod örnekleri genel eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce veritabanı bağlantı bilgilerinizin güvenliğini sağlayın ve hata ayıklama modlarını kapatın.


Yorumlar (0)
Yorum Yaz