当用户访问链接时授予徽章

如何在 discourse 论坛中用户访问链接时自动授予徽章?
例如:https://myforum.example.com?special_access=true

可以考虑使用 topic_link_clicks 表吗?

我想我可能有一个手动徽章可以从中受益。 :thinking: 我会好好想想。

1 个赞

如果它是在特定帖子中共享的特定链接,我认为这个链接可以做到:

SELECT DISTINCT tlc.user_id, MIN(tlc.created_at) granted_at
FROM badge_posts p
  LEFT JOIN topic_links tl ON tl.post_id = p.id
  LEFT JOIN topic_link_clicks tlc ON tlc.topic_link_id = tl.id
WHERE tl.post_id = 1246
  AND tl.url = 'https://meta.discourse.org/'
  AND tlc.user_id IS NOT NULL
GROUP BY tlc.user_id

您需要从特定帖子的 JSON 中获取 post_id(或通过数据浏览器进行查找)。

2 个赞

我认为这可能会奏效。
我只想将此徽章授予我们课程的学员。
有什么方法可以隐藏一个主题,使其不被公众看到,并且只有通过链接点击它的人才能访问?

其次,如何使用 Dfata explorer 插件完成此操作?

I’m not 100% sure I’m following the method you’re using for this? You may want to have a check that you’re not overcomplicating the setup.

If checking the json isn’t your cup of tea, then a post_id lookup query would be something like this:

-- [params]
-- topic_id :topic_id
-- int :post_number

SELECT id
FROM posts 
WHERE topic_id = :topic_id
  AND post_number = :post_number

Then you can use the URL of the post to pull out the topic id and post number to enter into the parameter boxes. eg: https://meta.discourse.org/t/grant-badge-when-user-visits-link/276700/4 (worth noting that the OP is always post_number 1, even if it’s not in the topic link)


Actually, there’s a magic parameter that might make looking up a post_id using the data explorer even easier…

-- [params]
-- post_id :url

SELECT id 
FROM posts
WHERE id = :url

Paste the relevant URL for the post into the parameter box, et voila - it pops out the post_id :slight_smile:

1 个赞

我刚试过这个,但它没有输出任何 ID。它只是空白的:

红色背景让我认为它不是一个完整的帖子 URL。如果它是一个主题 URL,你需要在末尾加上 /1

https://meta.discourse.org/t/grant-badge-when-user-visits-link/276700/1

1 个赞

那奏效了!

我猜这需要替换为包含“/1”的帖子网址?

这部分需要替换为他们在帖子中点击的链接。

而 post_id 是粘贴/分享链接的帖子。

我明白了,所以没有办法仅仅通过访问帖子链接来授予徽章?

我认为应该有,但这将是一个不同的查询。:slight_smile: 这个查询是为点击特定论坛帖子中的特定链接而授予徽章。

如果您想为用户访问特定主题授予徽章,我认为应该是:

SELECT DISTINCT tv.user_id, MIN(tv.viewed_at) granted_at
FROM topic_views tv
WHERE tv.topic_id = 728
GROUP BY tv.user_id

(将“728”替换为相关的 topic_id)

1 个赞

我的设置如下:

但是当我(作为管理员)访问相关帖子时,我没有获得徽章。是我哪里做错了?

由于它需要“每日更新”触发器,因此将在下次运行每日徽章授予作业时授予。如果您想加快检查速度,可以从 /sidekiq/scheduler 页面手动触发 Jobs::BadgeGrant

1 个赞

如何才能让它立即更新?

唯一可用的触发器是:

  • 每日更新
  • 用户编辑或创建帖子时
  • 用户被编辑或创建时
  • 用户对帖子执行操作时
  • 用户被编辑或创建时
  • 用户更改信任等级时

要获得更即时的徽章授予,您需要在这些操作的范围内进行工作。您可以在此主题中阅读更多内容 - Creating triggered custom badge queries

2 个赞

我执行了此操作,但仍未获得。

FWIW,对我来说是有效的。

您是否已启用它?并且您是否确保已设置了正确的主题编号?

是的,已启用。让我再试一个配置文件。也许是因为我是管理员。

其次,您只是将主题链接粘贴到浏览器中吗?

管理员身份对此没有影响。

您需要访问该主题,它才会记录在该徽章所依据的 topic_views 表中。