||||
-|-|
| 摘要 | Discourse Policy 能够确认用户是否已阅读或完成某项操作,并提供可选的提醒功能。
| 安装指南 | 此插件已捆绑在 Discourse 核心代码中 。无需单独安装该插件。
功能
Discourse Policy 与投票(polls)有着许多共同之处,其目标是确保小组成员通过点击按钮来接受 某些政策。
它有一些区别于投票的特定功能:
它必须 应用于某个群组。
它可以选择性地 每周或每天催促 群组成员点击 接受政策。
用户体验(UX)设计使得查看谁接受了政策、谁未接受政策变得非常简单。
配置
截图
点击接受之前
点击右上角的“灰色”人物图标后
点击接受后
创建政策
Discourse Policy 注册了一个自定义的 [policy] BBCode 元素。这意味着你需要在你希望展示该政策的文章中编写这段代码块。
[policy group=founders reminder=daily]
我接受此政策,直到我点击接受之前,它每天都会打扰我
[/policy]
在这种情况下,该政策适用于 founders 群组,并且会每天 向所有未接受该政策的用户发送提醒。
站点设置
policy_enabled:在站点上启用 Discourse Policy 插件。
policy_restrict_to_staff_posts:政策仅可出现在员工(staff)发布的文章中。
policy easy revoke:同时显示接受和撤销按钮。
BBCode 属性
[policy] 元素可以接受以下属性。
group :政策适用的群组名称 必填
version :政策版本号,增加版本号以要求所有用户重新接受政策
reminder :提醒群组成员接受政策(每周或每天),可选,默认关闭
accept :用于接受按钮的文本,默认为“接受政策”
revoke :用于撤销按钮的文本,默认为“撤销政策”
renew :用户需要重新接受政策的天数或描述周期的文本(每月、每季度或每年)
renew-start :续期开始的第一个日期,例如 17-10-2017,如果你想设置续期周期为每半年一次(1月、6月)时非常有用
add-users-to-group :接受单个群组作为输入;接受政策的用户将自动加入此群组(当政策被手动撤销或政策版本更新时,用户将被从该群组中移除)
private :隐藏接受/未接受政策的用户
后端任务 检查政策提醒 每 6 小时运行一次。如果 reminder 元素设置为每周或每天,尚未接受政策的用户将收到通知提醒以接受政策,仅当 他们在过去一周或一天内未收到过该政策的提醒通知时。
使用示例
基本政策:
[policy group="team" reminder="daily" accept="接受" revoke="忽略" version="1"]
我已阅读、理解并确认此政策。
[/policy]
增加修订版本号,以要求每个人阅读更新内容:
[policy group="team" reminder="daily" accept="接受" revoke="忽略" version="2"]
我已阅读、理解并确认此政策。(最后更新于 [date=2020-04-23 timezone="America/Los_Angeles"])
[/policy]
定期审计任务:
[policy group="audit_committee" reminder="weekly" renew="90" renew-start="01-07-2019" version="1" accept="任务分配完成"]
我已确保有人负责此项季度审计任务。
[/policy]
更新日志
待办事项
新政策的可选即时提醒
可能允许特定群组应用政策(扩展员工权限)
65 个赞
2 篇帖子已拆分到新主题:将策略创建限制为仅限员工?
pfaffman
(Jay Pfaffman)
2023 年6 月 5 日 12:45
77
看起来此提交删除了 200 的限制和 policy_max_group_size。我是否遗漏了什么?
main ← dev_remove_policy_max_group_size
opened 03:37PM - 08 Dec 21 UTC
The plugin can handle very large groups with recent pages implementation.
3 个赞
6 个帖子被拆分到一个新主题:即使接受了政策,人们仍收到提醒
当应用于大型群组的长按钮文本策略时,UI 会被破坏:在下面的屏幕截图中,我们可以看到头像形成了一个近乎无限的列,这有点尴尬。我将查看 CSS,看看是否可以轻松修复,但可能需要进行某种重新设计:
删除 .cooked .policy .user-lists 上的 display: flex 会使其在桌面上的显示效果正常:
我最终使用了以下 CSS:
/* 使策略用户列表不溢出 */
.cooked .policy .user-lists {
display: block;
}
3 个赞
安装插件后出现错误。不知道为什么。似乎与“尝试加载 /admin/dashboard/general.json ”有关。
服务器错误
尝试加载 [/admin/plugins] 时
错误代码:500 错误
糟糕
此论坛软件遇到了意外问题。我们对造成的不便深表歉意。
错误详情已记录,并已生成自动通知。我们将进行查看。
无需进一步操作。但是,如果错误状况持续存在,您可以通过在该网站的反馈类别中发布讨论主题来提供更多详细信息,包括重现错误的步骤。
ppcole
2025 年2 月 23 日 19:45
82
您好,
如果策略位于不允许回复的“分类主题”中,是否还会显示“接受/撤销”按钮?
谢谢
ondrej
2025 年2 月 23 日 21:35
83
我有一段时间没用过这个插件了,但我认为它将允许用户在主题关闭时接受/撤销,因为按按钮不算回复,而这正是关闭所阻止的。
1 个赞
嗨,我有一个问题:
我们想使用 Discourse Policy 插件来:强制首次用户接受服务条款 (ToS) 。要求:
如果他们不接受 → 他们不能使用论坛(只能看到 ToS 页面)
当他们接受 → 他们可以使用论坛 + 获得一个 “ToS” 徽章
我的解决方案是创建一个新主题,并在其中添加了以下内容:
[policy group=trust_level_0 reminder=daily add-users-to-group=tos_accepted accept=“我接受条款” version=“1”]
点击“我接受条款”,我确认我已阅读并同意服务条款。
[/policy]
但是如果一个新用户登录,策略根本不显示,他可以做任何他想做的事情,我们希望只有在他点击“接受”后才能访问我们的页面。 如何做到这一点,谢谢
您可以使用自定义字段并链接服务条款和常见问题解答页面。用户阅读后将收到“已读指南”徽章。
2 个赞
感谢您的回复——它正如您所说的那样奏效了。但是,我真正想要的是在用户登录后显示此横幅,并且只有在用户单击“接受”后才允许访问该页面。如果用户不单击“接受”,横幅应保持可见,并且用户将无法与页面进行交互。
我现在拥有的是:
在此之后,用户可以正常访问我们的页面。
有什么方法可以做到这一点吗?谢谢。
david
(David Taylor)
2025 年7 月 22 日 13:14
87
此插件现已作为 Bundling more popular plugins with Discourse core 的一部分,随 Discourse 核心一起提供。如果您是自托管用户并使用了此插件,则需要在下次升级前将其从 app.yml 中移除。
3 个赞
jdc20181
(Jdc20181)
2025 年7 月 28 日 19:09
88
如果能添加在接受或拒绝 时移除 用户组的功能就太好了。
目前此功能仅会(可选地)提醒用户,并且添加用户——除非我遗漏了什么。
谢谢!
3 个赞
kiefferr
(Ryan Kieffer)
2026 年7 月 27 日 19:25
89
这很好,但它不足之处在于缺乏一种更明显、更可见的方式,向所有尚未同意该政策的人发送提醒。它几乎需要是一个弹出式提醒,而不是大多数用户永远不会看到的、隐藏在个人资料图标后面的简单通知。
这里有一个查询,可以识别出组中所有未同意的活跃用户。如果需要额外的跟进,这将非常有用。
WITH target_policy AS (
-- 查找与您的主题链接的主策略 ID
SELECT pp.id AS post_policy_id
FROM post_policies pp
JOIN posts p ON p.id = pp.post_id
WHERE p.topic_id = YOUR_TOPIC_ID
LIMIT 1
),
any_accepted_users AS (
-- 收集与此策略日志行关联的每个用户 ID
-- 绕过版本检查可防止旧签名扭曲结果
SELECT DISTINCT pu.user_id
FROM policy_users pu
JOIN target_policy tp ON tp.post_policy_id = pu.post_policy_id
WHERE pu.accepted_at IS NOT NULL
)
SELECT
u.id AS user_id,
u.username,
u.name,
ue.email,
u.last_seen_at
FROM users u
-- 安全地获取主电子邮件账户
LEFT JOIN user_emails ue ON ue.user_id = u.id AND ue.primary = true
-- 将目标池严格限制在特定组
JOIN group_users gu ON gu.user_id = u.id
JOIN groups g ON g.id = gu.group_id
WHERE g.name = 'YOUR_GROUP'
AND u.active = true
AND u.id > 0 -- 排除默认系统/机器人账户
-- 硬删除策略日志数据库块中存在的任何用户 ID
AND u.id NOT IN (SELECT user_id FROM any_accepted_users)
ORDER BY u.last_seen_at DESC
1 个赞