ایجاد 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" });
همچنین می توانید با استفاده از اتربیوت ها این کار را انجام دهید که در پست های قبلی این مورد را توضیح دادیم.
نظر / سوال