セキレイ多言語サイトマップ

多言語対応のセキレイサイト向けのGoogle対応サイトマップ

C05348A3-9AB8-42C9-A6E0-81DB3AC59FEB
           

Webサイトで多言語コンテンツを処理する場合は、適切にフォーマットされたサイトマップファイルを生成する必要があります。

wagtail-logo-png-transparent

複数の言語で書かれたコンテンツをウェブサイトで生成する場合は、ローカライズされたバージョンのページ(およびその他のページインデックスエンジン)についてGoogleに通知する必要があります。

そのためには、 robots.txtsitemap.xmlの2つの特定のメイジが必要です。 Wagtail CMS:Djangoコンテンツ管理システムにはi18n翻訳を処理できるように見えるサイトマップフレームワークがあり、 Wagtail Localizeは翻訳されたコンテンツを簡単に処理できる翻訳プラグインですが、適切にフォーマットできなかったと言わざるを得ません。生成するサイトマップファイル。言語代替タグが存在し、 hreflang言語コードは正しいが、 hrefタグは常にデフォルト(英語)の言語を指していた。

これを解決してメソッドを上書きするのに多くの時間を費やした後、 robots.txtの場合と同じように、Djangoテンプレートを使用してこれを実行することにしました。

これは、指示に従い、プロジェクトの設定で言語のリストを構成したことを前提としています。次に例を示します。

# my_project/settings.py
 
WAGTAIL_CONTENT_LANGUAGES = LANGUAGES = [
    ('en', "English"),
    ('fr', "French"),
    ('es', "Spanish"),
]

my_project / templates/sitemap.xmlファイルの内容は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
{% spaceless %}
    {% for url in urlset %}
        <url>
            <loc>{{ url.location }}</loc>
            {% if url.lastmod %}
                <lastmod>{{ url.lastmod|date:'Y-m-d' }}</lastmod>
            {% endif %}
            {% if url.changefreq %}<changefreq>{{ url.changefreq }}</changefreq>{% endif %}
            {% if url.priority %}<priority>{{ url.priority }}</priority>{% endif %}
            {% if url.language %}<lriority>{{ url.language }}</lriority>{% endif %}
            {% for item in url.alternates %}
                <xhtml:link rel="alternate" hreflang="{{ item.lang_code }}" href="{{ item.location }}"/>
            {% endfor %}
        </url>
    {% endfor %}
{% endspaceless %}
</urlset>

my_project / templates/robots.txtファイルの内容は次のとおりです。

User-Agent: *
Disallow: /admin/
 
# Sitemap files
Sitemap: {{ wagtail_site.root_url }}/sitemap.xml

my_project / blog/views.pyファイルの内容は次のとおりです。現在の言語のアクティブなページのみをクエリし、各ページについて、他の構成された言語でのライブ翻訳があるかどうかを確認します。 changefreqpriorityの値を必要な場所に設定してください。

from django.views.generic import TemplateView
from wagtail.core.models import Site
 
from .models import BlogPage as Article
from django.urls import reverse
from django.conf import settings
from wagtail.core.models import Page
from wagtail.core.models import Locale
from django.conf import settings
 
 
class RobotsView(TemplateView):
 
    content_type = 'text/plain'
    template_name = 'robots.txt'
 
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        request = context['view'].request
        context['wagtail_site'] = Site.find_for_request(request)
        return context
 
 
class SiteMap(TemplateView):
 
    content_type = 'application/xml'
    template_name = 'sitemap.xml'
 
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        request = context['view'].request
        changefreq = 'daily'
        priority = 0.8
        context['urlset'] = []
        current = Locale.get_active().language_code
        domains = settings.LANGUAGES
 
        MySitemap = Article.objects.filter(locale=Locale.objects.get(language_code=current)).live()
        for page in MySitemap:
            url_info = {
                'location': page.url,
                'lastmod': page.last_published_at,
                'changefreq': changefreq,
                'priority': priority,
                'alternates': [],
            }
 
            for l in domains:
                lang = l[0]
                if lang == current:
                    continue
                translation = Locale.objects.get(language_code=lang)
                if page.has_translation(translation):
                    translated_blog_page = page.get_translation(translation)
                    if translated_blog_page.live:
                        url_info['alternates'].append({
                        'location': translated_blog_page.url,
                        'lang_code': lang,
                        })
 
            context['urlset'].append(url_info)
 
        return context

そして最後に、すべてが機能するようにし、 my_project / urls.pyファイルを編集して、以下を追加します。

from my_project.blog import views as blog
 
...
 
urlpatterns = [
 
    ...
 
    path('robots.txt', blog.RobotsView.as_view()),
    path('sitemap.xml', blog.SiteMap.as_view()),
 
    ....
]

いつものように、2つのWagtail実装は同じではないため、ブログ、BlogPage、Articleを正確な構成に調整する必要がありますが、これがうまく機能し、時間を節約できることを願っています。

投稿コメント 0

Tagged with:
web