
Zola 静态网站如何快速接入 Schema.org 结构化数据完整上手指南【免费下载链接】zolaA fast static site generator in a single binary with everything built-in. https://www.getzola.org项目地址: https://gitcode.com/GitHub_Trending/zo/zola把一篇 Zola 生成的博客部署上线后你在搜索结果里看到的只是一行标题加一行摘要而竞品却带着图片、作者和发布时间。差距不在内容而在页面里少了一段给机器读的「说明书」——也就是 Schema.org 结构化数据。Zola 本身没有内置这个功能但它内置的 Tera 模板系统足以让你在十几行模板代码里把它补齐。搜索结果里的富摘要到底从哪来先说结论结构化数据不会让排名直接变高但它决定你的页面有没有资格展示富结果图片、日期、作者、面包屑而富结果的点击率明显高于纯蓝链。打个比方你的文章是餐厅的菜品HTML 是给客人看的菜单JSON-LD 则是贴在厨房门上的营养标签——客人不一定看但外卖平台的推荐算法一定看。搜索引擎爬到你页面时读到这段标签就知道这是一篇带作者、有发布时间、配了图的 Article于是可以在结果页画出更丰富的卡片。对 Zola 用户来说这件事有个额外好处你的站点是静态的JSON-LD 是构建期就写死进 HTML 的不存在CSR 渲染后爬虫读不到的问题。动手前只需要知道三件事1. Zola 的模板就是 Tera 模板。你的站点在templates/目录下有三个默认模板index.html管首页section.html管章节页page.html管单篇文章。官方说明在 docs/content/documentation/templates/overview.md。仓库里的 test_site/templates/page.html 是个很好的最小范例——它通过{% extends index.html %}继承基础模板只重写content块这正是你要往里面加 JSON-LD 的地方。2. 页面元数据都在page变量里。文章标题是page.title发布日期是page.date标签在page.taxonomies文章配图在page.assets与 Markdown 同目录的静态文件完整字段清单见 docs/content/documentation/templates/pages-sections.md。3. JSON-LD 就是一段 JSON塞进script typeapplication/ldjson标签。搜索引擎识别的就是这个标签人眼看到它没有任何影响。另外送你一个排查神器官方文档提到在任何模板里放进{{ __tera_context }}构建后页面上会打印出当前模板能拿到的全部变量不知道某个变量叫什么名字时比翻文档快得多。最小实现让首页带上 WebSite 标记从最简单的类型入手。打开你站点的templates/index.html在head里加下面这段以示例主题的head结构为参照见 test_site/themes/sample/templates/index.htmlscript typeapplication/ldjson { context: https://schema.org, type: WebSite, name: {{ config.title }}, url: {{ config.base_url }}, description: {{ config.description | default(value) }} } /script这段做的事很直白把config.toml里的站点标题和基础地址写进一段 JSONdescription用default过滤器兜底避免配置里没写描述时输出空引号破坏 JSON。config.base_url记得在配置文件里改成你的真实域名test_site/config.toml 第 2 行就是它的位置。进阶把文章变成搜索引擎眼中的 Article首页只是开胃菜。真正值钱的是文章页。这里先讲一个会救你命的技巧别手工拼接 JSON 字符串用 Tera 的tojson过滤器自动序列化。因为page.title里完全可能出现引号、换行手工拼 JSON 一遇特殊字符就产出非法 JSON而tojson会自动帮你转义。在templates/page.html的head区域这样写{% set article { context: https://schema.org, type: Article, headline: page.title, datePublished: page.date | default(value), author: {type: Person, name: page.extra.author | default(valueconfig.extra.author.name | default(value))} } %} script typeapplication/ldjson{{ article | tojson | safe }}/script{% set %}先把字段整理成一个字典最后| tojson | safe一步完成序列化和免转义输出——safe是必需的否则 Tera 会把 JSON 里的尖括号再转成 HTML 实体。日期字段依赖 front matterdate和可选的updated都是 Markdown 文件头里写的。可以看看仓库里的 test_site/content/posts/simple.mddate 2017-04-01就写在 front matter 里。如果某篇没有date上面代码会输出空字符串而不是让构建报错这是有意为之——宁可字段为空也别让整个站点构建失败。如果文章有 front matter 描述再加一行description: page.description | default(value)即可。场景一电商产品页产品页用的是Product类型价格、库存、评价是富结果的核心。把文章模板的套路平移过来只是类型和字段换了{% set product { context: https://schema.org, type: Product, name: page.title, description: page.description | default(value), offers: {type: Offer, price: page.extra.price, availability: https://schema.org/InStock} } %} script typeapplication/ldjson{{ product | tojson | safe }}/script这里price直接从 front matter 的page.extra.price读取——把price 99写进产品页的 front matter模板端就自动有了。这样写的好处是商品数据留在内容文件里模板只管展示改价格不用碰模板。场景二活动页Event类型适合发布会、开源沙龙这类页面startDate和地点是必填感最强的字段缺了搜索引擎会直接忽略整个标记{% set event { context: https://schema.org, type: Event, name: page.title, startDate: page.extra.start_date, location: {type: Place, name: page.extra.venue} } %} script typeapplication/ldjson{{ event | tojson | safe }}/script字段全部走page.extra.*意味着每场活动只需在各自的 Markdown 头里填时间地点模板一份代码复用所有活动页。场景三按 front matter 自动选类型三类标记都写好后别让每篇文章手工选。在page.html里用 front matter 的schema字段做分发一次写好永久生效{% if page.extra.schema product %} {% include partials/schema-product.html %} {% elif page.extra.schema event %} {% include partials/schema-event.html %} {% else %} {% include partials/schema-article.html %} {% endif %}把上面三种标记分别存进templates/partials/下对应的文件文章默认走 Article产品和活动页只需在 front matter 加一行schema product。模板目录的嵌套结构是官方支持的product_pages/with_pictures.html这样的子目录模板路径完全合法见 docs/content/documentation/templates/overview.md 的 Custom templates 一节。常见问题逐个拆QJSON-LD 校验报错说 JSON 无效最常见的原因是什么几乎总是手工拼字符串导致的转义问题。标题里一个双引号、描述里一个换行都能把 JSON 拆掉。对策只有一条用tojson过滤器序列化字典放弃字符串拼接。QdatePublished一直是空字符串回 Markdown 的 front matter 里检查date字段有没有写、格式对不对。Zola 不会替你猜日期模板里default兜底只是为了不让构建挂掉空日期对搜索引擎等于没写。Q我的文章不该用 Article 类型怎么排除用 front matter 判断。page.html是给所有.md页面共用的纯介绍页、法律页塞 Article 标记属于误导搜索引擎按上面场景三的分发逻辑给默认分支加个无page.date就不输出 Article 标记的判断即可。Q加了标记之后排名没变化是不是没生效先确认标记本身生效用浏览器的查看源码找到script typeapplication/ldjson标签把内容粘进 Google 官方的结构化数据测试工具Rich Results Test看有无报错。排名不受结构化数据直接影响是设计使然它的收益在富结果的点击率上需要区分这两个概念再评估效果。Q构建时怀疑模板拿到的变量和预期不符在目标模板里临时加一行{{ __tera_context }}构建后页面上会打出完整上下文看完记得删掉。最后三句话Zola 没有内置结构化数据但 Tera 模板系统把它降维成了往page.html里写一段带变量的 JSON这件事。用tojson序列化而不是手工拼字符串能直接消灭整类非法 JSON 的坑。按 WebSite 起步、Article 跟进、Product/Event 按需分发配合 front matter 控制字段就是你站点长期维护结构化数据的完整形态——接下来打开你的templates/page.html把第一段标记写进去吧。【免费下载链接】zolaA fast static site generator in a single binary with everything built-in. https://www.getzola.org项目地址: https://gitcode.com/GitHub_Trending/zo/zola创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考