pillinetwork hesabınızla giriş yapın.

Büyük siteler için php ile google sitemap yapımı

Sitemap ya da diğer bir deyişle site haritaları, sitemizin google ve diğer arama motorlarına daha hızlı endekslenmesini sağlayan önemli faktörlerden biri.

Bir site haritası temel olarak sitemizin içindeki sayfaların bir listesini içeren bir tür xml dosyasıdır.

Sitemizin haritasını çıkarmak için, eğer sitemiz küçük veya orta ölçekteyse hazır araçlar kullanabiliriz. Bu araçlar genelde crawling mantığı ile çalışırlar. Fakat örneğin sitemizde en az 200.000 sayfa varsa, bu durumda kullandığımız hazır araçlar site haritası yapımında sadece zaman kaybına sebep olacaktır.

Bir sitemiz olsun ve ismi butunmakaleler.com olsun. Sitemizin 300.000 sayfa/makale'den oluşan bir site olduğunu ve php/mysql üzerinde çalıştığını varsayalım.

Site uri yapısı da şu şekilde olsun.

http://www.butunmakaleler.com/makale.php?id=223

Şimdi sitemiz için php ile kısa yoldan bir sitemap hazırlayacağız.

Fakat öncelikle google sitemap'ın kısıtlamalarını bilmemiz gerekiyor. Bunları kısaca sayarsak,

- Bir sitemap dosyasında maksimum 50.000 url olabilir.
- Bir sitemap dosyası gzip ile maksimum 1 MB, gzip'siz maksimum 10 MB olabilir.

Biraz akıllı bir webmaster bu durumda google sitemap için 45.000 url'den oluşan 7 tane sitemap hazırlamak gerektiğini düşünecektir. Fakat sitemap-index kullanarak tek tek 7 adet sitemap hazırlamaktan kurtulmamız mümkündür.

Sitemap-index bir sitenin sitemap'larının listesini veren xml tabanlı bir dosyadır.

300.000 makale içeren sitemizde, veritabanı tablosunda her makalenin unique bir numarası mevcuttur.

Sitemizin sitemap'ını sadece bir php kullanarak hazırlayacağız.

Dosyamızın ismi sitemap.php olsun ve sitenin ana dizininde bulunsun. Dosyaya sayfa isminde bir get değişkeni atayalım. Script Sayfa değişkeni index değerini aldığında sitemap-index'i, numara aldığında ise sitemap'ı göstersin.

sitemap.php dosyasının içeriği şöyle olacaktır.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?
// Önce mysql bağlantı bilgilerini içeren php dosyamızı include ediyoruz
$mysqlhost="localhost";
$mysqluser="makaleler";
$mysqlpass="12345";
$mysqldatabase="makaleler";
if(! $baglanti=@mysql_connect($mysqlhost, $mysqluser, $mysqlpass)) die("veritabani baglantisi yok.");
mysql_select_db($mysqldatabase);
// İkinci olarak sayfa output'unun hangi formatta olduğunu belirten header komutunu gönderiyoruz. Sayfamız xml formatında olacaktır.
header("Content-Type: text/xml");
// Get metoduyla aldığımız sayfa verisini $sayfa isimli değişkene atıyoruz.
if(! isset($_GET[sayfa])) $sayfa=1; else $sayfa=$_GET[sayfa];
//Tarihi belirtiyoruz. Burada format önemli. Format dışına çıkılmamalı. Eğer veritabanınızda her makalenin giriş tarihi varsa dinamik olarak onu da ekleyebilirsiniz. Burada sabit bir gün kullandım.
$date="2008-10-21";
// Eğer sayfa değişkeni "index" değeri aldıysa output olarak sitemap-index verilecek.
if($sayfa=="index"):
// İlk olarak bütün makale sayısını alıyoruz.
$index_sayi=mysql_num_rows(mysql_query("SELECT `id` FROM `makaleler`"));
// İkinci olarak kaç adet index'te kaç adet sitemap listeleneceğini bulmak için, toplam rakamı sitemap başı url sayısına bölüyoruz. Ben genelde veritabanını yormamak ve hızlı yüklenme için 6000 kullanırım.
$index_sayi=ceil($index_sayi / 6000);
//Google sitemap-index header'larını giriyoruz. Encoding'i dileğinize göre değiştirebilirsiniz.
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
// Ana etiketleri girdikten sonra sitemap'ları döngü ile listeliyoruz.
for($i=0; $i<$index_sayi; $i++){
echo "<sitemap>
<loc>http://www.butunmakaleler.com/sitemap.php?sayfa=".($i+1)."</loc>
<lastmod>$date</lastmod>
</sitemap>\n";
}
// Son olarak sitemap-index sonlandırma etiketini girip index'i bitiriyoruz.
echo "</sitemapindex>";
// Eğer GET ile aldığımız sayfa değişkeni numerik ise bu kodlar çalışacak.
else:
// Sayfa numarasına göre 6000'lik veri alınıyor.
$sorgu=mysql_query("SELECT `id` FROM `makaleler` ORDER BY `id` ASC LIMIT ".(($sayfa-1)*6000).",6000");
// Sitemap ana xml etiketleri giriliyor.
echo "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<urlset xmlns=\"http://www.google.com/schemas/sitemap/0.84\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xsi:schemaLocation=\"http://www.google.com/schemas/sitemap/0.84 http://www.google.com/schemas/sitemap/0.84/sitemap.xsd\">\n";
// Alınan 6000'lik parça döngü ile yazdırılıyor.
while($sonuc=mysql_fetch_assoc($sorgu)):
echo " <url>
<loc>http://www.butunmakaleler.com/makale.php?id=".$sonuc[id]."</loc>
<lastmod>$date</lastmod>
<changefreq>daily</changefreq>
<priority>0.5</priority>
</url>\n";
endwhile;
// Son olarak sitemap'ı sonlandırma etiketini yazdırıp dosyayı kapatıyoruz.
echo '</urlset>';
endif;
?>

sitemap.php dosyasını sitemizin ana dizinine yükledikten sonra. google webmaster tools'u açıp site haritası ekle linkine tıklıyoruz. Çıkan adrese,

http://www.butunmakaleler.com/sitemap.php?sayfa=index

yazdıktan sonra ekle diyoruz.

Sitemap'ımızı hazırladık. Artık google 300.000 sayfanın tamamını bu adresteki veriyi indirerek listeleyebilecek. Ayrıca makale ekledikçe tekrar tekrar site haritası oluşturmak zorunda kalmayacağız, haritamız hep güncel olacak. Ayrıca 7 adet site haritası yazdırıp bunları tek tek yükleme zahmetinden de kurtulmuş olduk.

/* Etiketler: , , , , , , , */
/* feline yazdı. 13 Kasım 2008 15:00. 23 yorum var */

Yorumlar

6000 kayit bir sayfa icin biraz fazla degil mi ? timeout'a dusmesin.

yok birşey olmuyor.
id genelde primary key olduğu için oldukça hızlı.
fakat yine de optimizasyon için daha küçük parçalara da bölünebilir.

Biraz daha hacim olarak büyüyen sitelerde sitemap oluşumunun dinamik yerine cron'a bağlanması ve statik dosya oluşturması sitenin sorun çekmemesi adına daha mantıklı olabilir. Ama genel olarak mantık aynıdır.

Gerçekten yararlı bir bilgi olmuş kullanacağım.

www.nasilbir.com adresine bakarsanız, benzer bir bir kodla hazırlanmış bir sitemap içeriyor. Şuan yaklaşık 90 bin okul, hastane,doktor,öğretmen vb. kurumun değerlendirilmesi yapılıyor.

Yalnız tarih formatına dikkat edilmesi gerek. Eğer ay ve gün 10'dan küçükse 09,08 gibi sıfırla birlikte bir tarih yazdırmanız gerek. 2008-11-4 geçerli bir tarih değildir mesela.

Bir de linklerin önemini aynı yaparsanız google amca kızıyor biraz. Örneğin hepsini 1.0 yapmak Google için en gıcık şey :)

Son olarak kaydedilen dosya formatının xml veya php olması mühim değil.

Bir de düzgün bir sitemap yaparsanız SEO uyumlu okunabilir linklerle uğraşmanıza gerek yok. Google doğrudan sitemap'e bakar ve sitenizi crawl etmez.

http://www.nasilbir.com/sitemap.php

Sitemap oluşturmak arama motorların sitenizi daha hızlı indekslemesinden ziyade crawler'ın sitenizin ulaşamayacağı kısımları da gezebilmesini sağlıyor. Örneğin crawler bildirgeç gibi bir siteye girdiğinde ana sayfayı indeksler. Daha sonra anasayfadan link verilen sayfaları, ve onlardan link verilen sayfaları. Ancak bunun bir limiti vardır, anasayfadan linkleri kullanarak bir miktar derine gittikten sonra vazgeçer. Ancak bildirgeç'in tüm içeriğine linklerin bulunduğu bir sitemap mevcutsa crawler sitedeki tüm yazıları indeksleyebilir.

/* me@sosyomat */

merhaba, kod için teşekkürler bunu url rewrite kullanılmış bir scriptte nasıl kullanabilirim?

Merhaba Sizce buyuk sistemlerde site_map şartmıdır kulanılırsa ne kadar avantaj saglar.

bende uzantısı xml olmak zorunda mı diye merak ediyordum ellerinize sağlık güzel makale olmuş

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
include ("includes/config.php");
header('Content-type: text/xml');
echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
echo "<urlset xmlns=\"http://www.google.com/schemas/sitemap/0.84\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.google.com/schemas/sitemap/0.84 http://www.google.com/schemas/sitemap/0.84/sitemap.xsd\">";
$map_result = mysql_query("SELECT fileid, title FROM files WHERE status = '1'");
while ($map_row = mysql_fetch_array($map_result)) {
$fileId = $map_row['fileid'];
$fileTitle = $map_row['title'];
echo "\n<url>\n<loc>".fileurl($fileId, $fileTitle)."</loc>\n<changefreq>weekly</changefreq>\n<priority>1.0</priority>\n</url>";
}
echo "\n</urlset>";
?>

benim burda kendi kullandıgım bir sitemap var.Gordugunuz gibi ( 1.0 ) önemlilik derecesi hep aynı oluyor ve google kabul etmıyor bu kodu nasıl değiştirerek bunu yapabiliriz yardımcı olabilirmisin ?

/* çet */

herşeye 1.0 önemlilik verirsen google tabiki ciddiye almayacaktır. 0.4 veya 0.5 yeterli. ana sayfana 1.0 verebilirsin.

Merhaba Sizce buyuk sistemlerde site_map şartmıdır kulanılırsa ne kadar avantaj saglar.

Şöyle kısaca açıklıyayım...

googlebot sitene hergün bi kaç kere girip link toplamaya çalışır önce bunları db sine kaydeder ancak direk aramalarda görünecek şekilde ortama salmaz... sonra opladığı linklerin içeriğine falan bakar bazı matematiksel işlemler doğrultusunda arama motorlarında çıkacağın yeri ve sırayı belirler...

sitemap yollarsan googlebot sadece listedeki url leri varmı die kontrol eder. Birnevi sen yol göstermiş olursun.

faydası şu olur google sitenden link toplamaya çalışmaz direk hazır linkleri alır ve analiz eder...

sitemap büyük sistemlerde seo ile yapılırsa çok iyi sonuçlar getirebilir...

Bu SEO sitemap ve botlarla uğraşmak son zamanlarda kurtmasterların yoğun ilgisini çekiyor. kodaman.org' da da örneğini gördüğümüz link sisteminin oluşturulması için yol nedir.

Örneğin: http://www.sitemiz.com?sayfaID=456&baslik=bir-sayfanin-basligi

yerine

http://www.sitemiz.com/bir-sayfanin-basligi şeklinde linkleri değiştirmenin pratik yolu nedir gençler? Bu sadece PHP ile ve Apache üzerinde mi mümkündür? Yoksa IIS üzerinde ve ASP veya ASP.NE ile de yapılabilir mi?

asp ve asp.net ile yapılabilir ben html uzantılısını yaptım. bununla ilgili bir makale yazabilirim. zaman bulursam.

teşekkürler, makaleyi heyecanla bekliyorum.

http://www.yazilimmutfagi.com/MakaleOku.aspx?Makale=Php+ile+siteleriniz+i%C3%A7in+sitemap+olusturun&MakaleKey=6269fe78-8966-4fe2-ba82-2505d0070906
burda da kendi kullanmış olduğum sitemap'i paylaşmıştım....

asp ile html kasmadan 404 hata sayfasına yönlendirme özelliğini yöneterek de özel url kullanılabiliyordu. iis6.0'a kadar durum buydu ama yeni gelen iis7.0 malesef .net'e daha fazla ağırlık verdiği için ben bir türlü başaramadım 404 yönlendirmesini.. hatta vectro'nun verdiği bağlantıda da çok sordum orda bile çözüm bulunamadı. kısacası iis6.0 varsa elinde asp ile 404 yönlendirmesini kullanarak dinamik özel url üretebilirsin.

/* if life="" then call BatsinBuDunya() */

bunu hep merak etmişimdir teşekkürler

Güzel bir uygulama olmuş, peki Url`lerimiz id olarak değilde ; "site.com/Istanbul-haritasi.html" şeklinde veritabanında kayıtlı ise bunu nasıl bu formata dönüştürebiliriz. Etiketler tablosunun içinde alt tablo olarak tag-link tablosu tutuyorum ve orada linkler "id" olarak değilde direk url olarak saklanıyor.Yaklaşık 1milyon veri bulunuyor, bunları nasıl Sitemap`a dökebilirim ? Örnek kodlarım aşağıdadır.Bu kodlarda 30000 url sıralanmıştır.Benim istediğim devamını da sizin verdiğiniz kodlardaki gibi otomatik sayfalaması..

include("inc/includes.php");
header("Content-type: text/xml");
$xml_ciktisi=" \n";
$ktag=mysql_query("select * from etiketler order by rand() LIMIT 0,30000");
while($als=mysql_fetch_array($ktag)){
$tek=$als['etiket'];
$tlink = seo($tek);
$xml_ciktisi .= " http://www.sitem.com/$tlink.izle ";
};
$xml_ciktisi .= " ";
echo $xml_ciktisi ;

/* http://www.crazyssimo.com */

Arkadaşlar özel bir script kullanıyorum ve scriptte linklere seo uygulaması yapılmış durumda.

Örneğin

[domain]/izle-4728-komik-bkm-mutfak-mr-fazil.html

[domain]/izle-[video_id]-[video_title].html

bu şekilde olan linkler için dinamik sitemap nasıl oluşturabilirim.

@gokhanozcan

sitemaps.php dosyasina söyle bir fonksiyon olustur ;


function seoLink ($content)
{ $text = trim ($content); $tr = array("ş","Ş","ı","(",")","'","ü","Ü","ö","Ö","ç","Ç"," ","/","*","?","ş","Ş","ı","ğ","Ğ","İ","ö","Ö","Ç","ç","ü","Ü",'ä','ß'); $eng = array("s","S","i","","","","u","U","o","O","c","C","-","-","-","","s","S","i","g","G","I","o","O","C","c","u","U",'a','ss'); $text = str_replace($tr,$eng,$text); $text = eregi_replace('[^0-9A-Za-z]',"-",$text); $text = preg_replace("@--*@","-",$text); return strtolower($text);
}

ve url 'leri siraladigin döngüyü su sekilde degistir



http://www.domain.de/izle". seoLink($sonuc[id] .'-'. $sonuc[video_title] ) ."-.html
" . $sonuc[tarih] . "
weekly
0.5
\n";

Tabi ben mySql sutununu video_title olarak verdim siz kendi tablonuza göre degistirmeniz gerekiyor...

Benim aklima takilan ufak sey var,

seturl örnekte söyle verilmis;


\n";

fakat bilen bilir wordpress 'in Google Sitemap Generator isimli cok basarili bir plugini var ve onun kodlarini inceledigimde urlset bilgileri asagidaki gibi verilmis



Sormak istedigim sey

xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
xsi:schemaLocation=\"http://www.google.com/schemas/sitemap/0.84

veya

xmlns="http://www.google.com/schemas/sitemap/0.84"
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"

gibi url arasinda nasil bir fark?
Sizce hangisini kullanmaliyiz?
xmlns, xsi nedir ne degildir?

üye olunpillinetwork sitelerine yorum ekleyebilmek ve daha fazlası için, üye olun ya da giriş yapın.

Bu yazıyı rapor et. Kural dışı içeriğe rastladığınızda editörlerimize rapor ederek müdahale edilmesini sağlayabilirsiniz. (Hangi durumlarda rapor edebilirim?)

Bu site

Nokta ve pilli ortak yapımı olan kodaman.org hep birlikte içerik üretip gelirini yazarları ile paylaştığımız kolektif bir kod yazarları blogudur. Siz de katılabilirsiniz.

pilliilan

son yorumlar

arama

pillinetwork