【Django】多言語SEO対策:'sitemaps.Sitemap.alternates' の代替方法を徹底解説
django.contrib.sitemaps.Sitemap.alternates
は、多言語サイトにおける同一コンテンツの別言語版URLを、検索エンジンに通知するためのオプションです。これにより、検索エンジンは各言語バージョンの関連性を理解し、適切なユーザーに表示することができます。
具体的な動作
- サイトマップXMLファイルに、各コンテンツのメインURLと、
alternates
キーで指定された別言語版URLが記述されます。 - 検索エンジンは、
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
メソッドは、サイトマップに含めるページのリストを返します。changefreq
とpriority
は、各ページの更新頻度と重要度を検索エンジンに通知します。- 上記コードは、
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
の機能を完全に再現したい場合は、独自のロジックを実装する必要があります。具体的には、以下の手順が必要です。
- サイトマップ生成時に、各ページの言語情報を取得します。
- 言語情報に基づいて、別言語版URLを生成します。
- 生成した別言語版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
オプションを使用する場合は、プロジェクトの設定で言語設定を適切に行う必要があります。