Plan de site multilingue pour Wagtail
Plans de site compatibles avec Google pour les sites Wagtail multilingues
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é.
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 que cela fonctionne correctement, votre site doit fournir deux fichiers spécifiques, un robots.txt et un sitemap.xml, tous deux à la racine / de votre domaine. Bien que le système de gestion de contenu Wagtail CMS : Django Content Management System dispose d'un cadre sitemap qui semble capable de gérer les traductions i18n, et Wagtail Localize est un plugin de traduction qui facilite la gestion des contenus traduits. Cependant, je dois dire que je n'ai pas réussi à générer des fichiers sitemap correctement formatés avec ces outils. Les balises de langue alternative étaient présentes, les codes de langue hreflang étaient corrects, mais les balises href pointaient toujours vers l'URL de 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"),
]
J'ai d'abord dû créer mes fichiers modèles, un pour les robots et un pour le plan du site.
Voici le contenu du fichier 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>
Voici le contenu du fichier modèle my_project/templates/robots.txt:
User-Agent : *
Disallow : /admin/
# Fichiers Sitemap
Sitemap : {{ wagtail_site.root_url }}/sitemap.xml
Maintenant, le code.
Voici le contenu du fichier my_project/blog/views.py.
Il n'interrogera que les pages actives dans la langue active actuelle. Pour chaque page, nous vérifions s'il existe une traduction en direct dans l'une des autres langues configurées.
Veillez à définir les valeurs de changefreq et de priority en fonction de vos besoins. Les valeurs du script sont fournies à titre d'exemple.
Notez que la valeur de changefreq fournit aux moteurs de recherche des informations générales et ne reflète pas nécessairement la fréquence réelle d'exploration de la page. Les valeurs acceptées sont les suivantes :
- toujours
- horaire
- quotidien
- hebdomadaire
- mensuel
- annuellement
- jamais
La valeur "toujours" doit être utilisée pour décrire les documents qui changent à chaque accès. La valeur "jamais" doit être utilisée pour décrire les URL archivés.
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 !
Tagged with:
Wagtail web