Php ve Mysql ile dinamik sitemap sayfalari hazirlamak

Genelde Hazir sistemler icin eklentiler yada moduller bulunur bu tarz uygulamalar icin. Gunumuzde artik sitemap uygulamasi olmayan site neredeyse cok az, ve olmasi gereken bir sey haline geldi. En buyuk sebeplerinden biriside arama motorlarinin sitenizin iceriginden daha cabuk ve hizli haberdar olabilmesidir.. Php ve mysql kullanan sistemler icin eger iceriginiz cok fazla degilse sitemap generator sitelerini kullanarak sitemap olusturabilirsiniz, ancak devamli guncellenen ve artik site iceriginizdeki sayfalar 50-100 bin’i gecmeye basladiginda sitemap generator siteleri artik size yardim edemeyecektir. cunku cogu belli bir limite kadar izin veriyor, daha fazlasi icin ucret istiyorlar. Ancak basit bir kac uygulama yazarak bunu hem otomatik, hemde basite indirgeyerek google ve dengi arama motorlari icin sitemizi daha cazip hale getirebiliriz..

Baslangic olarak sisteminizin php ve mysql ile hazirlanmis olmasi ve kayitlari mysql veri tabaninda tutmaniz gerek, anlatacagim uygulama bunun uzerine gelistirilmistir..

Bu makeledeki anlatim, oncelikle yapacaklarimi anlatarak devam edip, en sonda da sitemap uygulamasinin butun kodlarini paylasmamla son bulacaktir. Bu sebeple dikkatlice okumanizi tavsiye ederim, sorunsuz bir sitemap olusturabilmeniz ve kendi sisteminizin, veritabaninizin yapisina uygun hale getirebilmeniz icin bu cok onemlidir.

Kisa bir edebiyat ve uyaridan sonra baslayalim arkadaslar :)

Baslarken sitemapin nasil kullanilacaginida yazayimda, anlatim yaparken akliniz karismasin: sayfa= isminde bir degiskenimiz olacak, buna index olarak istek yapildiginda belirledigimiz sayida icerigi sayfalayacak ve kac tane sitemap oldugunu listeleyecek. Sonrasinda sayfa= degiskenine rakam girildiginde o rakama ait db içerik listesini listeleyecektir. Bu kadar.

Kullanimi: Siteniz.com/sitemap.php?sayfa=index (bu sekilde google webmaster tools dan gonderdiginizde google otomatik icerisindeki butun listelenmis sitemap linklerini sitemap olarak gorecek ve listeleyecektir.)
ornek sitemap: Siteniz.com/sitemap.php?sayfa=1

oncelikle sitenizin root dizininde (yani ana kok dizininde – dosyalarin oldugu yer) sitemap.php seklinde bir dosya olusturup bunu acin (duzenleyin).

Oncelikle bize cok yardimci olacak olan get fonksiyonu icin degisken yaratip, hemen altindan veritabani baglantisini yapiyoruz:

$sayfa=$_GET[sayfa];
$sayfabasilink = "10000"; /
$conn
= mysql_connect("localhost", "DB-Kullanici-ADI", "Kullanici-ADI-Sifre");
if (!
$conn) {
    echo "DB ye baglanamadi.";
    exit;
}
if (!mysql_select_db("Veritabanai-DB-ADI")) {
    echo "DB secilmedi.";
    exit;
}
mysql_query ("SET NAMES 'utf8' "); // buna gerekde yok aslinda, cunku baslik kullanmayacagiz.

DB baglantisindan hemen sonra dosyanin xml ye uygun oldugunu belirtmek icin header aciklamasi giriyoruz:

echo "<?xml version='1.0' encoding='UTF-8'?>";

Bu adimdan sonra if degiskeni atayarak sayfa= get metodu ile gelen bilgi index ile ayni ise oncelikle icerik kayit sayisini aliyoruz ve kac tane sitemap olusturulmus icerige gore onu listeliyoruz.

if($sayfa=="index"):  // [1]

$index_sayi=mysql_num_rows(mysql_query("SELECT `id` FROM `KAYITLARIN TUTULDUGU DB ISMI`")); // [2]

$index_sayi=ceil($index_sayi / $sayfabasilink); // [3]

echo "<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";  // [4]

for($i=0; $i<$index_sayi; $i++){  // [5]
echo "<sitemap>
      <loc>http://www.SITENIZ.com/sitemap.php?sayfa=".($i+1)."</loc>
   </sitemap>\n";
}

echo "</sitemapindex>";  // [4]

else:  // [6]

Yukairdaki kodlarda numara ile belirttigim kisimlari daha iyi anlayabilmeniz icin buradan yaziyorum:

[1] Get methodu ile gelen sayfa degiskenindeki deger index ise db deki kayit sayisini belirledigimiz sayiya gore bolup kac sitemap olusturulacak onu listeliyoruz.
[2] Kayitlarin tutuldugu tabloya baglanti yapiyoruz (kayit sayisini almak icin)
[3] 2. kisimda baglandigimiz tabloda ne kadar kayit var ise kendi belirledigimiz sayiya boluyoruz ve degiskene atiyoruz. bu sayiyi en ustte kendimiz belirliyoruz $sayfabasilink degiskeni ile.
[4] sitemapindex tag’i ile sitemap okuyucu botlara bu liste icerisindeki linklerin her birinin ayri bir sitemap oldugunu belirtiyoruz.
[5] Belirlededigimiz sayiya gore ne kadar sitemap olusturulabiliyorsa burada hepsini for fonksiyonu ile listeliyoruz.
[6] Else ile sayfa= degiskeninin index olmadigi durumlarda buradan sonraki kodlarin calistirilacagi anlamina gelir. yani artik sitemap linklerini listeleme zamani geldi :)

echo "<urlset xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'; xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>";	

$kuaza_Database = "select * from KAYITLAR ORDER by id ASC LIMIT ".(($sayfa-1)*$sayfabasilink).",$sayfabasilink";

$result = mysql_query($kuaza_Database);
if (!$result) {
    echo "Could not successfully run query ($sql) from DB: " . mysql_error();
    exit;
}
if (mysql_num_rows($result) == 0) {
    echo "No rows found, nothing to print so am exiting";
    exit;
}
while ($row = mysql_fetch_assoc($result)) {

$date = date("Y-m-d",$row['date']);
$konu_IDsi = $row['id'];
?>
	<url>
		<loc>http://www.SITENIZ.com/index.php?id=<?php echo $konu_IDsi; ?></loc>
		<lastmod><?php echo $date; ?></lastmod>
		<changefreq>monthly</changefreq>
		<priority>0.2</priority>
	</url>
<?php
}
mysql_free_result($result);
echo "</urlset>";
endif;
?>

Bu kisim sizin icin cok onemli, cunku buradaki listeyi kendi url yapiniza ve kayitlarin tarih durumuna gire listelemeniz gerek. Bu cogu sistemde degisken oldugu icin standar’i ben url rewrite uygulanmamis sekilde yani seosuz verecegim. Siz kendinize gore gelistirebilirsiniz.

NOT: Tarif formati bu sekilde olmali: 2010-11-30 aksi halde google tarih sorunu var deyip sitemaplerinizi kabul etmeyecektir..

ilk kisimdaki echo ile sitemap linkleri icin baslangic kismi olan urlset tagini aciyoruz. Ardindan kayitlarin bulundugu databaseye baglaniyoruz ve while ile tek tek listeliyoruz, ilk kisimda belirttigimiz sayi kadar.

Sizin icin onemli olan 2. kisim burasidir:

$date = date("Y-m-d",$row['date']);
$konu_IDsi = $row['id'];

Kayitlarin tarih formati farkli sekilde dbye eklenmis ise, ilk kisimdaki date degiskenini ona gore duzenlemeniz gerekli, aksi halde hata alabilirsiniz. Eger tarih kullanmiyorsaniz asagidaki kismi kaldirmaniz gerek:

<lastmod><?php echo $date; ?></lastmod>

Hemen altindaki kisim ise konu_IDsi olan bolum, kayitlarin DB sini gostermektedir, Siz sayfalarinizi nasil gosteriyorsaniz burayi ona gore duzenlemeniz gerekli. Ornegin basligi da cekerek seo url fonksiyonu ile rewrite ozelligi kazandirarak link verebilirsiniz. Seo linkler icin burayi kontrol edebilirsiniz. Link yapinizi bilmedigim icin sadece id ve tarih formati icin gerekli olan kisimlari ekledim. Eger kayitlar icin tuttugunuz tabloda her kaydin baslik icin kullandiginiz ismi title yada baslik ise asagidaki sekilde basligida alabilirsiniz:

$date = date("Y-m-d / H:i",$row['date']);
$konu_IDsi = $row['id'];
$konu-basligi = $row['title'];

Bu sekilde diger kisimlarida alabilirsiniz, size kalmis. eger video siteniz varsa, bunlar yeterli olmayacaktir, sitemap icin daha fazla bilgi gerekecektir, bu sebeple artirmak sizin elinizde.

Herzaman mutlaka unutmamaniz gereken bir seyi, guvenligi asla elden birakmayin, sitemap icin ufak capda hatalari onelemek icin sayfa degiskeninin bos gelip gelmedigini kontrol ettirebiliriz, boylece dbye baglanmaya calismaz, ve uzun uzadiya sunucuyu yormaz.

Bunun icin bir cok uygulamamda kullandigim asagidaki kodlari tavsiye ederim:

if (!isset($_GET['sayfa']) || empty($_GET['sayfa']))
{
die('Yok Boyle Bisey ya..');

} else {
// baglanti ve diger kodlar
}

Bunun dosyamiza uyarlanmis ve tam kod listemiz icin asagidaki kodlari kontrol edebilirsiniz. Tumuyle veriyorum artik:

<?php
if (!isset($_GET['sayfa']) || empty($_GET['sayfa']))
{
die('Yok Boyle Bisey ya..');

} else { 

$sayfa=$_GET[sayfa];
$sayfabasilink = "10000";

$conn
= mysql_connect("localhost", "DB-Kullanici-ADI", "Kullanici-ADI-Sifre");
if (!
$conn) {
    echo "DB ye baglanamadi.";
    exit;
}
if (!mysql_select_db("Veritabanai-DB-ADI")) {
    echo "DB secilmedi.";
    exit;
}
mysql_query ("SET NAMES 'utf8' "); // buna gerekde yok aslinda, cunku baslik kullanmayacagiz.

echo "<?xml version='1.0' encoding='UTF-8'?>";

if($sayfa=="index"):

$index_sayi=mysql_num_rows(mysql_query("SELECT `id` FROM `tum_videolar`"));

$index_sayi=ceil($index_sayi / $sayfabasilink);

echo "<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";

for($i=0; $i<$index_sayi; $i++){
echo "<sitemap>
      <loc>http://www.SITENIZ.com/sitemap.php?sayfa=".($i+1)."</loc>
   </sitemap>\n";
}

echo "</sitemapindex>";

else:

echo "<urlset xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'; xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>";	

$kuaza_Database = "select * from KAYITLAR ORDER by id ASC LIMIT ".(($sayfa-1)*$sayfabasilink).",$sayfabasilink";

$result = mysql_query($kuaza_Database);
if (!$result) {
    echo "Could not successfully run query ($sql) from DB: " . mysql_error();
    exit;
}
if (mysql_num_rows($result) == 0) {
    echo "No rows found, nothing to print so am exiting";
    exit;
}
while ($row = mysql_fetch_assoc($result)) {

$date = date("Y-m-d / H:i",$row['date']);

$konu_IDsi = $row['id'];
?>
	<url>
		<loc>http://www.SITENIZ.com/index.php?id=<?php echo $konu_IDsi; ?></loc>
		<lastmod><?php echo $date; ?></lastmod>
		<changefreq>monthly</changefreq>
		<priority>0.2</priority>
	</url>
<?php
}
mysql_free_result($result);
echo "</urlset>";
endif;
}
?>

Kodlarin icerisindeki bazi kisimlari kendinize gore ayarlamayi unutmayin. Bu yazida anlamadiginiz yer olursa yorum olarak yazin arkadaslar, yardimci olmaya calisacagim.

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz

This site uses Akismet to reduce spam. Learn how your comment data is processed.