Makale Özeti

Bu makalemde sizlere Site Map sisteminden söz edeceğim. Site Map, Türkçe karşılığı Site Haritası anlamına gelmektedir. Sitedeki tüm linklerin tek bir sayfa altında toplanması olarak kabul edebiliriz. Arama motorlarının sitenizi daha hızlı ve doğru indekslemesini sağlamaktadır.

Makale

Bu makalemde sizlere Site Map sisteminden söz edeceğim. Site Map, Türkçe karşılığı Site Haritası anlamına gelmektedir. Sitedeki tüm linklerin tek bir sayfa altında toplanması olarak kabul edebiliriz. Arama motorlarının sitenizi daha hızlı ve doğru indekslemesini sağlamaktadır.

Makaleyi yazmadan önce bir örnek oluşturdum, Google’a bu haritayı ilettim rekor bir hız (29 Dk) ile hazırladığım sitemap’e ulaşıldı ve indeksleme işlemi başlatıldı.

Bizde dinamik bir site haritası oluşturacağız. Öncelikle projemizde sitemap.aspx isminde bir sayfa oluşturalım ve html içeriğini aşağıdaki gibi düzenleyelim. 


<%
@ Page EnableViewState="false" Language="C#" CodeFile="sitemap.aspx.cs" Inherits="sitemap" %>
<%@ OutputCache Duration="300" VaryByParam="none" %>

Daha sonra sayfanın Page_Load olayında kodlarımızı yazmaya başlayalım. 

 
//Sayfanın içeriğini temizliyoruz...
Response.Clear();
//Sayfanın xml formatında olduğunu belirliyoruz...
Response.ContentType = "text/xml";
//XML formatını oluşturmak için bir XmlTextWriter tanımlıyoruz ve
//Encoding'ini UTF8 olarak ayarlıyoruz...
XmlTextWriter objX = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
//Bu kısımda sırayla elementlerimizi oluşturuyoruz...
//urlset, url, loc, lastmod vs... gibi tanımlar
//bir standart tüm site map dosyalarında bu şekilde tanımlanırlar...
//Kaynak : http://www.sitemaps.org/protocol.php
objX.WriteStartDocument();
objX.WriteStartElement("urlset");
//Site Map standartlarını belirliyoruz...
objX.WriteAttributeString("xmlns", http://www.sitemaps.org/schemas/sitemap/0.9);
objX.WriteAttributeString("xmlns:xsi", http://www.w3.org/2001/XMLSchema-instance);
objX.WriteAttributeString("xsi:schemaLocation", "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/siteindex.xsd");
//Sitenin sabit sayfalarını static olarak ekliyoruz...
objX.WriteStartElement("url");
//loc = Sayfa Adresi
objX.WriteElementString("loc", http://www.gokhanbagci.info/default.aspx);
//lastmod = En Son Değiştirilme tarihi
//default.aspx Ana Sayfamız olduğu için her gün güncellendiğini varsayıyoruz
//çünkü bu tarihler arama motorlarının sitenizin güncel olup olmadığı bilgisine karar veriyorlar...
objX.WriteElementString("lastmod", DateTime.Now.ToString("yyyy-MM-dd"));
//changefreq = Sayfanın ne kadar süre içerisinde oluşturulduğunu belirliyor...
//monthly, weekly, daily ve hourly seçenekleri mevcut...
//Şöyle bir mantığı var, daily aynı gün içinde eklendiğini belirliyor.
//Arama motorlarıda o sayfaya ona göre önem veriyor.
//Burada tabi o zaman hepsini daily yaparsak daha önem kazanır diye düşünmeyelim
//Çünkü bu robotlar akıllı şeyler :) Tarihe göre ve daha önceki indekslere göre karşılaştırma yapıyorlar...
objX.WriteElementString("changefreq", "daily");
//priority = Sayfanın sitedeki önemini belirliyor...
//Şöyle ki, örneğin Ana Sayfa için priority değerini 1 olarak tanımladık...
//Ama biraz sonra aşağıda Haberleri dinamik olarak eklerken sayfanın değerini 0.1 olarak belirleyeceğiz...
//Yani alt sayfaların değerlerini daha düşük, ana sayfaların değerlerini daha yüksek belirleyeceğiz...
objX.WriteElementString("priority", "1");
objX.WriteEndElement();
objX.WriteStartElement("url");
objX.WriteElementString("loc", http://www.gokhanbagci.info/yazilar.aspx);
objX.WriteElementString("lastmod", DateTime.Now.ToString("yyyy-MM-dd"));
objX.WriteElementString("priority", "1");
objX.WriteElementString("changefreq", "daily");
objX.WriteEndElement();
//Bu kısımda ben access veritabanı kullanmıştım ama aynı şekilde SQL Server, MySQL, Oracle vs..
//diğer veritabanlarınıda kullanabilirsiniz...
OleDbConnection objConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("~/App_Data/gb.mdb"));
objConnection.Open();
//Bu kısımda blog örneği yapıyorum, Bloglardaki yazılarla ilgili...
//Siz makale, haber vs.. bu konularlada bu sistemi kullanabilirsiniz.
string sql = "SELECT YaziID, KTarih FROM yazilar ORDER BY YaziID DESC";
OleDbCommand objCommand = new OleDbCommand(sql, objConnection);
OleDbDataReader objReader = objCommand.ExecuteReader();
//Dönen verileri bir döngüye sokup ayrı ayrı elementler oluşturacağız...
while (objReader.Read())
{
     objX.WriteStartElement("url");
     //Veritabanındaki değere göre linkimizi oluşturuyoruz...
     //Ör : http://www.gokhanbagci.info/yazi-detay.aspx?YaziID=1
     objX.WriteElementString("loc", "http://www.gokhanbagci.info/yazi-detay.aspx?YaziID=" + objReader.GetInt32(0).ToString());
     //Oluşturulma tarihini belirliyoruz...
     objX.WriteElementString("lastmod", objReader.GetDateTime(1).ToString("yyyy-MM-dd"));
     //Bu kısımda eklediğimiz tarihle o günkü tarih arasındaki farkı bulup daily, weekly, monthy değerlerini buşuyoruz
     //Eklediğimiz gün bugüne eşit olduğu için daily olarak belirliyoruz...
     if (objReader.GetDateTime(1).ToShortDateString() == DateTime.Now.ToShortDateString())
     {
           //İpucu:Bugün eklenen sayfaların önemini yüksek tutuyoruz!
           objX.WriteElementString("priority", "1");
           objX.WriteElementString("changefreq", "daily");
     }
     else 
     {
           //Bu kısımda iki tarih arasındaki farkı hesaplıyoruz...
           int fark = TarihFark(objReader.GetDateTime(1), DateTime.Now);
           //Eğer fark 1 ile 7 arasında ise sayfanın weekly olduğunu belirliyoruz...
           if ( (fark > 1) && (fark <= 7) )
           {
               //İpucu:Haftalık sayfalara 0.5 değerini ekliyoruz...
               objX.WriteElementString("priority", "0.5");
               objX.WriteElementString("changefreq", "weekly");
           }
           //Eğer 7'den büyükse monthly olduğunu belirliyoruz...
           else if (fark > 7)
           {
               //İpucu:Aylık sayfalarada daha önemsiz olduğunu 0.1 olarak belirtiyoruz
               //Bu değerler size kalmış 0.1 yerine 0.2'de kullanabilirsiniz...
               //Ama ne kadar düşük kullanırsanız robot o kadar daha mantıklı indeksleme yapacaktır...
               objX.WriteElementString("priority", "0.1");
               objX.WriteElementString("changefreq", "monthly");
           }
      }
      objX.WriteEndElement();
}
objReader.Close();
objConnection.Close();
objX.WriteEndElement();
objX.WriteEndDocument();
objX.Flush();
objX.Close();
Response.End();
 

 İki Tarih arasındaki farkı aldığımız methodumuz:

 
public int TarihFark(DateTime tr1, DateTime tr2)
{
    TimeSpan Sonuc;
    Sonuc = (tr2 - tr1);
    return (Sonuc.Days);
}
 

 Örnek Site Map dosyası : http://www.gokhanbagci.info/sitemap.aspx

 Başka bir makalemde görüşmek dileğiyle…

 Gökhan BAĞCI
Microsoft Certified Professional