ایجاد 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 استفاده کنید.
خرید VIP
امکان خرید از درگاه های بانکی و حساب مجازی

برای دانلود بعد از خرید به همین صفحه برگردید تا لینک های دانلود نمایش داده شود

نظر / سوال

Captcha
نظرات کاربران

  • صالحی

    با سلام و تشکر از آموزش خوبتون می خواستم بدونم برای صفحاتی که از کوئری استرینگ استفاده شده به عنوان دریافت پارامتر و خواندن اطلاعات از بانک براساس انها چطور باید در sitemap استفاده شود و به آیتم ها اضافه شود با تشکر

    پاسخ
    • حسین فتحی

      سلام

      منظورتون دقیقا چیه؟

      شما در صورتی که به صورت دستی url مشخص کنید در همون قسمت اول این کار رو انجام بدید و مابقی را از دیتابیس می تونید بخونید

      منظورتون از کوئری استرینگ برای جستجو هستش نیازی به sitemap نداره ولی اگر از کوئری استرینگ به صورت ثابت استفاده می کنید باز می تونید به همون صورت دستی و هم از دیتابیس sitemap را ایجاد کنید

      پاسخ
      • صالحی

        مثلا این url http://sobooneh.ir/Home/location_menus?city_id=4&location_id=2 که مقادیر location_id , city_id به صورت داینامیک به دست اومده و براساس اونها مقادیر داخل صفحه پر میشه یه سوال دیگه هم خدمتتون داشتم من تمام مراحل رو انجام دادم اما وقتی میخوام نقشه سایت را به webmastertools معرفی کنم میگه فایل sitemap.xml وجود نداره آیا تنظیمات دیگه ای هم لازم داره انجام بدم با تشکر

        پاسخ
        • حسین فتحی

          سلام

          این موارد باید به صورت دسته بندی به sitemap اضافه بشه یعنی مثلا غذا ها و ... و نیازی نداره به صورت query string وارد کنید.

          خودتان به صورت دستی چک کنید در آدرس فوق sitemap.xml وجود داره یا نه؟

          پاسخ
          • صالحی

            با اینکه routconfig رو طبق آموزش شما تغییر دادم اما با این الگو آدرس http://iranganj.ir/sitemap/sitemap فراخوانی میکنه

            پاسخ
            • حسین فتحی

              سلام

              نباید چنین مشکلی باید باشه. دوباره بررسی کنید که را اشتباه ننوشته باشید.

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