如何在Jekyll中用if语句修改.md文件实现过期活动自动设为未发布
首先得明确一个核心点:Jekyll作为静态站点生成器,在构建站点的过程中是无法修改你的源文件(也就是那些.md活动文件)的——它只能读取源文件内容,生成静态HTML。所以你在模板里写的Append "published: false" to file是没法直接实现的,得换个思路。
下面给你几个可行的解决方案,按推荐程度排序:
方案1:直接在构建时过滤过期活动(最简单,推荐)
其实你现在的代码已经在做这件事了!你通过{% if item.event_date >= currentDate %}判断只渲染当前及未来的活动,过期的活动根本不会出现在生成的静态网站里。完全不需要去修改.md文件的published属性,因为用户访问网站时根本看不到这些过期内容。
如果担心源文件里的过期活动还会被其他地方引用,或者你只是不想让它们在site.date2集合里出现,可以在遍历前先过滤掉过期项,让代码更简洁:
{% assign currentDate = site.time %} {% assign sorted = site.date2 | sort: 'event_date' | where_exp: "item", "item.event_date >= currentDate" %} {% for item in sorted %} <!-- 你的活动渲染代码 --> {% endfor %}
这样site.date2里就只保留未过期的活动,后续任何用到这个集合的地方都不会拿到过期内容。
方案2:用外部脚本自动修改.md文件(如果必须修改源文件)
如果你确实需要把published: false写入过期活动的.md文件,可以写一个小脚本,在每次构建Jekyll之前运行。比如用Ruby(和Jekyll同语言,环境兼容)写一个脚本:
# auto-unpublish-events.rb require 'date' require 'yaml' # 活动文件所在的目录,对应你的_collections配置 EVENTS_DIR = '_date2' current_date = Date.today Dir.glob(File.join(EVENTS_DIR, '*.md')).each do |file_path| # 读取文件的YAML头部和内容 content = File.read(file_path) front_matter, body = content.split('---', 3)[1..2] data = YAML.load(front_matter) next unless data['event_date'] # 把event_date转换成Date对象,注意匹配你在md里的日期格式 event_date = Date.parse(data['event_date']) # 如果活动日期早于当前日期,添加published: false if event_date < current_date data['published'] = false # 重新生成YAML头部 new_front_matter = data.to_yaml # 写入文件 File.write(file_path, "---\n#{new_front_matter}---\n#{body}") puts "Updated #{file_path}: added published: false" end end
使用方法:
- 把这个脚本保存为
auto-unpublish-events.rb放在项目根目录 - 每次构建前运行:
ruby auto-unpublish-events.rb,然后再运行jekyll build或者jekyll serve - 也可以把这两个命令合并到npm脚本或者Makefile里,比如在
package.json里加:
之后用"scripts": { "build": "ruby auto-unpublish-events.rb && jekyll build", "serve": "ruby auto-unpublish-events.rb && jekyll serve" }npm run build或npm run serve一键完成。
注意:这个脚本会直接修改你的源文件,建议先备份,或者在Git里管理这些文件,避免误改。
方案3:使用Jekyll插件(仅适用于支持自定义插件的环境)
如果你的部署环境支持自定义Jekyll插件(比如自己的服务器,不是GitHub Pages),可以写一个生成器插件,在构建时自动处理活动文件。不过这种方法复杂度较高,不如前两种实用,这里就不展开了,如果你需要可以再深入探讨。
总结一下,方案1是最省心的,完全符合静态站点的工作方式;如果一定要修改源文件,方案2是最稳妥的选择。
内容的提问来源于stack exchange,提问作者Jacob Byers

