Plan du site multilingue pour Wagtail

Plans de site compatibles avec Google pour les sites Wagtail multilingues

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

Lorsque vous gérez du contenu multilingue sur votre site Web, vous devez vous assurer que vous générez un fichier Sitemap correctement formaté.

wagtail-logo-png-transparent

Lorsque vous générez du contenu sur votre site Web en plusieurs langues, vous devez vous assurer d' informer Google des versions localisées de votre page (et d'autres moteurs d'indexation de page).

Pour cela, vous aurez besoin de deux mages spécifiques, un robots.txt et un sitemap.xml . Bien que le CMS Wagtail : Django Content Management System dispose d'un cadre de sitemap qui semble capable de gérer les traductions i18n, et que Wagtail Localize est un plug-in de traduction qui facilite la gestion du contenu traduit, je dois dire que je n'ai pas pu être correctement formaté. fichiers sitemap à générer. Des balises alternatives de langue étaient présentes, les codes de langue hreflang étaient corrects, mais les balises href pointaient toujours vers la langue par défaut (anglais).

Après avoir passé beaucoup de temps à essayer de résoudre ce problème et à écraser les méthodes, j'ai décidé d'utiliser simplement un modèle Django pour y parvenir, tout comme je l'ai fait pour le robots.txt .

Cela suppose que vous avez suivi les instructions et configuré la liste des langues dans les paramètres de votre projet, par exemple :

# mon_projet/settings.py

 WAGTAIL_CONTENT_LANGUAGES = LANGUES = [
 ("en", "anglais"),
 ("fr", "français"),
 ('es', "Espagnol"),
 ]

Voici le contenu du fichier mon_projet/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>

Voici le contenu du fichier my_project/templates/robots.txt :

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

Voici le contenu du fichier my_project/blog/views.py . Il n'interrogera que les pages actives dans la langue actuelle, et pour chaque page regardera s'il y a une traduction en direct dans les autres langues configurées. Assurez-vous de définir les valeurs de changefreq et de priorité là où vous en avez besoin.

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

Et enfin, faites en sorte que tout fonctionne, éditez le fichier my_project/urls.py et ajoutez ce qui suit :

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

Comme d'habitude, comme il n'y a pas deux implémentations de Wagtail identiques, vous devrez ajuster le blog, BlogPage et Article à votre configuration exacte, mais j'espère que cela fonctionnera pour vous et vous fera gagner du temps !

Commentaires publiés : 0

Tagged with:
web