我们为主题开发者增加了一种控制网站体验的新方法。可主题化的站点设置允许主题覆盖 Discourse 核心定义的有限组站点设置。![]()
可主题化的站点设置有何不同?
我们已经有了 主题设置 和 主题修改器 的概念,那么可主题化的站点设置有何不同?以下是快速摘要:
- 主题设置 - 这些是用于控制主题或组件内的 UI 和功能的自定义设置,并提供配置选项。这些不能更改 Discourse 的核心功能。
- 主题修改器 - 允许主题或组件修改 Discourse 核心的选定服务器端功能,作为构建插件的替代方案。
可主题化的站点设置(新增) - 允许主题(而非组件)覆盖一小部分核心站点设置,这些设置通常控制 UI 的部分和其他次要功能。这使得主题能够更好地控制整个网站体验。
可主题化的站点设置与其覆盖的站点设置具有相同的数据类型和值。在所有意图和目的上,数据库中的站点设置值将变得无关紧要,因为每个主题现在都单独控制此值。
管理员如何查看和更改可主题化的站点设置?
管理员可以在两个地方查看和更改可主题化的站点设置。首先,在每个单独的主题页面上,现在有一个“主题可以覆盖的设置”部分,如下所示,位于显示主题定义的主题设置的其他部分之上:
点表示该值已从站点设置的默认值更改。按“重置”会将主题站点设置值更改为与站点设置默认值匹配。
管理员可以查看这些设置的第二个地方是新页面 /admin/config/theme-site-settings:
从这里,管理员可以看到所有可主题化的站点设置、默认站点设置值以及哪些主题正在覆盖此值。当您将鼠标悬停在主题名称上时,UI 将显示该主题设置的值。
我现有的站点设置更改会怎样?
如果您已将站点上的 enable_welcome_banner 或 search_experience 更改为默认值以外的值,我们将自动将这些值迁移到您网站上安装的每个主题,因此您的会员在 UI 上不会看到任何变化。
它们在哪里定义?
可主题化的站点设置在核心 config/site_settings.yml 文件中定义。每个可主题化的站点设置都定义了 themeable: true 选项。
目前,只有两个站点设置是可主题化的——enable_welcome_banner 和 search_experience——但将来我们可能会使更多站点设置可主题化。
主题作者如何控制默认值?
主题作者可以在 about.json 文件中使用 theme_site_settings 键来定义主题站点设置覆盖,如下所示:
"theme_site_settings": {
"enable_welcome_banner": false
}
这里的任何值都将保存到数据库并与主题关联。一旦保存了值,当主题更新时,about.json 文件中 theme_site_settings 的更改将不会影响当前保存的数据库值,因为我们无法知道管理员在此期间是否更改了设置。
可主题化站点设置有哪些限制?
可主题化站点设置实际上只用于控制 UI 的元素,并且在检索其值时,我们需要主题 ID,因此存在这些限制:
- 可主题化站点设置不能在 Sidekiq 作业中使用
- 可主题化站点设置不能在 Markdown 规则中使用
- 可主题化站点设置将使用主题 ID 作为键单独缓存到客户端站点设置
- 可主题化站点设置将使用应用程序预加载器覆盖客户端
siteSettings服务上的键 SiteSetting.client_settings_json不会包含可主题化站点设置,而是可以使用主题 ID 调用SiteSetting.theme_site_settings_json- 通常,主题站点设置仅用于控制 UI 部分的简单设置,不用于服务器端。

