如何让Jekyll按修改日期而非发布日期排序文章?
我懂你的困扰——手动加last_modified_at字段后插件就“罢工”了,这是因为插件的默认逻辑是优先使用你手动设置的字段值,不会再去读取文件的修改时间自动更新它。下面给你一套完全自动化的解决方案,再也不用手动维护这个字段:
步骤1:正确配置插件(无需手动添加字段)
首先确保你已经正确安装并启用了jekyll-last-modified-at,但绝对不要在任何文章的前置信息里写last_modified_at。插件会自动读取每篇文章文件的系统修改时间(mtime),并给对应的post对象自动添加上last_modified_at属性,完全不需要你手动干预。
检查你的配置:
- 在
Gemfile中确认包含:gem 'jekyll-last-modified-at' - 在
_config.yml中启用插件:plugins: - jekyll-last-modified-at
步骤2:用自动生成的字段排序
直接使用你之前的排序代码即可,现在插件已经自动给每篇文章生成了last_modified_at值:
{% assign sorted_posts = site.posts | sort: "last_modified_at" | reverse %} {% for post in sorted_posts %} <!-- 你的文章渲染代码 --> {% endfor %}
现在每次你保存文章(按Ctrl+S),文件的mtime会更新,插件就会自动同步这个值到last_modified_at属性里,排序也会自动跟着更新。
特殊情况处理:手动指定部分文章的修改日期
如果你有一些特殊文章(比如迁移过来的旧文,文件mtime不准确),不想用系统修改时间,可以用一个自定义字段(比如manual_modified_at),然后修改排序逻辑优先使用这个字段:
{% assign sorted_posts = site.posts | sort: "manual_modified_at", "last_modified_at" | reverse %}
这样,有manual_modified_at的文章会用你指定的日期排序,没有的就用插件自动生成的最后修改时间,完美兼顾自动化和灵活性。
清理之前的手动字段
如果你之前已经给很多文章加了last_modified_at字段,可以用编辑器的全局替换功能批量删除:比如在VS Code里用全局查找last_modified_at:.*,然后替换为空,一次性搞定所有文章的手动字段。
内容的提问来源于stack exchange,提问作者Fraktar

