Falco
(Falco)
1
我们在用户偏好设置中添加了一个新的 日历 (Calendar) 选项卡,它允许您在外部日历应用程序(如 Google 日历、Apple 日历和 Microsoft Outlook)中订阅 Discourse 源。

工作原理
导航到您的 偏好设置 (Preferences) → 日历 (Calendar) 选项卡,然后点击 生成订阅 URL (Generate Subscription URLs)。您将获得以下应用的“一键订阅”按钮:
- Google 日历 (Google Calendar) — 打开 Google 日历并预先填好源信息
- Microsoft Outlook — 打开 Outlook 的网页订阅对话框
- Apple 日历 (Apple Calendar) — 通过
webcal:// 触发原生日历应用
- 复制 URL (Copy URL) — 适用于支持 ICS 源的任何其他日历应用
可用源
始终可用:
- 书签提醒 (Bookmarked Reminders) — 带有提醒日期的书签
启用 discourse-calendar 插件后可用:
- 所有事件 (All Events) — 所有论坛事件
- 我的事件 (My Events) — 您将参加或感兴趣的事件
面向插件开发者
插件可以使用新的 register_calendar_subscription_feed API 注册额外的 ICS 源。以这种方式注册的源在启用插件后会自动出现在“日历”偏好设置选项卡中。
安全性
订阅 URL 使用范围限定的用户 API 密钥,这些密钥被限制为只读 ICS 格式访问。密钥会进行速率限制,并且 URL 仅在生成时显示一次——用户可以随时重新生成,这将撤销旧的 URL。
25 个赞
感谢 @Falco,但我该如何移除公司选项?我发现在我的社区中看到专有服务的广告令人反感。
1 个赞
非常感谢您的这项实现——这将提高日历/事件插件对许多社区的可用性!
我与 @hellekin 有着同样的反对意见:在 Discourse 中,我们处于一个开源环境中。在我们的社区中,没有人使用谷歌日历或微软日历。如果用户需要这些专有服务的链接,他们应该自己决定,而不是由应用程序来决定。因此,我更希望在创建订阅 URL 的步骤(例如使用一些复选框)时就选择外部日历服务的类型,而不是之后再选择。
1 个赞
“筛选”增强功能
我们在 Discourse 实例上拥有多个社区。它们通过群组权限分隔,有些用户是一个以上的社区的成员。如果能对“Discourse Calendar - All Events”URL 进行筛选,使其仅显示特定社区的日历条目,将会非常方便。示例文本 URL
https://discourse.example.com/discourse-post-event/events.ics?user_api_key=c2aa22d800dd473b62d199d796742382&group=[groupname]
通过此增强功能,可以将在特定(!)社区的 Discourse 事件分享到他们自己的网站上,例如使用 WordPress 插件“ICS calendar”。
2 个赞
另一个小的建议增强:如果您想在两个不同的客户端(例如,两台设备上的 Thunderbird)上订阅 Discourse 事件,您需要复制两次 URL。但目前 URL 只显示一次。如果您添加第二个客户端,则必须重新生成 URL,而您会丢失第一个 URL。
2 个赞
Falco
(Falco)
7
由其中一个组中的用户生成的提要难道不是已经以这种方式工作了吗?您测试过吗?
你只需要复制一次,然后粘贴到你需要的两个客户端中即可。
如果你忘记了一个客户端,可以一键重新生成。
2 个赞
Heliosurge
(Dan DeMontmorency)
8
这相当不错。一个可能的源信息流点子也可能是“已保存的搜索”(Saved Searches)插件。
我明白,但我的观点是,在首次显示 URL 后需要重新生成。
如果我在两个不同的设备上使用日历链接,它们可能无法同时进行配置。我会先从第一个设备访问我的 Discourse 个人资料,稍后再从第二个设备访问。最好是再次显示旧的 URL,并且仅在明确请求时使其失效。
如果我是两个不同社区(及其权限组)的成员,“https://discourse.example.com/discourse-post-event/events.ics” 会显示两个社区的活动。到目前为止是正确的。但是两个社区可能有它们自己的网站。如果我想在它们的网站上分享来自 Discourse 的活动,我只想看到“社区 A”的活动,而不想看到“社区 B”的活动。反之亦然。
1 个赞
nathank
(Nathan Kershaw)
11
我一直在使用这个工具配合 Google 日历,效果真的很好!
不过,事件的更改(无论是编辑还是删除)似乎没有同步到这里。
这是 Google 日历的嵌入代码:
这是我网站上的日历页面,您可以看到我已经删除了 测试事件 5,并移动了 第四个测试事件:
https://spokes.nz/upcoming-events/month/2026/3/1
您知道为什么这些更改似乎没有与 Google 同步吗?
1 个赞
Falco
(Falco)
12
Google 日历平均每天更新两次,因此更改可能需要数小时才能生效。
2 个赞
nathank
(Nathan Kershaw)
13
啊,没错,它们现在已经同步了。
这消息太好了。不过别指望临时的变更会自动推送或通知!
其他服务也是这样吗?
1 个赞
gilles
14
如果你指的是其他供应商的日历服务,原理是一样的,每天同步 1 到 2 次。当时,我没有找到增加同步次数的方法。后来我想通了,考虑到全球需要同步的日历数量,这其实很正常:rofl:我觉得他们限制次数是为了避免服务器过载!
也许我理解错了。
2 个赞
经过实际测试后的反馈:
背景:我们的 Discourse 实例由多个用户组/社区共享,它们拥有各自独立的权限组。我们为每个组设置了一个主分类。该分类对外公开可见,其内容已通过 Fediverse(Discourse ActivityPub)进行联邦同步,并显示一个公开日历。示例(https://forum.netzwissen.de/c/meshcore-str/84):
Pasted image 20260401075142.png
该日历会显示来自主分类及其子分类中的帖子事件。子分类中的事件帖子(仅对拥有社区权限组的“已登录”用户可见)不会在匿名用户(未登录)的主日历中显示。完美——这正是预期的功能!
我认为有两个需求将使 ICS 日历链接功能真正“完整”。我们使用新的 ICS 日历链接,将 Discourse 中创建的活动发布到社区公开网站(CMS:WordPress)上。
- ICS 文件中显示的活动应能按社区/权限组进行“筛选”。建议语法如下:
[ics_calendar url="https://discourse.example.com/discourse-post-event/events.ics?user_api_key=[xxxx];group=[discourse_group_id]"]
- ICS 文件应仅显示状态为“公开”的活动。状态为“私密”或“独立”的活动通常不应发布在 ICS 文件中。注意:我尚未测试此功能是否已实现……
1 个赞
raucao
(Râu Cao)
16
这是个很棒的补充!
不过,尽管日历插件已启用(而且我们一直在常规使用它),但在为用户生成 URL 时,仅创建了书签订阅。您知道可能是什么原因吗?
我也赞同 @Thomas_Rother 的观点:订阅 URL 应在被撤销或重新生成之前一直显示。设备和应用会随时间变化,如果仅仅因为想添加一个新设备或应用,就必须在所有设备上重新订阅,这既繁琐又似乎没有必要。或许可以将其设为插件配置选项,具体取决于事件数据的敏感程度。
2 个赞
Falco
(Falco)
17
您需要启用“Discourse 帖子事件已启用”设置,它才会显示。
1 个赞
raucao
(Râu Cao)
18
我们多年来一直使用“帖子事件”功能:
这是否可能是之前使用独立插件的安装环境所导致的问题?我还尝试了停用并重新激活该插件,但问题仍未解决。
1 个赞
我来这里正是为了寻找这个功能,非常高兴它已经实现了!
我赞同 @hellekin 和 @Thomas_Rother 关于企业链接的反馈。如果能将这些链接设为可选,那就太好了。许多人使用 Discourse 是出于对数字主权的信念,因此显示这些标志并不合适。
更重要的是该功能的可发现性。目前它被埋藏在用户偏好设置中,但如果能直接显示在日历界面导航栏上,那将非常受欢迎。点击“即将发生的事件”,然后看到一个订阅链接,那就完美了。
2 个赞