目 录CONTENT

文章目录

Halo 主页设置单文章隐藏

16Reverie
2025-03-27 / 0 评论 / 0 点赞 / 24 阅读 / 0 字

对于模板元数据的操作实例。

Halo只支持对一个分类的文章进行隐藏操作。对于单个文章的隐藏,可以用模板元数据实现。

在 Halo 2.0,所有的模型都包含了 metadata.annotations 字段,用于存储元数据信息。

以单页模型为例

SinglePageVo

{
  "metadata": {
    "name": "string",                                   // 唯一标识
    "labels": {
      "additionalProp1": "string"
    },
    "annotations": {
      "additionalProp1": "string"
    }
      ......
}

通过#annotations的三种方法进行访问

  1. #annotations.get(extension,key):根据对象和元数据的 key 获取元数据的值。

  1. #annotations.getOrDefault(extension,key,defaultValue):根据对象和元数据的 key 获取元数据的值,同时支持设置默认值。

  1. #annotations.contains(extension,key):根据对象和元数据的 key 判断元数据是否存在。

extension:postsinglePagecategorytagmenuItemuser...(以及其他自定义类型)

定义元数据

annotation-setting.yaml文章的元数据定义处(kind: Post),在 formSchema 节点下添加:

- $formkit: "select"
      name: "enable_hidden"
      label: "是否在主页列表隐藏文章"
      value: "false"
      options:
        - value: "true"
          label: 是
        - value: "false"
          label: 否

保存后重新载入主题,在文章的设置页面增加了配置项:

《图片》

元数据使用

代码里使用 Thymeleaf 的语法 th:if 对元数据进行判断,根据条件决定是否加载标签。

<th:block th:if="!(${#annotations.getOrDefault(post, 'enable_hidden', 'false')})"> ... </th:block>

但是在 index.html 的posts遍历里不生效

<th:block th:each="post, iteration : ${posts.items}">
     <!--添加在这里不生效-->
    <th:block th:if="!(${#annotations.getOrDefault(post, 'enable_hidden', 'false')})" th:replace="~{modules/macro/post_item :: post_item}" />
</th:block>

而要添加到 replace 的 modules/macro/post_item 里,可能是 post 在里面才能被访问?🤔

(new)这样也能生效:

<th:block th:each="post, iteration : ${posts.items}">
  <th:block th:if="!(${#annotations.getOrDefault(post, 'enable_hidden', 'false')})">
    <th:block th:replace="~{modules/macro/post_item :: post_item}" />
  </th:block>
</th:block>

根据豆包的解释以及上面代码,比较有可能是 Thymeleaf 处理模板指令顺序的原因。

完成。

参考

https://docs.halo.run/developer-guide/theme/annotations/https://docs.halo.run/developer-guide/annotations-form


0

评论区