![]() |
Summary | Discourse Solved allows users to accept solutions on topics in designated categories. |
![]() |
Repository Link | https://github.com/discourse/discourse-solved |
![]() |
Install Guide | How to install plugins in Discourse |
Configuration
Edit category you wish to enable accepted answers on:
As the OP (topic creator) you will have a button that allows you to accept an answer
Accepted answers are highlighted in the topic list:
Accepted answers are highlighted on the initial topic:
Enable the empty box on unsolved setting to display an empty box next to unsolved topics
It is possible allow users to select solutions on all topics, regardless of the category, by enabling the site setting allow solved on all topics
Search
When searching for topics, you can filter the search to only solved or unsolved topics via the status:solved
and status:unsolved
queries. “are solved” and “are unsolved” can also be found via the “Where topics” dropdown.
Filters
You can enable filter dropdown in topic list pages using the site setting show filter by solved status
(Requires Discourse 2.3.0.beta5 or above).
Also you can filter by solved/unsolved topics by adding a parameter to the URL. For example:
https://meta.discourse.org/c/support?solved=yes
or
https://meta.discourse.org/c/support?solved=no
These links could be added above a specific category list by following the instructions here
CHANGELOG
TODO
Extras
Badges
As it stands our plugin system has no clean way of shipping badges and removing them when plugin is removed. While this is being solved you can add badges to your liking via the badge interface.
A badge for first accepted answer:
SELECT p.user_id, p.id post_id, p.updated_at granted_at
FROM badge_posts p
WHERE p.post_number > 1 AND
p.id IN (
SELECT post_id FROM (
SELECT pc.post_id, row_number()
OVER (PARTITION BY p1.user_id ORDER BY pc.created_at) as rnum
FROM post_custom_fields pc
JOIN badge_posts p1 ON p1.id = pc.post_id
JOIN topics t1 ON p1.topic_id = t1.id
WHERE name = 'is_accepted_answer' AND
value IS NOT NULL AND
p1.user_id <> t1.user_id AND
(
:backfill OR
p1.user_id IN (
select user_id from posts where p1.id IN (:post_ids)
)
)
) X WHERE rnum = 1)
For example: https://meta.discourse.org/badges/125/helpdesk
A badge for 10 accepted answers
SELECT id user_id, current_timestamp granted_at
FROM users
WHERE id IN (
SELECT p1.user_id
FROM post_custom_fields pc
JOIN badge_posts p1 ON p1.id = pc.post_id
JOIN topics t1 ON p1.topic_id = t1.id
WHERE p1.user_id <> t1.user_id AND
name = 'is_accepted_answer' AND
value IS NOT NULL AND
p1.user_id IN (
SELECT user_id
FROM posts
WHERE :backfill OR p1.id IN (:post_ids)
)
GROUP BY p1.user_id
HAVING COUNT(*) > 9
)
https://meta.discourse.org/badges/126/tech-support
Data Explorer Queries
To list each individual “solved” event:
SELECT acting_user_id, target_topic_id, target_post_id, created_at FROM user_actions
WHERE action_type=15
ORDER BY created_at DESC
To produce a list with stats per-user: (with variable for time interval, defaults to 1 year):
-- [params]
-- string :interval = 1 year
SELECT ua.acting_user_id,
count(case t.user_id when ua.acting_user_id then 1 else null end) as is_op,
count(case t.user_id when ua.acting_user_id then null else 1 end) as not_op,
count(*) as total
FROM user_actions ua
LEFT JOIN topics t ON target_topic_id = t.id
WHERE action_type=15
AND ua.created_at >= CURRENT_DATE - INTERVAL :interval
GROUP BY ua.acting_user_id
ORDER BY total DESC
Original spec discussion
This is an official plugin, we plan to ship it to all our customers. Thank you to Western Digital for funding the development of this plugin!