Wagtail sitemap.xml 不索引多语言链接的问题
Wagtail 项目采用 wagtail_locale 应用实现页面多语言管理。在参照 sitemap 配置文档 启用 sitemap 生成器之后, http://localhost:8000/sitemap.xml 中只有 /en/
英文的链接。
通过在 django shell 中导入 Page 类,查看各页面的中英文版本,发现 Wagtail 会将翻译的页面视为附属页面。比如:
>>> from wagtail.core.models import Page
>>> home = Page.objects.get(id=3)
>>> home.locale
<Locale: English>
>>> home2 = Page.objects.get(id=4)
>>> home2.locale
<Locale: 简体中文>
虽然数据库中存在中英文两种语言的首页,但在生成页面结构时,Wagtail 会以默认语言为基准,因此生成的站点地图中就没有简体中文的链接。
想把各个页面对应的中文链接也添加到站点地图,则需要使用 Wagtial Page 预置的 get_sitemap_urls()
方法对当前页面模型的站点地图规则进行重写:
from wagtail.core.models import Page
class BlogPage(Page):
...
def get_sitemap_urls(self, request):
sitemap = super().get_sitemap_urls(request)
if self.has_translation(locale=2):
sitemap.append({
"location": self.get_site().root_url + self.url.replace('en', 'zh-cn'),
"lastmod": (self.last_published_at or self.latest_revision_created_at),
})
return sitemap
else:
return sitemap
上述代码通过 self.has_translation(locale=2)
判断当前页面是否存在翻译页面,即是否存在简体中文页面,如果存在则在已有站点地图的规则基础上追加简体中文的规则。
由于 Wagtail 已经忽略的中文页面(把中文作为附属页面),因此使用 self.url
时读取到的永远是 /en/xxx/
这样的路径。这里使用 Python 的字符串替换功能将 en
替换成 zh-cn
。
会员讨论区