リンク訪問時にバッジを付与

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

特定の投稿の post_id を、その投稿の JSON から取得するか、データエクスプローラーで検索する必要があります。

「いいね!」 2

これでうまくいくと思います。

このバッジは、コースのメンバーにのみ付与したいと思います。
トピックを一般公開から非表示にし、リンク経由でクリックした人のみが利用できるようにする方法はありますか?

次に、これを Dfata Explorer プラグインを使用してどのように実行できますか?

どのような方法でこれを行おうとしているのか、100%確信が持てません。設定を複雑にしすぎていないか、確認することをお勧めします。

JSONの確認が苦手な場合、post_idルックアップクエリは以下のようになります。

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

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

その後、投稿のURLからtopic_idとpost_numberを抽出し、パラメータボックスに入力できます。例:https://meta.discourse.org/t/grant-badge-when-user-visits-link/276700/4 (OPはトピックリンクに表示されていなくても、常にpost_number 1であることに注意してください)


実は、データエクスプローラーを使用してpost_idを検索するのをさらに簡単にする魔法のパラメータがあります…

-- [params]
-- post_id :url

SELECT id
FROM posts
WHERE id = :url

関連する投稿のURLをパラメータボックスに貼り付けると、はい、これで post_id が表示されます :slight_smile:

「いいね!」 1

これを試しましたが、IDが出力されません。空白です。

赤い背景は、完全な投稿URLではないことを示唆しています。トピックURLの場合は、末尾に /1 を追加する必要があります。

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

「いいね!」 1

うまくいきました!

投稿URLを「/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

これを実行しましたが、まだ付与されていません。

参考までに、私の方では動作します。

有効にしましたか?また、正しいトピック番号が設定されていることを確認しましたか?

はい、有効になっています。別のプロファイルで試してみます。おそらく私が管理者だからかもしれません。

次に、トピックリンクをブラウザに貼り付けているだけですか?

管理者であっても、この件に関しては違いはありません。
このバッジの基となっている topic_views テーブルに登録するには、トピックにアクセスする必要があります。