ساخت داینامیک سایت مپ در ASPNet Core

ساخت داینامیک سایت مپ در ASPNet Core

امروزه سایت مپ یکی از بخش های اصلی هر وب سایت به حساب می آید و یکی از مهمترین فاکتورهایی می باشد که بر روی سئو وب سایت شما تاثیر دارد.
سایت مپ یک فایل XML است که حاوی تمام لینک های وب سایت شماست که میخواهید توسط گوگل و دیگر موتورهای جست و جو دیده و ایندکس شوند.

نقشه سایت


در اینجا داینامیک بودن سایت مپ به این معنی می باشد که شما وقتی مطلب (یا محصولی) را به سایت اضافه میکنید و یا ویرایش و حذف میکنید به صورت اوتوماتیک لینک مطلب (یا محصول) در سایت مپ اضافه، ویرایش و یا حدف شود.
ابتدا اجازه دهید به ساختار کلی یک فایل سایت مپ نگاهی کنیم :

<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
	<loc>http://YourDomain/YourPage1</loc>
	<lastmod>2018-10-04</lastmod>
	<changefreq>always</changefreq>
	<priority>1</priority>
  </url>
  <url>
	<loc>http://YourDomain/YourPage2</loc>
	<lastmod>2018-10-01</lastmod>
	<changefreq>always</changefreq>
	<priority>1</priority>
  </url>
</urlset>

به ازای هر مطلبی که در سایت قرار میگیرد، یک تگ Url باید به این فایل اضافه شود.
کمی بیشتر این فایل را بررسی کنیم:
تگ loc که درون تگ Url قرار گرفته است حاوی آدرس صفحه مطلب (یا محصول و یا صفحات استتیک) شما می باشد.
تگ lastmo تاریخ آخرین دستکاری (که در اولین بار تاریخ ثبت مطلب می باشد) را مشخص میکند.
تگ changefreq دوره تغییر مطلب را مشخص می کند (این صفحه هر چند وقت یک بار ویرایش می شود؟)
** بحث سئو و اینکه کدام دوره برای شما مناسب است مورد بحث ما نیست و از آن می گذریم.
تک priority اهمیت این صفحه را مشخص می کند که عددی بین 0 تا 1 را شامل می شود.

ابتدا یک ویومدل درست میکنیم با اسم SitemapUrl و کدهای زیر را به این کلاس اضافه میکنیم:

using System;

namespace Project.ViewModels
{
    public class SiteMapUrl
    {
        public string Url { get; set; }
        public DateTime? Modified { get; set; }
        public ChangeFrequency? ChangeFrequency { get; set; }
        public double? Priority { get; set; }
    }

    public enum ChangeFrequency
    {
        Always,
        Hourly,
        Daily,
        Weekly,
        Monthly,
        Yearly,
        Never
    }
}

یک کلاس که پراپرتی های هر آیتم از سایت مپ را مشخص می کند و همینطور یک enum که مقادیر changefreq رو دارد.
حالا یک کلاس جدید به نام SiteMapBuilder به پروژه اضافه می کنیم و کدهای زیر را به آن اضافه می کنیم:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using Project.ViewModels;

namespace Project.Helpers
{
    public class SiteMapBuilder
    {
        private readonly XNamespace NS = "http://www.sitemaps.org/schemas/sitemap/0.9";
        private List<SiteMapUrl> _urls;
        public SiteMapBuilder()
        {
            _urls = new List<SiteMapUrl>();
        }



        #region Sitemap Generator
        public void AddUrl(string url, DateTime? modified = null, ChangeFrequency? changeFrequency = null, double? priority = null)
        {
            _urls.Add(new SiteMapUrl()
            {
                Url = url,
                Modified = modified,
                ChangeFrequency = changeFrequency,
                Priority = priority,
            });
        }

        public override string ToString()
        {
            var sitemap = new XDocument(
            new XDeclaration("1.0", "utf-8", "yes"),
            new XElement(NS + "urlset",
            from item in _urls
            select CreateItemElement(item)
            ));

            return sitemap.ToString();
        }

        private XElement CreateItemElement(SiteMapUrl url)
        {
            XElement itemElement = new XElement(NS + "url", new XElement(NS + "loc", url.Url));

            if (url.Modified.HasValue)
            {
                itemElement.Add(new XElement(NS + "lastmod", url.Modified.Value.ToString("yyyy-MM-ddTHH:mm:ss.f") + "+00:00"));
            }

            if (url.ChangeFrequency.HasValue)
            {
                itemElement.Add(new XElement(NS + "changefreq", url.ChangeFrequency.Value.ToString().ToLower()));
            }

            if (url.Priority.HasValue)
            {
                itemElement.Add(new XElement(NS + "priority", url.Priority.Value.ToString("N1")));
            }

            return itemElement;
        }
        #endregion

    }
}

همانطور که می بینید کلاس ما حاوی متد AddUrl می باشد که توسط این متد آیتم ها را به سایت مپ اضافه می کنیم، متد ToString را هم override کردیم تا ساختار xml مربوط به سایت مپ را برای ما بسازد.
تقریبا به انتهای کار رسیده ایم، تنها کاری که نیاز است انجام شود ساخت کنترلر و اکشن سایت مپ برای نمایش سایت مپ می باشد.
یک کنترلر به پروژه اضافه می کنیم با نام SiteMapController و کدهای زیر را به آن اضافه می کنیم:

        private readonly ApplicationDbContext _db;
        public SiteMapController(ApplicationDbContext db)
        {
            _db = db;
        }
        
        [Route("/sitemap.xml")]
        public async Task<ActionResult> Index()
        {
            // list of items to add
            var posts = await _db.Posts.ToListAsync();

            var siteMapBuilder = new SiteMapBuilder();

            // add the blog posts to the sitemap
            foreach (var post in posts)
            {
                siteMapBuilder.AddUrl("http://sadin.ir/Articles/Article/" + post.PostAddress, modified: post.CreatedAt, changeFrequency: null, priority: 1.0);
            }

            // generate the sitemap xml
            string xml = siteMapBuilder.ToString();
            return Content(xml, "text/xml");
        }

همانطور که می بینید یک لیست از مطالب را از بانک اطلاعاتی واکشی کرده ایم، هر مطلب را با استفاده از متد AddUrl به سایت مپ اضافه کردیم، در نهایت با متد ToString ساختار سایت مپ را ساختیم و لیست ساخته شده را به آن اضافه کردیم.
اگر دقت کنید در بالای اکشن مربوطه Route جدیدی تعریف کردیم. تا آدرس سایت مپ به صورت http://sadin.ir/sitemap.xml باشد.

نتیجه گیری:

داشتن سایت مپ(نقشه سایت) برای هر وب سایتی لازم است، سایت مپ (یا نقشه سایت) یک فایل xml است که حاوی لینک های سایت می باشد، حتی می توانیم این فایل را به صورت دستی درست کرده و در هاست قرار دهیم اما این کار برای وب سایت هایی که تولید محتوی میکنند و مطالب وب سایت در حال اضافه شدن یا به روزرسانی هستند مناسب نیست و از Sitemap Generator ها استفاده میکنند، یکی از این Sitemap Generator ها را با هم آماده کردیم!

نظرات (0)

نظرسنجی
میزان رضایت شما از امکانات و مقالات سایت