Plugin for embedding Discourse topics in wordpress pages or posts


I did a quick and dirty wordpress plugin so you can easily embed topic content in your wordpress pages using a shortcode. It is still beta AND I’m not a webdevelopper so be careful using it for the moment.

To use it, you just need to provide the url of your discourse forum in the plugin settings and then add this shortcode [discourse topic_id='xxx'] in the editor.

It will include the first post of the topic as pure html in the wordpress page. I did it so our community can create and maintain their project presentation on the forum while it is nicely displayed in the main web site.

Here you have an example:

The code is here:

It stills miss some CSS and template but the base is here.
Contributions and extensions are very welcome :slight_smile:


Very neat, this is close to something I’ve been looking for a solution for.

Would a switch, to show the entire thread, be easy to implement?

How easy would it be to reverse the post order?

It is quite easy, Discourse give a very complete json file with everything you need and a data structure well thought.

I get the first post like this $parsed_json['post_stream']['posts'][0]['cooked'];

But if you want to display all posts, it should be something like this

$all_posts = $parsed_json['post_stream']['posts'];
foreach ($all_posts as $post) {
    echo $post['cooked'];

If you want reverse order:

$all_posts = $parsed_json['post_stream']['posts'];
foreach (array_reverse($all_posts) as $post) {
    echo $post['cooked'];

If you want to play with it, you just need to change this file:

I will give a try if I find some time

1 Like

Any ideas for resolving this issue: The plugin makes the admin very slow?

I have this problem with our big site but on a fresh local wordpress it is not significant.

Maybe using a profiler could help find it

This works very well. It would be nice to have an option on the Discourse side for including/excluding posts in a topic. This could be useful for writing documentation.

Yep it is quite easy to do. I just began by my need but lot of people ask for displaying all posts too.

Yet it would be better to have a kind of template and how to do it is not clear to me. Is there some wordpress dev ?

This is a very useful plugin and very easy to get going.

Displaying /uploads (images and linked files) is broken on my test install. The WP site has https and the Discourse is http, and the URLs are getting rewritten somewhere. I suspect this is no direct fault of the plugin (between Cloudflare and W3 Total cache I have some suspected culprits).

First, I would love to see something like this pulled into the official WP-Discourse plugin. Some of what follows (API integration, etc.) is already part of its functionality.

I’m not a developer either, and wish I could help more. The following are some thoughts on it so far. Not trying to be critical, just thinking out loud and relaying experiences.


  • It would be extra interesting if this got a Discourse API key so WP could access private/group forums. I was thinking it would be cool to have pages a certain set of users could edit via wiki, and that would automatically populate the main site. There may be cases where discussion would be better restricted to logged-in or group users.
  • Button 1 in the image has no http/https protocol on the link. Not sure if that’s from my WP settings or the plugin.
  • Not sure where the theme is picking up button 2. It happens that I can and intend to turn the sharing section off on this page anyway, but it is a curiosity.
  • Displaying the Discourse title and the WP title can be redundant. The ability to toggle this in the WP post edit window would be helpful. Less elegant, but hiding via CSS should more or less suffice.
  • Displaying the author (in this example, discourse) might be a candidate for toggling as well. As with the title, CSS is probably an okay workaround.

Where is uploaded your images ? Is it on the discourse server or on amazon ?

Normally this ugly function do the job:

function add_base_url_to_link($cooked, $base_url){
  $relative_image_path = 'src="/uploads';
  $absolute_image_path = 'src="'.$base_url.'/uploads';
  $new_content = str_replace($relative_image_path, $absolute_image_path, $cooked, $count);

  $relative_user_avatar_path = 'src="/user_avatar';
  $absolute_user_avatar_path = 'src="'.$base_url.'/user_avatar';
  $new_content = str_replace($relative_user_avatar_path, $absolute_user_avatar_path, $new_content, $count);

  $relative_user_path = 'href="/users';
  $absolute_user_path = 'href="'.$base_url.'/users';
  $new_content = str_replace($relative_user_path, $absolute_user_path, $new_content, $count);

  return $new_content;

Another way to do this is to create a wordpress custom-post-type for Discourse topics that takes the Discourse forum base_url and topic_id and uses them to fetch the content for the post. The benefit of this is that it allows the Discourse content to be edited in WordPress, and it allows the content to be cached. The downside is that you have to enable CORS on the forum. Also, the content on wordpress is no longer synced live with the content on the forum. That could be a good or a bad thing, depending on what you are trying to accomplish. (this works but isn’t ready for a production site)

I think this can be simplified quite a bit. There’s no need for a custom post type. By leaving it out, access to forum content could always be available through a meta box.

New feature: custom CSS

There is a field in the admin so you can change default CSS for the discourse integration (the class is discourse-topic-integration):

results of this amazing color choice:

Looking for contributors

I’m already reaching the max of my wordpress developper skills. It would be great to have some people to work with on the development so it can become a real solution for prod.


Release 0.3

There are now templates and you can choose which one to use using the new shortcode option type="subject/full/reverse-full" (requested by @steve_pd) for example:

[discourse topic_id="xxx" type="reverse-full"]

You can download updates here:

1 Like

I’d like to help if I can.

One problem I see with the ‘full’ option is that it is only downloading the first 20 (or whatever the forum chunk_size is set at) posts in the topic. If there are more than 20 posts in the topic, should there be a ‘load more posts’ link at the bottom of the page?

Indeed … the json file only retrieves the first 20 posts BTW the reverse template does not work too.

People can contribute by raising or fixing issues:

1 Like

Version 0.3 dealt with most of my earlier hangups. Thanks, @Matthieu

The ability to give API credentials to allow the plugin to pull from private forums would be icing on the cake, but I understand that would add significant complexity.

Nice job.

If there is a clear method on how to do it, it could be done…

Release 4.1

  • Remove author info in subject only template
  • add author-info template if you want to include it

If you want to see how it works, this release is deployed on our project website.

Here two examples:

==> wordpress:

==> wordpress:

I added custom CSS:

  text-align: center;
.discourse-topic-link {
  font-size: 20px;
  padding-bottom: 11px;
  padding-left: 24px;
  padding-right: 24px;
  padding-top: 11px;
  background-color: rgb(108, 108, 106) !important;

Sorry if this looks like cross-posting, but I think this topic is quite connected - I’d like to put a note here about a new alternative plugin that is also capable of displaying Discourse posts in WordPress: