ایجاد sitemap در MVC 5
0 0

ایجاد sitemap در MVC 5


ایجاد sitemap در MVC 5

در این پست نحوه ایجاد sitemap به صورت پویا با MVC5 را آموزش می دهیم.

چرا sitemap

به طور خلاصه sitemap ها به ایندکس کردن صفحات وب سایت توسط کرالرهای موتورهای جستجو کمک میکنند. میتوان sitemap را به نقشه راهنمای راههای بین شهری برای کرالرها تشبیه کرد. کرالرها از sitemap برای چک کردن درستی لینکهای فهرست شده در پایگاه داده خود استفاده میکنند. همچنین در صورتی که صفحه ای از سایت شما دارای لینک ورودی چه از خود سایت و چه از سایتهای دیگر نباشد sitemap این صفحه را به موتورهای جستجو معرفی میکند همچنین استفاده از sitemap ها مزیت اضافه کردن داده افزونه یا meta data را نیز دارد.

استفاده از sitemap برای وب سایتهای تازه تاسیس شده و یا وب سایتهایی که دارای آپدیتها و صفحات جدید زیاد هستند کمک بسزایی در اضافه شدن سریع صفحات جدید به پایگاه داده ایندکس موتورهای جستجو میکند. نکته ای که در رابطه با sitemap باید به آن توجه داشت این هست که لزوماً تمامی لینکهای موجود در آن توسط موتورهای جستجو ایندکس نمیشوند. به طور مثال اگر لینکها دارای محتوای تکراری باشند و یا کیفیت محتوایی پایینی داشته باشند به پایگاه داده ایندکس اضافه نمیشوند.

برای ایجاد sitemap به صورت پویا مراحل زیر را طی کنید.

ایجاد کلاس ChangeFrequency

ابتدا کلاسی با نام ChangeFrequency ایجاد کنید و سپس این کلاس را از نوع enum تعریف کنید

 

namespace MVCIranganj.Infrastructure
{
    public enum ChangeFrequency
    {
        Always, 
        Hourly, 
        Daily, 
        Weekly, 
        Monthly, 
        Yearly, 
        Never
    }
}

ایچاد کلاس SitemapItem

کلاسی با نام SitemapItem ایجاد کنید و این کلاس باید از ISitemapItem ارث بری کند.

using System;

namespace MVCIranganj.Infrastructure
{
    public class SitemapItem : ISitemapItem
    {
        public SitemapItem(string url, DateTime? lastModified, ChangeFrequency? changeFrequency, float? priority)
        {
            this.url = url;
            this.lastModified = lastModified;
            this.changeFrequency = changeFrequency;
            this.priority = priority;
        }

        private string url;
        private DateTime? lastModified;
        private ChangeFrequency? changeFrequency;
        private float? priority;

        public string Url
        {
            get { return this.url; }
        }

        public DateTime? LastModified
        {
            get { return this.lastModified; }
        }

        public ChangeFrequency? ChangeFrequency
        {
            get { return this.changeFrequency; }
        }

        public float? Priority
        {
            get { return this.priority; }
        }
    }
}

ایچاد کلاس ISitemapItem

کلاس با نام ISitemapItem ایجاد کنید و نوع این کلاس رو باید interface تعریف کنید.

using System;

namespace MVCIranganj.Infrastructure
{
    public interface ISitemapItem
    {
        string Url { get; }
        DateTime? LastModified { get; }
        ChangeFrequency? ChangeFrequency { get; }
        float? Priority { get; }
    }
}

ایجاد کلاس XmlSitemapResult

یک کلاس به نام XmlSitemapResult ایجاد کنید این کلاس نیز باید ActionResult ارث بری کند

using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web.Mvc;
using System.Xml.Linq;
using MVCIranganj.Infrastructure;

namespace MVCIranganj.Infrastructure
{
    public class XmlSitemapResult : ActionResult
    {
        private static readonly XNamespace xmlns = "http://www.sitemaps.org/schemas/sitemap/0.9";
        private IEnumerable<ISitemapItem> _items;

        public XmlSitemapResult(IEnumerable<ISitemapItem> items)
        {
            _items = items;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            string encoding = context.HttpContext.Response.ContentEncoding.WebName;
            XDocument sitemap = new XDocument(new XDeclaration("1.0", encoding, "yes"),
             new XElement(xmlns + "urlset",
                  from item in _items
                  select CreateItemElement(item)
                  )
             );
            context.HttpContext.Response.ContentType = "application/rss+xml";
            context.HttpContext.Response.Flush();
            context.HttpContext.Response.Write(sitemap.Declaration + sitemap.ToString());
        }

        private XElement CreateItemElement(ISitemapItem item)
        {
            XElement itemElement = new XElement(xmlns + "url", new XElement(xmlns + "loc", item.Url.ToLower()));

            if (item.LastModified.HasValue)
                itemElement.Add(new XElement(xmlns + "lastmod", item.LastModified.Value.ToString("yyyy-MM-dd")));

            if (item.ChangeFrequency.HasValue)
                itemElement.Add(new XElement(xmlns + "changefreq", item.ChangeFrequency.Value.ToString().ToLower()));

            if (item.Priority.HasValue)
                itemElement.Add(new XElement(xmlns + "priority", item.Priority.Value.ToString(CultureInfo.InvariantCulture)));

            return itemElement;
        }
    }
}

ایجاد controller

برای ایجاد sitemap باید یک کنترلر ایجاد کنیم.

یک کنترلر به نام sitemap ایجاد کنید و کدهای آن را به شکل زیر تغییر دهید

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MVCIranganj.Infrastructure;
using MVCIranganj.Models;

namespace MVCIranganj.Controllers
{
    public class SitemapController : Controller
    {
        private ApplicationDbContext db = new ApplicationDbContext();

        public XmlSitemapResult Sitemap()
        {
            List<SitemapItem> items = new List<SitemapItem>();

            var posts = db.Posts.Where(c => c.IsPostActive == true);


            DateTime lastModified = System.DateTime.Now;


            items.Add(new SitemapItem("http://iranganj.ir", lastModified, ChangeFrequency.Weekly, 1f));


            items.Add(new SitemapItem("http://iranganj.ir/Home/Index", lastModified, ChangeFrequency.Weekly, 1f));

            items.Add(new SitemapItem("http://iranganj.ir/Home/Contact", lastModified, ChangeFrequency.Weekly, 1f));


            foreach (var item in posts)
            {
                items.Add(new SitemapItem("http://iranganj.ir/post/" + item.PostId + "/" + item.PostName.Replace(" ", "-").ToLower().Replace("c#", "csharp").Replace(".", "-"), item.UpdateDateTime.ToUniversalTime(), ChangeFrequency.Monthly, .3f));
            }

            return new XmlSitemapResult(items);
        }
    }
}

همانطور که به کدهای بالا نگاه کنید لینکهای ثابت وب سایت به صورت دستی به items اضافه شده اند و لینکهای داینامیک برای قسمت پستها از پایگاه داده لود شده و به items اضافه شده.

 

تعیین مسیر دسترسی به فایل sitemap

 معمولا موتورهای جستجو به دنبال این فایل در پوشه root وب سایت میگردند و در حال حاضر دسترسی به sitemap.xml از طریق آدرس

  http://iranganj.ir/sitemap/sitemap

میباشد. باید در جدول routing تغییراتی اعمال کنیم تا دسترسی به sitemap از طریق آدرس

 http:// iranganj.ir /sitemap

و یا

http://iranganj.ir /sitemap.xml

امکان پذیر باشد لذا این مقادیر را به فایل RouteConfig موجود در پوشه App_Start اضافه کنید:

routes.MapRoute("sitemap", "sitemap", new { controller = "Sitemap", action = "Sitemap" });
routes.MapRoute("sitemap.xml", "sitemap.xml", new { controller = "Sitemap", action = "Sitemap" });

همچنین می توانید با استفاده از اتربیوت ها این کار را انجام دهید که در پست های قبلی این مورد را توضیح دادیم.

دانلود

نویسنده حسین فتحی
گروه مطلب MVC
نوع مطلب سورس کد و آموزش
تاریخ انتشار ۲۰ خرداد ۱۳۹۴
منبع ایران گنج
تعداد نظرات ۰
قیمت کاربران VIP
توضیح توجه:
  • زمانی که روی لینک دانلود کلیک می کنید لینک دانلود به مدت 24 ساعت معتبر خواهد بود
  • لینک های دانلود دوره های آموزشی تا پایان دوره قابل دانلود می باشد.
  • برای خارج کردن فایل ها از حالت فشرده از ورژن جدید نرم افزار winrar استفاده کنید.
  • برای خارج کردن فایل ها از حالت فشرده لینک های دانلودی که چندین قسمت می باشند فقط قسمت اول را از حالت فشرده خارج کنید.
  • لطفا توضیحات نوشته شده برای مطالب را با دقت بخوانید.
  • برای نمایش فیلم ها می توانید از نرم افزار هایی مانند Km Player , VLC Player یا Media Player Classic استفاده کنید.

نظر / سوال

Captcha

این صفحه را می‌پسندم