サイトマップ(sitemap.xml)は、検索エンジンに「サイトにどんなページがあるか」を伝えるためのファイルです。
特に、ブログや掲示板のようにページが増えていくサイトでは、自動生成しておくと非常に便利です。
Googleなどのクローラーはこのファイルを見て、新しいページを効率的にインデックス登録してくれます。
更新日:
投稿日:
今回は、Djangoで「サイトマップ(sitemap.xml)」を自動生成する方法についてまとめました。
サイトマップは検索エンジンに自分のサイト構造を正しく伝えるためのもので、SEO対策としてもとても重要です。
サイトマップ(sitemap.xml)は、検索エンジンに「サイトにどんなページがあるか」を伝えるためのファイルです。
特に、ブログや掲示板のようにページが増えていくサイトでは、自動生成しておくと非常に便利です。
Googleなどのクローラーはこのファイルを見て、新しいページを効率的にインデックス登録してくれます。
robots.txtは、クローラー(bot)が「どのページを巡回して良いか」を制御するためのファイルです。
また、サイトマップの場所を知らせる役割もあります。
例として以下のように書き、テンプレートディレクトリに設置します。
# templates/robots.txt
User-agent: *
Disallow: /admin/
Sitemap: https://example.com/sitemap.xml
次に設定フォルダのurls.pyのurlpatternsに以下のように書きます。
# config/urls.py from django.views.generic import TemplateView urlpatterns = [ … path("robots.txt", TemplateView.as_view(template_name="robots.txt", content_type="text/plain")), # ← これを追加! ]
これでクローラーが自動でrobots.txtを読み取ってくれます。
Djangoでは、django.contrib.sitemapsを有効にすることで自動生成機能が使えるようになります。
設定ファイル(settings.py)を開いて以下を追加します。
# config/settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', … 'django.contrib.sitemaps', # ← これを追加! ]
次に、sitemaps.pyファイルをプロジェクトのルートディレクトリ直下に作成します。
ここでは静的ページとブログ記事を例にsitemaps.pyの書き方紹介します。
# myproject/sitemaps.py from django.contrib.sitemaps import Sitemap from django.urls import reverse from blog.models import BlogPost # 静的ページのサイトマップ class StaticViewSitemap(Sitemap): priority = 0.8 changefreq = 'weekly' def items(self): return ['home', 'about', 'contact'] def location(self, item): return reverse(item) # 動的ページ(ブログ記事など) class BlogPostSitemap(Sitemap): priority = 0.6 changefreq = 'daily' def items(self): return BlogPost.objects.all() def lastmod(self, obj): return obj.updated_at or obj.created_at
priorityはページの重要度、changefreqは更新頻度を示します。
この設定で、ブログを更新するたびに新しいURLが自動的にサイトマップに追加されます。
ここまでのディレクトリ構成は以下のようになります。
myproject/ ├─ blog/ # アプリケーションフォルダ │ ├─ models.py │ ├─ views.py │ └─ ... ├─ config/ # 設定フォルダ ├─ templates/ # テンプレートフォルダ │ ├─ blog/ │ └─ robots.txt ├─ manage.py ├─ requirements.txt └─ sitemaps.py # サイトマップ
djangoおすすめのディレクトリ構成はこちら
sitemap.xmlへのルートをconfig/urls.pyに追加します。
ここではsitemaps.pyで定義したクラスを読み込みます。
# config/urls.py
from django.contrib.sitemaps.views import sitemap
from sitemaps import (
StaticViewSitemap,
BlogPostSitemap,
)
sitemaps = {
"static": StaticViewSitemap,
"blog": BlogPostSitemap,
}
urlpatterns = [
…
path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='sitemap'),
path("robots.txt", TemplateView.as_view(template_name="robots.txt", content_type="text/plain")),
]
これでhttps://example.com/sitemap.xmlにアクセスすると、自動でサイトマップが生成されているのが分かります。
サイトマップを生成したら、Google Search Console に登録します(手順は後述します)。
自分のサイトをSearch Consoleに登録
左メニューから「サイトマップ」をクリック
「新しいサイトマップを追加」にhttps://example.com/sitemap.xmlと入力
「送信」ボタンをクリック
ステータスが「成功しました」と表示されれば完了です。
その後は自動的に定期クロールされます。
・robots.txtへの追加
管理画面など非公開ページを除外したいときのみ追加します。通常の新しい公開ページは追加不要です。
・sitemaps.pyへの追加
新しいモデルやページができた場合、そのモデル用のSitemapクラスを追加します。
・URL構造を変えたとき
ルーティングの名前や引数を変更した場合、reverse()の部分も必ず修正します。
サイトマップを自動生成するようにすると、ブログや掲示板のような動的ページの更新がすぐにGoogleに認識されるようになります。
最初は仕組みが難しそうに見えますが、一度構築してしまえば、更新はほぼ自動です。
今後も新しいページを追加するときにsitemaps.pyも更新するのを忘れないようにしましょう。