Discourse Solved

:discourse2: Summary Discourse Solved allows users to accept solutions on topics in designated categories.
:hammer_and_wrench: Repository Link https://github.com/discourse/discourse-solved
:open_book: Install Guide How to install plugins in Discourse

Enabling Solved

The Solved plugin can be enabled from its settings, accessed from your admin/plugins page:

After enabling the plugin, to switch on Solved for all categories use the allow solved on all topics site setting.

Alternatively, if you’d like to apply it per category instead:

  • Go to the category you’d like to enable solutions in and click on the Category Wrench

  • Switch to the Settings tab

  • Scroll down and enable Allow topic owner and staff to mark a reply as the solution

Marking the Solutions

The OP (topic creator) will have a 'Solution` button on each reply that allows/encourages them to accept an answer:

And for other users who can accept an answer (eg. admin or moderators) the same option will show as a more discreet checkbox:

Accepted answers are then highlighted in the first post of the topic:

And topics with accepted answers are marked in the topic list with a checked box:

Some sites might also benefit from an unsolved indicator on topic lists as well, which can be enabled using the empty_box_on_unsolved site setting:

Auto-close topic once solved

From the main Solved admin settings you can set a timer to close a topic once it has received a solution using the solved topics auto close hours admin setting:

Alternatively, one can be set per category from the category wrench menu on the Settings tab:

Search & Filters

Search

The Solved plugin comes with some extra Advanced Search filters for solved or unsolved topics, which can be found in the “Where topics” dropdown:

Which will add status:solved or status:unsolved to your Search.

Filters

You can also enable a filter dropdown in topic list pages using the site setting show_filter_by_solved_status

solved-filter

You can also filter 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 these instructions:

Marked Solution Reminder

On topics where solutions are able to be marked, a “Has your question been answered” popup message will display when the following criteria is met:

  • The topic does not have an accepted answer
  • The topic has at least one reply from another user
  • The author of the topic is logged in and able to accept a reply as an answer
  • The topic has existed for at least 7 days

Has your question been answered

If you want to prevent this popup message from being displayed, you can use the following CSS in a theme component to hide it:

.topic-navigation-outlet.no-answer {
    display: none;
}
Extra details on how to add this to your site
  • Go to /admin/customize/themes
  • Click on install and then create new
  • Give it a name, and select ‘component’.
  • Create
  • Add it to your theme
  • Click on the Edit CSS/HTML button and paste the code into the Common tab

And save. :+1:

Settings

Name Description
solved enabled Enable solved plugin, allow users to select solutions for topics
allow solved on all topics Allow users to select solutions on all topics (when unchecked, solutions can be enabled per category or tag)
accept all solutions allowed groups Groups that are allowed to accept solutions on any topic (even when not OP)
empty box on unsolved Display an empty box next to unsolved topics
solved quote length Number of characters to quote when displaying the solution under the first post
solved topics auto close hours Auto close topic (n) hours after the last reply once the topic has been marked as solved. Set to 0 to disable auto closing
show filter by solved status Show a dropdown to filter a topic list by solved status
notify on staff accept solved Send notification to the topic creator when a post is marked as solution by a staff
disable solved education message Disable education message for solved topics
accept solutions topic author Allow the topic author to accept a solution
solved add schema markup Add QAPage schema markup to HTML
prioritize solved topics in search Prioritize solved topics in search results.
enable solved tags Tags that will allow users to select solutions

Solved Badges

Name Description Long Description Type Grouping
Solved! Have a reply marked as a Solution This badge is granted for having a reply marked as a Solution to a topic. :white_check_mark: Nice job. :+1: :3rd_place_medal: Community
Guidance Counsellor Have 10 replies marked as Solutions This badge is granted for having 10 of your replies marked as Solutions to topics. :white_check_mark: You are a true asset to your fellow community members. :2nd_place_medal: Community
Know-it-All Have 50 replies marked as Solutions This badge is granted for having 50 of your replies marked as Solutions to topics. :white_check_mark: You really know your stuff. :clap: :1st_place_medal: Community
Solution Institution Have 150 replies marked as Solutions This badge is granted for having 150 of your replies marked as Solutions to topics. :white_check_mark: Excellent work. :slightly_smiling_face: You are officially a Solution Institution. :brain: :1st_place_medal: Community

:information_source: These badges will be disabled by default. You can enable them from your admin/badges page

:discourse2: Hosted by us? This plugin is available on all of our hosting tiers Solved | Discourse - Civilized Discussion


Development History

Original spec discussion: Solved Button Plugin

Thank you to Western Digital for funding the development of this plugin!

Last edited by @JammyDodger 2024-06-18T15:18:09Z

Check documentPerform check on document:
159 Likes

Just an FYI - There’s a new Solved setting allowing you to prioritize solved topics in search :+1: You can find it in the Solved settings list, or by searching for prioritize solved topics in search in your admin settings.

8 Likes

image

It would be great to see a more visible icon used for solved threads. It’s not easy to distinguish between solved/unsolved with an icon that is the same colour as the font. A nice green tick like in the post itself would be more visible.

You can change that with the help of Solved Topic Badge

3 Likes

Ah thanks that looks perfect!

Hi,
I hope my comment is in the right place.
When i try to integrated this plugin with the current version on my local development of Discourse i am getting the error:

Failed to initialize site default: NameError uninitialized constant AtLeastOneGroupValidator

That’s why i am afraid to update the plugin on the live version in case the side doesn’t load with this error.

Does someone else have this error too?

2 posts were split to a new topic: Make unsolved filter behave the same as status:unsolved search

Hey,

It would be great to have a Solved / Unsolved toggle on the category’s top bar, where we have Latest / Unread / Top.

Thanks!

Hey @Anat_Srulovitch :wave:

Is this what you mean?

4 Likes

Yay, it is! Thank you very much! I didn’t notice that bit of text :slight_smile:

1 Like

It seems that this plugin isn’t compatible wich my docker versionn of discours from bitnami. I alwasy get an error when precompiling:

 /opt/bitnami/discourse# RAILS_ENV=production bundle exec rake assets:precompile
        83: from /opt/bitnami/ruby/bin/bundle:25:in `<main>'
        82: from /opt/bitnami/ruby/bin/bundle:25:in `load'
        81: from /opt/bitnami/ruby/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/exe/bundle:20:in `<top (required)>'
        80: from /opt/bitnami/ruby/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
        79: from /opt/bitnami/ruby/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/exe/bundle:28:in `block in <top (required)>'
        78: from /opt/bitnami/ruby/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler/cli.rb:29:in `start'
        77: from /opt/bitnami/ruby/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
        76: from /opt/bitnami/ruby/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler/cli.rb:35:in `dispatch'
        75: from /opt/bitnami/ruby/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler/vendor/thor/lib/thor.rb:527:in `dispatch'
        74: from /opt/bitnami/ruby/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
        73: from /opt/bitnami/ruby/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
        72: from /opt/bitnami/ruby/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler/cli.rb:455:in `exec'
        71: from /opt/bitnami/ruby/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler/cli/exec.rb:23:in `run'
        70: from /opt/bitnami/ruby/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler/cli/exec.rb:58:in `kernel_load'
        69: from /opt/bitnami/ruby/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler/cli/exec.rb:58:in `load'
        68: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/bin/rake:25:in `<top (required)>'
        67: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/bin/rake:25:in `load'
        66: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/exe/rake:27:in `<top (required)>'
        65: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:80:in `run'
        64: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:208:in `standard_exception_handling'
        63: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:83:in `block in run'
        62: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:132:in `top_level'
        61: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:147:in `run_with_threads'
        60: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:138:in `block in top_level'
        59: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:138:in `each'
        58: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:138:in `block (2 levels) in top_level'
        57: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:182:in `invoke_task'
        56: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:188:in `invoke'
        55: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:199:in `invoke_with_call_chain'
        54: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:199:in `synchronize'
        53: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:218:in `block in invoke_with_call_chain'
        52: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:241:in `invoke_prerequisites'
        51: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:241:in `each'
        50: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:243:in `block in invoke_prerequisites'
        49: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:199:in `invoke_with_call_chain'
        48: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:199:in `synchronize'
        47: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
        46: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:281:in `execute'
        45: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:281:in `each'
        44: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:281:in `block in execute'
        43: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/sprockets-rails-3.4.2/lib/sprockets/rails/task.rb:61:in `block (2 levels) in define'
        42: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:188:in `invoke'
        41: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:199:in `invoke_with_call_chain'
        40: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:199:in `synchronize'
        39: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
        38: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:281:in `execute'
        37: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:281:in `each'
        36: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:281:in `block in execute'
        35: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.8/lib/rails/application.rb:506:in `block in run_tasks_blocks'
        34: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.8/lib/rails/application.rb:348:in `require_environment!'
        33: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/zeitwerk-2.6.12/lib/zeitwerk/kernel.rb:38:in `require'
        32: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/bootsnap-1.17.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
        31: from <internal:/opt/bitnami/ruby/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
        30: from <internal:/opt/bitnami/ruby/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
        29: from /opt/bitnami/discourse/config/environment.rb:7:in `<main>'
        28: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.8/lib/rails/application.rb:372:in `initialize!'
        27: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.8/lib/rails/initializable.rb:60:in `run_initializers'
        26: from /opt/bitnami/ruby/lib/ruby/3.2.0/tsort.rb:205:in `tsort_each'
        25: from /opt/bitnami/ruby/lib/ruby/3.2.0/tsort.rb:226:in `tsort_each'
        24: from /opt/bitnami/ruby/lib/ruby/3.2.0/tsort.rb:347:in `each_strongly_connected_component'
        23: from /opt/bitnami/ruby/lib/ruby/3.2.0/tsort.rb:347:in `call'
        22: from /opt/bitnami/ruby/lib/ruby/3.2.0/tsort.rb:347:in `each'
        21: from /opt/bitnami/ruby/lib/ruby/3.2.0/tsort.rb:349:in `block in each_strongly_connected_component'
        20: from /opt/bitnami/ruby/lib/ruby/3.2.0/tsort.rb:431:in `each_strongly_connected_component_from'
        19: from /opt/bitnami/ruby/lib/ruby/3.2.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
        18: from /opt/bitnami/ruby/lib/ruby/3.2.0/tsort.rb:228:in `block in tsort_each'
        17: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.8/lib/rails/initializable.rb:61:in `block in run_initializers'
        16: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.8/lib/rails/initializable.rb:32:in `run'
        15: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.8/lib/rails/initializable.rb:32:in `instance_exec'
        14: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.8/lib/rails/application/finisher.rb:87:in `block in <module:Finisher>'
        13: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/lazy_load_hooks.rb:75:in `run_load_hooks'
        12: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/lazy_load_hooks.rb:75:in `each'
        11: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/lazy_load_hooks.rb:76:in `block in run_load_hooks'
        10: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/lazy_load_hooks.rb:90:in `execute_hook'
        9: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/lazy_load_hooks.rb:85:in `with_execution_control'
        8: from /opt/bitnami/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.8/lib/active_support/lazy_load_hooks.rb:92:in `block in execute_hook'
        7: from /opt/bitnami/discourse/config/application.rb:239:in `block in <class:Application>'
        6: from /opt/bitnami/discourse/lib/plugin.rb:6:in `initialization_guard'
        5: from /opt/bitnami/discourse/config/application.rb:239:in `block (2 levels) in <class:Application>'
        4: from /opt/bitnami/discourse/config/application.rb:239:in `each'
        3: from /opt/bitnami/discourse/lib/plugin/instance.rb:551:in `notify_after_initialize'
        2: from /opt/bitnami/discourse/lib/plugin/instance.rb:551:in `each'
        1: from /opt/bitnami/discourse/lib/plugin/instance.rb:553:in `block in notify_after_initialize'
/opt/bitnami/discourse/plugins/discourse-solved/plugin.rb:384:in `block in activate!': undefined method `register_custom_filter_by_status' for #<Plugin::Instance:0x000014c958550218 @metadata=#<Plugin::Metadata:0x000014c958583028 @name="discourse-solved", @about="Allows users to accept solutions on topics in designated categories.", @meta_topic_id=30155, @version="0.1", @authors="Sam Saffron", @url="https://github.com/discourse/discourse-solved">, @path="/opt/bitnami/discourse/plugins/discourse-solved/plugin.rb", @idx=0, @enabled_site_setting=:solved_enabled, @assets=[["/opt/bitnami/discourse/plugins/discourse-solved/assets/stylesheets/solutions.scss", nil, "discourse-solved"], ["/opt/bitnami/discourse/plugins/discourse-solved/assets/stylesheets/mobile/solutions.scss", :mobile, "discourse-solved"]], @directory_name="discourse-solved", @initializers=[#<Proc:0x000014c95d8165d8 /opt/bitnami/discourse/plugins/discourse-solved/plugin.rb:19>], @styles=[], @javascripts=[], @locales=[], @service_workers=[], @seed_data={}, @extra_js_file_path="/opt/bitnami/discourse/app/assets/javascripts/plugins/discourse-solved_extra.js.erb", @asset_filters=[], @color_schemes=[]> (NoMethodError)

** INCOMPATIBLE PLUGIN **

You are unable to start Discourse due to errors in the plugin at
/opt/bitnami/discourse/plugins/discourse-solved
Please try removing this plugin and rebuilding again!

I’m using the latest discourse version. Any ideas?

Hey @Disane87 :wave: Welcome to Meta!

Have you considered using a standard install?

4 Likes

@Moin Considered yes, but its pretty unpracticable for me becaise I have an own server at home and want to host it by myself.

Didn’t saw that post, sorry!

Hello,
we love the solved plugin. Is there a way to add the solved yes/no filter to groups? We are using the groups (with email) for supprt ticketing like discourse (How Does Team Discourse Use Discourse?) so it would be wounderful to filter for unsolved tickets in group inbox.