Code tạo sitemap để đăng ký Index với Google, Yahoo, Bing ... bằng asp.net


Sitemap là gì ? Sitemap tạm dịch là sơ đồ Web thực tế là một danh sách liệt kê các tài nguyên trên trang Web giúp người dùng thường và bọ tìm kiếm xác định nhanh cấu trúc cần đánh chỉ số. Trong bài này mình sẽ hướng dẫn cụ thể cách tạo sitemap cho website của bạn. Nếu website của bạn dùng các mã nguồn mở như wordpress, prestashop, joomla … thì việc tạo sitemap là hết sức đơn giản vì đã có những plugin or module giúp bạn tạo sitemap rất dễ dàng. Việc tạo sitemap cũng làm một phần trong việc tối ưu hóa seo onpage.


Các bạn có thể xem hình ảnh sau khi đăng ký thành công sitemap lên google :

demo kết quả index google sitemap

 

Bắt đầu tạo sitemap cho trang web:

Vì trong hệ thống một website thì có rất nhiều đường link vì thế chúng ta không nên tạo 1 sitemap như vậy sẽ rất nặng. Hướng giải quyết như sau : xem ví dụ http://www.hoclaptrinhweb.com/SiteMap/GAllSiteMap.ashx

code all sitemap

Đoạn code ở trên áp dụng cho với website có 1000 link thì nên chia thia 2 sitemap con. Nếu số lượng lớn hơn hoặc khác thì ta có thể phân chia ra thành nhiều sitemap con với pagesize tùy ý

Cấu trúc các sitemap con như sau : xem ví dụ : http://www.hoclaptrinhweb.com/sitemap/GSiteMap.ashx?pageindex=1

code sitemap page

Ở trên đã giới thiệu qua về khái niệm cũng như về demo bây giờ chúng ta bắt đầu áp dụng code nào .

Tạo file GAllSiteMap.ashx đây là file tạo sitemap cha với nội dung như sau :

Bước 1 : Tính tổng trang trên website

Bước 2 : Tính số sitemap con cần tạo. Với mỗi sitemap con là chứa 500 link

Đoạn code quan trọng để chạy

 

// Tính tổng số trang trong hệ thống website
// Với pagesize = 500
var n = vnnNewsBll.GetAllNewsRowCount("", -1, 1, "", "", "");
if (n > 0)
{
    var nSumOfPage = (n - 1) / pagesize + 1;
    for (var i = 0; i < nSumOfPage; i++)
        WriteTag("", "", "", UrlRoot + "/sitemap/GSiteMap.ashx?pageindex=" + (i + 1) + (PageSize != 500 ? "&pagesize=" + pagesize : ""), writer);
}

 

Còn đây là code đầy đủ :

<%@ WebHandler Language="C#" Class="GAllSiteMap" %>
 
using System.Web;
using HocLapTrinhWeb.BLL;
using System.Xml;
 
 
public class GAllSiteMap : IHttpHandler
{
 
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/xml";
        context.Response.Charset = "utf-8";
        GenerateXML(context.Response.OutputStream, PageSize);
        context.Response.End();
    }
 
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
 
    public string UrlRoot
    {
        get
        {
            return (HttpContext.Current.Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Host + ((HttpContext.Current.Request.Url.Port == 80) ? "" : (":" + HttpContext.Current.Request.Url.Port)) + ((HttpContext.Current.Request.ApplicationPath == "/") ? "" : HttpContext.Current.Request.ApplicationPath));
        }
    }
 
    private int PageSize
    {
        get
        {
            if (string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["pagesize"]) == false)
            {
                try
                {
                    return int.Parse(HttpContext.Current.Request.QueryString["pagesize"]);
                }
                catch
                {
                    return 500;
                }
            }
            return 500;
        }
    }
 
    public void GenerateXML(System.IO.Stream stream, int pagesize)
    {
        var settings = new XmlWriterSettings {Indent = true};
        using (var writer = XmlWriter.Create(stream, settings))
        {
            writer.WriteStartDocument();
            writer.WriteStartElement("sitemapindex", "http://www.google.com/schemas/sitemap/0.84");
            var con = new HocLapTrinhWeb.DAL.Connection();
            con.CreateConnection(Global.cs_sqlserver, Global.Key, Global.ValidKey);
            var vnnNewsBll = new vnn_NewsBLL(con);
            //Tính tổng số page để tạo số sitemap con
            var n = vnnNewsBll.GetAllNewsRowCount("",-1, 1,"", "", "");
            if (n > 0)
            {
                var nSumOfPage = (n - 1) / pagesize + 1;
                for (var i = 0; i < nSumOfPage; i++)
                {
                    WriteTag("", "", "", UrlRoot + "/sitemap/GSiteMap.ashx?pageindex=" + (i + 1) + (PageSize != 500 ? "&pagesize=" + pagesize : ""), writer);
                }
            }
            writer.WriteEndElement();
            writer.WriteEndDocument();
        }
    }
 
    private void WriteTag(string priority, string freq, string dateUpdate, string navigation, XmlWriter myWriter)
    {
        myWriter.WriteStartElement("sitemap");
        myWriter.WriteStartElement("loc");
        myWriter.WriteValue(navigation);
        myWriter.WriteEndElement();
 
        if (dateUpdate != "")
        {
            myWriter.WriteStartElement("lastmod");
            myWriter.WriteValue(dateUpdate);
            myWriter.WriteEndElement();
        }
        if (freq != "")
        {
            myWriter.WriteStartElement("changefreq");
            myWriter.WriteValue(freq);
            myWriter.WriteEndElement();
        }
        if (priority != "")
        {
            myWriter.WriteStartElement("priority");
            myWriter.WriteValue(priority);
            myWriter.WriteEndElement();
        }
        myWriter.WriteEndElement();
    }
 
}

Bây giờ tiếp tục với tạo sitemap con. Ta tạo file GSiteMap.ashx : Ở trang này thì chúng ta chỉ việc dựa vào pageindex và pagesize để lấy ra những trang tương ứng. Ví dụ : pageindex = 1 thì ta lấy số trang là từ 0 -> 500. Còn pageindex = 2 thì ta lấy số trang từ 500 -> 1000

 

<%@ WebHandler Language="C#" Class="GSiteMap" %>
 
using System.Web;
using HocLapTrinhWeb.BLL;
using System.Xml;
 
public class GSiteMap : IHttpHandler
{
 
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/xml";
        context.Response.Charset = "utf-8";
        GenerateXML(context.Response.OutputStream, PageIndex, PageSize);
        context.Response.End();
    }
 
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
 
    #region Method
 
    public string UrlRoot
    {
        get
        {
            return (HttpContext.Current.Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Host + ((HttpContext.Current.Request.Url.Port == 80) ? "" : (":" + HttpContext.Current.Request.Url.Port)) + ((HttpContext.Current.Request.ApplicationPath == "/") ? "" : HttpContext.Current.Request.ApplicationPath));
        }
    }
 
    private int PageSize
    {
        get
        {
            if (string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["pagesize"]) == false)
            {
                try
                {
                    return int.Parse(HttpContext.Current.Request.QueryString["pagesize"]);
                }
                catch
                {
                    return 500;
                }
            }
            return 500;
        }
    }
 
    private int PageIndex
    {
        get
        {
            if (string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["pageindex"]) == false)
            {
                try
                {
                    return int.Parse(HttpContext.Current.Request.QueryString["pageindex"]);
                }
                catch
                {
                    return 1;
                }
            }
            return 1;
        }
    }
 
    public void GenerateXML(System.IO.Stream stream, int pageindex, int pagesize)
    {
        var settings = new XmlWriterSettings {Indent = true};
 
        using (var writer = XmlWriter.Create(stream, settings))
        {
            writer.WriteStartDocument();
            writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9");
 
            var con = new HocLapTrinhWeb.DAL.Connection();
            con.CreateConnection(Global.cs_sqlserver, Global.Key, Global.ValidKey);
            var vnnNewsBll = new vnn_NewsBLL(con);
            //Lấy url tin phân trang vào sitemap
            var dt = vnnNewsBll.GetAllNewsForSiteMap("UpdatedDate,NewsTypeName,Title,NewsID", (pageindex - 1) * pagesize, pagesize, -1, 1, "", "");
 
            if (dt != null && dt.Count > 0)
            {
                foreach (var t in dt)
                {
                    WriteTag("0.5", "", t.UpdatedDate.ToString("yyyy-MM-dd"), UrlRoot + "/" + XuLyChuoi.ConvertToUnSign(t.NewsTypeName) + "/" + XuLyChuoi.ConvertToUnSign(t.Title) + "-hltw" + t.NewsID + ".aspx", writer);
                }
            }
 
            writer.WriteEndElement();
            writer.WriteEndDocument();
        }
    }
 
    /// 
    ///
    /// 
    ///Độ ưu tiên của url (0 -> 1). Gợi ý nhưng link menu thì đặt là 1, bình thường thi đặt là 0.5
    ///
    ///
    ///
    ///
    private  void WriteTag(string priority, string freq, string dateUpdate, string navigation, XmlWriter myWriter)
    {
        myWriter.WriteStartElement("url");
        myWriter.WriteStartElement("loc");
        myWriter.WriteValue(navigation);
        myWriter.WriteEndElement();
 
        if (dateUpdate != "")
        {
            myWriter.WriteStartElement("lastmod");
            myWriter.WriteValue(dateUpdate);
            myWriter.WriteEndElement();
        }
        if (freq != "")
        {
            myWriter.WriteStartElement("changefreq");
            myWriter.WriteValue(freq);
            myWriter.WriteEndElement();
        }
        if (priority != "")
        {
            myWriter.WriteStartElement("priority");
            myWriter.WriteValue(priority);
            myWriter.WriteEndElement();
        }
        myWriter.WriteEndElement();
    }
    #endregion
 
}

Vậy là hoàn thành xong code rồi.
Tóm tắt lại nội dung chính cần quan trọng các bạn chứ ý PageSize, và PageIndex

Đăng ký sitemap lên google master tool

Đăng ký sitemap lên google master tool

Chia sẽ bài viết :