\ ポイント最大5倍! /

Djangoでサイトマップ(sitemap.xml)を実装する方法まとめ

検索エンジンに正しくクロールしてもらうために、Django が標準機能でサイトマップを生成する方法を整理します。

使うのはdjango.contrib.sitemaps です。

Django側の準備から、サイトマップクラスの作成、URL ルーティングまでの流れをまとめた実装メモです。

Djangoでサイトマップ(sitemap.xml)を実装する方法まとめ

1. django.contrib.sitemaps を有効化する

まずは Django の設定。

Python
INSTALLED_APPS = [
    # 既存アプリ
    "django.contrib.sitemaps",
]

これでサイトマップ機能が利用可能になります。

2. サイトマップクラスを作成する

サイトマップに含めたい URL を定義するためのクラスを作ります。
app_name/sitemaps.py のように専用ファイルを切っておくと管理しやすいです。

2-1. モデルベースのサイトマップ

更新頻度や優先度は適宜調整します。

Python
from django.contrib.sitemaps import Sitemap
from .models import Article  # 任意のモデル

class ArticleSitemap(Sitemap):
    changefreq = "weekly"
    priority = 0.8

    def items(self):
        # 公開済みデータを対象にする
        return Article.objects.filter(is_published=True).order_by("-updated_at")

    def location(self, obj):
        return obj.get_absolute_url()

    def lastmod(self, obj):
        return obj.updated_at

items() で返したオブジェクトが、サイトマップに展開されます。

2-2. 静的ページ用サイトマップ

トップページやプライバシーポリシーなど、モデルを持たない URL をまとめたいときに使います。

Python
from django.contrib.sitemaps import Sitemap
from django.urls import reverse

class StaticViewSitemap(Sitemap):
    changefreq = "monthly"
    priority = 0.5

    def items(self):
        return ["index", "search", "privacy_policy"]  # URL 名

    def location(self, item):
        return reverse(item)

URL 名(name="...")を返すと、自動で実 URL に変換されます。

3. URL に sitemap.xml を登録する

core/urls.py にサイトマップを紐づけます。

Python
from django.contrib.sitemaps.views import sitemap
from app_name.sitemaps import ArticleSitemap, StaticViewSitemap

sitemaps = {
    "articles": ArticleSitemap,
    "static": StaticViewSitemap,
}
Python
urlpatterns = [
    # 既存のURLパターン…
    path(
        "sitemap.xml",
        sitemap,
        {"sitemaps": sitemaps},
        name="sitemap",
    ),
]

これで /sitemap.xml にアクセスすると、XML形式で URL 一覧が出力されます。

4. 動作確認

実装後に確認した内容は次の通り。

  • リンターエラーがないか
  • /sitemap.xml にアクセスして意図した URL が含まれているか
  • 非公開データが混ざっていないか
  • lastmod が正しい値になっているか

特にモデルベースのサイトマップは、対象条件の絞り込み漏れに注意。

サイトマップを分割したい場合(sitemap-index.xml を使う)

Django では、サイトマップを複数ファイルに分割して「サイトマップインデックス(sitemap-index.xml)」として管理できます。
URL 数が増えてきたり、用途別に整理したくなった場合に便利な仕組みです。

サイトマップを分割する必要があるケース

サイトマップ分割の必要性は、次のいずれかを満たすときに検討します。

1. URL が 50,000 件を超える場合

Google の仕様上、1つの sitemap.xml は 最大 50,000 URL
これを超える規模のコンテンツを扱う場合は、物理的に分割が必須。

  • 大規模ブログ
  • ECサイトの商品ページ
  • 動的に生成される大量のページを持つサイトなどで発生しやすいケース。

2. XML のサイズが 50MB を超える場合

サイトマップは「圧縮後で 50MB 以下」という制限があります。
画像タグ(<image:image>)を大量に含む場合など、サイズ制限で分割が必要になるケース。

3. コンテンツの用途が明確に分かれている場合

URL 上限以下でも、構造上の整理目的で分割する例も多いです。

例:

  • ブログ記事 sitemap
  • 商品ページ sitemap
  • 静的ページ sitemap

管理しやすく、Search Console 上でカバレッジの把握もしやすくなります。

4. Search Console で用途別にクロール状態を可視化したい場合

「ブログだけエラーが出てる」など、問題を切り分けたいときに便利。

サイトマップを分けることで原因の特定が容易になります。

Djangoでサイトマップを分割する実装方法

Django は sitemap ビューに複数の Sitemap クラスを渡すだけで、
自動的に サイトマップインデックス として扱ってくれます。

下記のように、用途別に Sitemap クラスを増やして分割します。

ステップ1:用途別の Sitemap クラスを作る

例として、ブログ・商品・静的ページの3種類を用意します。

Python
# app/sitemaps.py
from django.contrib.sitemaps import Sitemap
from django.urls import reverse
from .models import BlogPost, Product

class BlogSitemap(Sitemap):
    changefreq = "weekly"
    priority = 0.8

    def items(self):
        return BlogPost.objects.filter(published=True)

    def lastmod(self, obj):
        return obj.updated_at


class ProductSitemap(Sitemap):
    changefreq = "daily"
    priority = 0.9

    def items(self):
        return Product.objects.filter(is_active=True)

    def lastmod(self, obj):
        return obj.updated_at


class StaticViewSitemap(Sitemap):
    changefreq = "monthly"
    priority = 0.5

    def items(self):
        return ["index", "privacy_policy"]

    def location(self, item):
        return reverse(item)

ステップ2:sitemaps 辞書でまとめる

Python
# core/urls.py
from django.contrib.sitemaps.views import sitemap
from app.sitemaps import BlogSitemap, ProductSitemap, StaticViewSitemap

sitemaps = {
    "blog": BlogSitemap,
    "products": ProductSitemap,
    "static": StaticViewSitemap,
}

ここでキー名がそのまま
/sitemap-blog.xml
/sitemap-products.xml
/sitemap-static.xml
といったサブサイトマップの名前になります。

ステップ3:URL に sitemap.xml(インデックス)を登録する

Python
urlpatterns = [
    path(
        "sitemap.xml",
        sitemap,
        {"sitemaps": sitemaps},
        name="sitemap"
    ),
]

これだけで Django が自動的に以下を生成します:

URL役割
/sitemap.xmlサイトマップのインデックス(sitemap-index.xml 相当)
/sitemap-blog.xmlブログ記事専用のサイトマップ
/sitemap-products.xml商品ページ専用のサイトマップ
/sitemap-static.xml静的ページ専用のサイトマップ

ステップ4:Search Console にインデックスのみ登録する

Google Search Console で登録するのは /sitemap.xml(インデックス)だけでOK

Google が各サブサイトマップを自動で取得してくれます。

Python
https://example.com/sitemap.xml

まとめ

Django のサイトマップ機能は、最小限のコードで sitemap.xml を自動生成できるのが便利です。

  • モデルごとに Sitemap クラスを定義
  • 静的ページは URL 名をまとめて Sitemap 化
  • sitemap.xml にまとめて登録

この3つを押さえておけば、複数ページを持つサイトでも簡単にサイトマップを運用できます。

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

CFXLOGのアバター CFXLOG プログラマ

こんにちは。CFXLOG の中の人です。
プログラマ/エンジニアとして働きつつ、趣味や勉強で得たことをこのブログにまとめています。
保有資格には「基本情報技術者試験」「宅地建物取引士」などがあります。
メイン言語は Pythonです。たまにVBAを触ることも。Webアプリからインフラ構築、テスト、データ処理まで、幅広く記載していきます。
「実務で使える」「勉強になる」「ちょっとした気づきになる」──そんな情報を発信していきます。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)