জ্যাঙ্গোতে কীভাবে ডায়নামিক সাইটম্যাপ তৈরী করবেন ?

Md Mahmudul Huq Topu
5 min readFeb 21, 2020

--

আমরা যখন একটি ডায়নামিক ওয়েবসাইট ডেভেলপ করি তখন একটা জিনিস প্রায়ই মাথায় ঘোরপাক খায় এই সাইটের এসইও এর ক্ষেত্রে কি করা যেতে পারে? বা গুগুল বা অন্যান্য সার্চ ইঞ্জিনে ওয়েবসাইট সাবমিট করতে হলে সাইটম্যাপ দেয়া লাগে। এখন অধিকাংশ ওয়েবসাইটে আমি ব্যক্তিগতভাবে যা দেখলাম সবাই থার্ড পার্টি বিভিন্ন ওয়েবসাইটে নিজেদের লিংক দিয়ে ম্যানুয়ালি সাইটম্যাপ তৈরী করে sitemap.xml ফাইলটি ডাউনলোড করে নিজেদের সার্ভারে আপলোড দিয়ে দেয় ! কিন্তু এতে সবচেয়ে বড় সমস্যা হচ্ছে এই কাজ কতবার করবেন? আর কখন করবেন? ধরুন আপনার ব্লগ সাইট বা অনেক বেশি কন্টেন্ট জেনেরেট হচ্ছে , এমতাবস্থায় কি একজন সব সময় সাইটম্যাপ ম্যানুয়ালি তৈরী করতে থাকবে ? এটা কি আদৌ কোন সলিউশন ? যাক চিন্তা করার কিছু নেই, জ্যাঙ্গোতে খুব সুন্দরভাবে এই কাজটা করা যায় !

তবে এই আর্টিকেলে ধরে নেয়া হচ্ছে আপনার বেসিক একটা প্রজেক্ট সেটাপ করা আছে যেখানে কিছু স্ট্যাটিক পেজ আর কিছু ডায়ানিক পেজ আছে। তাই আমি শুধু মডেল নিয়ে ডিসকাস করলাম।

from django.urls import path, include
from django.contrib import admin
from BlogApp import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index, name='home'),
path('about/', views.about, name='about'),
path('blog/', views.blog,name='blog-home'),
path('blog/<slug:slug>/', views.single, name='single_post'),
]

ধরে নিলাম, আপনার প্রজেক্টের মধ্যে এই কয়টি ইউআরএল আছে। আর about পেজটি স্ট্যাটিক আর home পেজটা বাই ডিফল্ট সাইটম্যাপে থাকবেই। এগুলা কমন সাইটম্যাপ হতে পারে আর blog এর ক্ষেত্রে ফিক্সড কোন ইউআরএল থাকছেনা কেননা অনেক পোষ্ট হতে পারে আর একেকটার লিংক একেক রকম। তবে এখানে সকল পোষ্ট এর লিস্টিংটা একটাই ইউআরএল ধরে নিলাম আর সিংগেল আর্টকেলের লিংক গুলো ডায়নামিক ধরে নিলাম। তাই এই ক্ষেত্রে ডায়নামিক এপ্রোচে যেতে হবে। তো আমরা দুটো ভাগে ভাগ করব
১) Common Sitemaps
২) Dynamic Sitemaps

নিম্নে ধাপগুলো বিস্তারিত আলোচনা করছিঃ
১) প্রথমেই আপনাকে আপনার প্রজেক্টের settings.py তে INSTALLED_APPS এ গিয়ে 'django.contrib.sitemaps', টি add করতে হবে কেননা এই প্যাকেজটি জ্যাঙ্গোর সাথেই আসে আর এটাকে ইন্সটল করে নিতে হবে। তবে ‘django.contrib.sites’ ও একই সাথে রাখবেন না। এতে এক্সট্রা স্ল্যাশ ইউআরএলে এড হবে আর SITE_ID = 1 ও দিতে হবে । তাই এটির কোন প্রয়োজন নেই।

২) এরপর আপনার মূল প্রজেক্ট ডিরেক্টোরিতে একটি ফাইল তৈরী করুনঃ sitemaps.py এবং নিম্নের কোড লিখুনঃ

from django.contrib.sitemaps import Sitemapfrom django.shortcuts import reverseclass CommonSitemap(Sitemap):   priority = 0.5   def items(self):       return [               'home',               'about'              ]   def location(self, item):       return reverse(item)

এখানে উপরে আমরা Sitemap এবং reverse ইম্পোর্ট করে নিলাম। এখান Sitemap ক্লাসটিকে এক্সটেন্ড করে CommonSitemap একটি ক্লাস তৈরী করা হলো যেখানে দুটো মেথড তৈরী করা হলো।
def items(self) এই মেথডটি দিয়ে এই সাইটম্যাপ ক্লাসটি কি কি আইটেম বা পেজ নিয়ে কাজ করবে সেটা ডিফাইন করা হল। আপনার urls.py তে path এ name প্যারামিটারে যেই নাম দিয়েছেন এখনে ওগুলাই দিবেন।
def location(self, item) এই মেথডটি প্রতিটি পেজের লোকেশন রিটার্ন করবে। আর Priority দিয়ে ০.১ থেকে ১.০ এর মধ্যে কোন ভ্যালু যেটা আপনার কাছে ভালো মনে হয় দিতে পারেন গুরত্ব অনুধাবন করে।

এখন আপনার প্রজেক্টের urls.py ফাইলে নিচের লাইনগুলো এড করুন (#add this কমেন্ট যেগুলোতে করা)

from django.urls import path, include
from django.contrib import admin
from BlogApp import views
from django.contrib.sitemaps.views import sitemap #add this
from .sitemaps import CommonSitemap #add this
sitemaps = { 'common': CommonSitemap,}urlpatterns = [

path('sitemap.xml', sitemap,
{'sitemaps': sitemaps,},name='sitemap'), #add this
path('admin/', admin.site.urls),
path('', views.index, name='home'),
path('about/', views.about, name='about'),
path('blog/', views.blog,name='blog-home'),
path('blog/<slug:slug>/', views.single, name='single_post'),
]

এক্ষেত্রে আমরা django.contrib.sitemaps.views থেকে sitemap ভিউ ইম্পোর্ট করে নিলাম। আর আমাদের প্রজেক্ট ডিরেক্টোরি থেকে CommonSitemap টিও ইম্পোর্ট করে নিলাম। এরপর একটা dictionary তৈরী করলাম যেখানে একটি Item Add করলাম ‘common’: CommonSitemap, নামে ! এইটাই আমরা ইউআরএল এর path এ দিয়ে দিলাম।

path('sitemap.xml', sitemap, 
{'sitemaps': sitemaps,},name='sitemap'), #add this

প্রথম প্যারামিটার হিসেবে ইউআরএল এর রেগুলার এক্সপ্রেশন , এরপর sitemap ভিউ, এরপর আমাদের ডিকোশনারি এবং শেষে এটাকে একটা name দেয়া হলো।
সবকিছু ঠিক থাকলে এখন আপনার সাইটে localhost:8000/sitemap.xml এ ভিজিট করুন।

Congrats ! এখন ডায়নামিক সাইটম্যাপ তৈরী করব ব্লগ এর ক্ষেত্রে। এখন আপনার এপ্স বা এখানে BlogApp এ একটি sitemaps.py ফাইল তৈরী করে নিচের কোড গুলো লিখুন।

from django.contrib.sitemaps import Sitemap
from django.shortcuts import reverse
from .models import Blog
class PostSitemap(Sitemap):
changefreq = "daily"
priority = 1.0
def items(self):
return Blog.objects.all()
def lastmod(self, obj):
return obj.date

এখানে আগের মতোই Sitemap ক্লাস এবং reverse ইম্পোর্ট করা হলো। তবে এবার ব্লগ এর মডেলটি (আপনার ক্ষেত্রে যেই মডেল চান সেটা দিবেন) এবং PostSitemap ক্লাসটি Sitemap ক্লাসটিকে এক্সটেন্ড/ইনহেরিট করছে।
changefreq এবং priority এখানে এসইও এর জন্য যেটা বেটার সেটা দিবেন।

def items(self) মেথডটি return Blog.objects.all() স্টেটমেন্টের মাধ্যমে ব্লগ মডেলে যত অবজেক্ট আছে সবগুলো রিটার্ণ করবে।
def lastmod(self, obj): মেথডটি প্রত্যেকটি ডায়নামিক অবজেক্ট/ আইটেম লাস্ট কবে মোডিফাই করা হলো সেটা return obj.date এর মাধ্যে date রিটার্ন করবে ।

এই সাইটম্যাপটি আমাদের প্রজেক্ট এর urls.py তে এড করার আগে আমাদের মডেলের ক্ষেত্রে কিছু পরিবর্তন আনতে হবে।

class Blog(models.Model):
title = models.CharField(max_length=100, blank=True, null=True)
slug = models.SlugField(unique=True, null=True)
image = models.ImageField(upload_to='blog', blank=True,
null=True, verbose_name='Image')
description = models.TextField(blank=True, null=True)
date = models.DateField(auto_now=False, auto_now_add=True)
class Meta:
verbose_name = "Blog"
def __str__(self):
return self.title
def get_absolute_url(self):
return f'/blog/{self.slug}'

এক্ষেত্রে আপনার মডেলে যদি স্লাগ ফিল্ড থাকে বা যদি প্রাইমারি কি দিয়ে পোষ্ট এর ইউআরএল সেট করেন তবে প্রতিটা অবজেক্টের absolute url থাকতে হবে।
def get_absolute_url(self) মেথডটি দিয়ে আমরা এই মডেলের অবজেক্ট গুলোর একটা Absolute ইউআরএল প্যাটার্ণ রিটার্ন করব যেন সাইটম্যাপে লোকেশনে পেয়ে যায়।
এখন প্রজেক্ট ডিরেক্টোরিতে urls.py ফাইলে কিছু এডিট করুন।

from django.urls import path, include
from django.contrib import admin
from BlogApp import views
from django.contrib.sitemaps.views import sitemap
from .sitemaps import CommonSitemap
from BlogApp.sitemaps import PostSitemap #add this
sitemaps = {'common': CommonSitemap,
'dynamic': PostSitemap, #add this
}urlpatterns = [

path('sitemap.xml', sitemap,
{'sitemaps': sitemaps,},name='sitemap'),
path('admin/', admin.site.urls),
path('', views.index, name='home'),
path('about/', views.about, name='about'),
path('blog/', views.blog,name='blog-home'),
path('blog/<slug:slug>/', views.single, name='single_post'),
]

এখন সেইভ দিয়ে http://localhost:8000/sitemap.xml ভিজিট করুন।

তো এইভাবে আপনি যেকোন স্ট্যাটিক কিংবা ডায়নামিক সাইটম্যাপ তৈরী করতে পারেন।

বিঃদ্রঃ এই আর্টিকেলটি বিগেনারদের জন্য টাফ লাগতে পারে তাই আগে একটা প্রজেক্ট করে আসা ভালো। ভালো লাগলে শেয়ার করুন। ক্ল্যাপ দিয়ে মোটিভেট করুন। আর কমেন্ট করুন কোন সাজেশন থাকলে।

--

--

Md Mahmudul Huq Topu
Md Mahmudul Huq Topu

Written by Md Mahmudul Huq Topu

I’m a Full Stack Software Engineer at Skill Jobs.Also do youtubing(Metacentric Bangladesh) since 2014.

No responses yet