Jekyll评论无法正常显示问题排查求助
为什么Jekyll无法正确显示评论内容?
嘿,我瞅你这Jekyll评论渲染的问题,一眼就看到Liquid遍历的地方出毛病了!咱们来一步步给你捋清楚怎么修~
我的问题场景
我编写了一段Liquid代码,本应把存储在data/comments/postid/commentid.yml中的评论转换成HTML,但实际输出的所有评论字段(名称、邮箱、内容、日期)都是空值,只有模板结构。
我写的Liquid代码
{% for comment in site.data.comments | where: "slug", page.slug %} <div class="comment"> <div class="meta"> <p class="name"> {% if comment.email %} <img src="https://www.gravatar.com/avatar/{{ comment.email }}?d=mm&s=60" alt="{{ comment.name| escape }}"> {% else %} <img src="/blog/lib/img/avatar.jpg" alt="{{ comment.name | escape }}"> {% endif %} Od: {{ comment.name | strip_html }} * {{ comment.date | date: "%b %-d, %Y, %H:%M" }} </p> </div> <p class="message">{{ comment.message | strip_html | markdownify | smartify }}</p> </div> {% endfor %}
实际输出的HTML
<div class="comment"> <div class="meta"> <p class="name"> <img src="/blog/lib/img/avatar.jpg" alt=""> Od: * </p> </div> <p class="message"></p> </div>
YAML评论示例(data/comments/postid/commentid.yml)
_id: a39a2830-4ab0-11ea-a10f-77385622cc26 name: Igor Kowalczyk email: 28a451314d9295e9bcce66c293bd20ed message: Testowy Komentarz date: '2020-02-08T20:21:51.037Z'
问题根源与修复方案
1. 核心问题:Liquid遍历语法错误
你用的{% for comment in site.data.comments | where: "slug", page.slug %}完全不对!因为site.data.comments是一个哈希对象(不是数组),它的结构是:
site.data.comments ├─ postid1(你的page.slug) │ ├─ commentid1.yml │ └─ commentid2.yml └─ postid2 └─ commentid3.yml
where过滤器只能用于数组,没法直接筛选这种嵌套的哈希结构。
2. 修复后的代码
直接根据page.slug定位到对应帖子的评论文件夹,再遍历里面的所有评论文件:
{% assign post_comments = site.data.comments[page.slug] %} {% if post_comments %} {% for comment in post_comments %} {% assign comment_data = comment[1] %} <div class="comment"> <div class="meta"> <p class="name"> {% if comment_data.email %} <img src="https://www.gravatar.com/avatar/{{ comment_data.email }}?d=mm&s=60" alt="{{ comment_data.name | escape }}"> {% else %} <img src="/blog/lib/img/avatar.jpg" alt="{{ comment_data.name | escape }}"> {% endif %} Od: {{ comment_data.name | strip_html }} * {{ comment_data.date | date: "%b %-d, %Y, %H:%M" }} </p> </div> <p class="message">{{ comment_data.message | strip_html | markdownify | smartify }}</p> </div> {% endfor %} {% endif %}
3. 关键修复点解释
{% assign post_comments = site.data.comments[page.slug] %}:直接获取当前页面slug对应的评论文件夹下的所有评论文件{% for comment in post_comments %}:遍历该文件夹下的所有评论,每个comment是一个键值对(键是评论文件名,值是YAML里的评论数据){% assign comment_data = comment[1] %}:取出键值对里的实际评论数据(comment[0]是文件名,comment[1]才是你要的内容)
4. 额外检查项
- 确保
page.slug的值和你的评论文件夹名完全匹配(Jekyll对文件名大小写、空格都敏感) - 检查YAML文件的缩进:必须用空格,不能用Tab,否则Jekyll会解析失败
内容的提问来源于stack exchange,提问作者Majonez.exe
相关产品推荐
相关产品推荐

