【Django】多言語SEO対策:'sitemaps.Sitemap.alternates' の代替方法を徹底解説


django.contrib.sitemaps.Sitemap.alternates は、多言語サイトにおける同一コンテンツの別言語版URLを、検索エンジンに通知するためのオプションです。これにより、検索エンジンは各言語バージョンの関連性を理解し、適切なユーザーに表示することができます。

具体的な動作

  1. サイトマップXMLファイルに、各コンテンツのメインURLと、alternates キーで指定された別言語版URLが記述されます。
  2. 検索エンジンは、alternates 情報を基に、各言語バージョンの関連性を判断し、ユーザーの言語設定に合致したバージョンを検索結果に表示します。

利点

  • SEO対策効果
  • ユーザーにとって適切な言語バージョンの検索結果表示
  • 検索エンジンによるインデックス精度向上

from django.contrib.sitemaps import Sitemap

class MySitemap(Sitemap):
    def items(self):
        # 日本語コンテンツ
        item = {
            'location': '/ja/mypage/',
            'lastmod': datetime.datetime.now(),
            'changefreq': 'weekly',
            'priority': 0.5,
            'alternates': {
                'en': '/en/mypage/',
                'fr': '/fr/mypage/',
            }
        }
        yield item

        # 英語コンテンツ
        item = {
            'location': '/en/mypage/',
            'lastmod': datetime.datetime.now(),
            'changefreq': 'weekly',
            'priority': 0.5,
            'alternates': {
                'ja': '/ja/mypage/',
                'fr': '/fr/mypage/',
            }
        }
        yield item

        # フランス語コンテンツ
        item = {
            'location': '/fr/mypage/',
            'lastmod': datetime.datetime.now(),
            'changefreq': 'weekly',
            'priority': 0.5,
            'alternates': {
                'ja': '/ja/mypage/',
                'en': '/en/mypage/',
            }
        }
        yield item
  • 誤ったURLを記述すると、検索エンジンに誤った情報を提供することになるため注意が必要です。
  • すべての言語バージョンのURLを網羅していることを確認する必要があります。
  • alternates には、メインURLとは異なる言語のURLのみを指定します。


サイトマップクラスの作成

from django.contrib.sitemaps import Sitemap
from .models import Article, Category

class ArticleSitemap(Sitemap):
    changefreq = 'weekly'
    priority = 0.5

    def items(self):
        return Article.objects.all()

class CategorySitemap(Sitemap):
    changefreq = 'monthly'
    priority = 0.3

    def items(self):
        return Category.objects.all()
  • items メソッドは、サイトマップに含めるページのリストを返します。
  • changefreqpriority は、各ページの更新頻度と重要度を検索エンジンに通知します。
  • 上記コードは、Article モデルと Category モデルに基づいてサイトマップを生成する2つのサイトマップクラスを作成します。

サイトマップを登録

from django.contrib import sitemaps

sitemaps.register(ArticleSitemap)
sitemaps.register(CategorySitemap)

説明

  • 上記コードは、作成したサイトマップクラスを Django のサイトマップレジストリに登録します。

サイトマップXMLファイルの生成

  • 上記の設定を完了すると、Django は sitemap.xml ファイルを生成します。このファイルは、通常 http://yourdomain.com/sitemap.xml などのURLでアクセスできます。
from django.contrib.sitemaps import Sitemap
from .models import Article

class ArticleSitemap(Sitemap):
    changefreq = 'weekly'
    priority = 0.5

    def items(self):
        for article in Article.objects.all():
            item = {
                'location': article.get_absolute_url(),
                'lastmod': article.updated_at,
                'changefreq': self.changefreq,
                'priority': self.priority,
            }

            if article.is_published_in_en:
                item['alternates'] = {
                    'en': article.get_absolute_url_en(),
                }

            yield item
  • この例では、is_published_in_en が True の場合、英語バージョンのURLが alternates キーで指定されます。
  • 上記コードは、Article モデルの is_published_in_en フィールドに基づいて、alternates オプションを設定します。
  • 多言語サイト以外にも、alternates オプションは、異なるデバイス向けのコンテンツなど、様々なバージョンのURLを通知するために利用できます。
  • 実際のコードでは、モデル名やフィールド名、URL構造などをプロジェクトに合わせて変更する必要があります。


sitemaps.Sitemap.alternates は、多言語サイトにおける同一コンテンツの別言語版URLを検索エンジンに通知するためのオプションでしたが、Django 3.2 で非推奨となり、Django 4.0 で削除されました。

代替方法

sitemaps.Sitemap.alternates の代替方法として、以下の2つの方法が推奨されています。

i18n オプションの使用

Django 3.1 以降、sitemaps.Sitemap クラスには i18n オプションが追加されました。このオプションを True に設定すると、サイトマップに含まれるすべてのURLについて、言語情報が自動的に追加されます。

from django.contrib.sitemaps import Sitemap
from .models import Article

class ArticleSitemap(Sitemap):
    i18n = True
    changefreq = 'weekly'
    priority = 0.5

    def items(self):
        return Article.objects.all()

独自のロジックの実装

sitemaps.Sitemap.alternates の機能を完全に再現したい場合は、独自のロジックを実装する必要があります。具体的には、以下の手順が必要です。

  1. サイトマップ生成時に、各ページの言語情報を取得します。
  2. 言語情報に基づいて、別言語版URLを生成します。
  3. 生成した別言語版URLを、サイトマップXMLファイルに記述します。

from django.contrib.sitemaps import Sitemap
from .models import Article

class ArticleSitemap(Sitemap):
    changefreq = 'weekly'
    priority = 0.5

    def items(self):
        for article in Article.objects.all():
            item = {
                'location': article.get_absolute_url(),
                'lastmod': article.updated_at,
                'changefreq': self.changefreq,
                'priority': self.priority,
            }

            if article.language == 'ja':
                item['alternates'] = {
                    'en': article.get_absolute_url_en(),
                }

            yield item
  • 独自のロジックを実装する場合は、すべての言語バージョンのURLを網羅していることを確認する必要があります。
  • i18n オプションを使用する場合は、プロジェクトの設定で言語設定を適切に行う必要があります。