You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jekyll中用if语句修改.md文件实现过期活动自动设为未发布

解决Jekyll自动下架过期活动的问题

首先得明确一个核心点: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

使用方法:

  1. 把这个脚本保存为auto-unpublish-events.rb放在项目根目录
  2. 每次构建前运行:ruby auto-unpublish-events.rb,然后再运行jekyll build或者jekyll serve
  3. 也可以把这两个命令合并到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:08:30