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