Why use Wordpress Blog if I have Discourse?


(John Waltrip) #1

Newbie here. Not sure why I would need a Wordpress blogging engine if I’ve got Discourse. Can someone please help me understand the benefits of what Wordpress would give you? It seems to me like Discourse alone would suffice as a standalone blogging platform, but I think I might be missing something.


#2

Different animals but I guess you could use Discourse for blogging? Would people find it intuitive though? And repetition of username might look a bit silly on Topic List view?

I’d say there are way more varied pre-baked themes available for Wordpress and and arguably Discourse is overkill for blogging with all of its community management and moderation functionality?


(Colin Marshall) #3

What kind of blogging are you hoping to do and who is your audience? For you it might make sense to keep it all on Discourse but I think the majority of people would use WordPress as the main site, not just a blogging platform, and integrate their Discourse forum by using Discourse for comments. It’s a way to merge a traditional website with a forum.


#4

You can totally just use Discourse if you don’t need to leverage WP functionality.

Janitor do. They use a staff only tag to define what is published.


(John Waltrip) #5

Main site is a Shopify store, the forum is where we crowd-source ideas for our products. Right now the majority of our traffic is on our forum. Blog content would serve a private and public audience.


(Colin Marshall) #6

Maybe you could use the built-in blogging capability of Shopify for the public stuff so it’s more visible and then Discourse for the private stuff? If you’re already using Shopify and Discourse, throwing WordPress in the mix seems unnecessary to me.


(John Waltrip) #7

I’d like to drive traffic to the forum, I think it is a good sales incubator. I’m not seeing the case for Wordpress either, but it makes me wonder why Discourse uses it (unless their main site is run off Wordpress).


(Colin Marshall) #8

I don’t think their main site is WordPress. Discourse doesn’t “use” WordPress per se, it offers an official integration for it. I would guess the reason for that is because WordPress is the most widely used platform/CMS for websites, and using Discourse in place of WP comments is a nice way to drive blog traffic to your forum, while also integrating your forum with your main WP website.


(Stephen) #9

The big reason to use WP and Discourse for your community is how the two scale.

A small server with aggressive caching running WordPress will scale far further than the same system running Discourse. If you publish a bunch of static content then WP is a great place to situate it - it’s great at serving high volumes and has all kinds of plugins to cache and optimise for such scenarios. Even a small DO VPS can serve thousands of users when optimised correctly in combination with a CDN or service like CloudFlare.

Discourse on the other hand is an application in the true sense of the phrase, every user is hitting the backend.

None of this is necessarily a bad thing, they’re just designed for different purposes.


(John Waltrip) #10

It looks like Discourse uses Wordpress for their blog on blog.discourse.org. Is seems redundant to me to have this here if it’s mostly replicated on blog - Discourse Meta and you are directed to go back to the forum to post comments. I wonder if Google thinks the content is duplicated, too, just seems easier to have all on Discourse in this case and lose Wordpress.


(Blake Erickson) #11

Valid concern, but if everything is setup correctly by specifying which URL is the canonical one google won’t have any issues.

You absolutely can just use Discourse, but here would be a few benefits to using a blog (whether it be WordPress, the built in Shopify one, or some other platform):

  • Longer topic previews (or show the whole post) when you go to the blog page rather than just looking at titles that you have to click on.
  • It’s part of your sales pipeline. Due to the design of the blog vs the forum it might be easier for someone to stumble upon a blog post and then easily end up on the “buy” page or sign up for an email newsletter.
  • It can be a lot easier for users to scroll through and read just the blog posts compared to being distracted by all the user generated content on the forum.
  • Having a blog also I think paints the clear distinction between only we can create blog posts compared to user generated content on the forum.
  • A separate (possibly) cleaner design with one purpose
  • Ordering. Blog posts are always in the same order, but topics on a forum will get bumped if a user comments on them.

Does everyone need a blog? Nope. I think you just need to analyze what your business/community needs are.

But I am very interested in people just using Discourse as a blogging platform. Even though Discourse is a forum at heart, I think with some plugins like Topic List Previews and maybe a few other changes you can make a pretty nice looking blog.


(Michael Howell) #12

Janitor replicates the blog from Discourse, instead of just linking to it directly, partially to help make it look more “official”, but mostly for performance.

https://www.webpagetest.org/video/compare.php?tests=180614_7H_1991bf6a022d5d186af391c795da9e5b,180614_72_0cab349f84c94bc9567a7c737ad593c1


(John Waltrip) #13

Maybe it’s because i’m new to forums, and when you’ve got a hammer everything looks like a nail, but I’m interested in the idea of a broader use case for forums, especially if it’s central to your brand. For example, if you sell products, being able to use the forum features to have conversations with consumers pre/post purchase over the individual products for sale, answer questions, etc. strikes me as a more engaging and transparent way to interact with customers than your typical rating system of hand picked product reviews.


(Christoph) #14

As has been said, if you intend to use other WordPress features/plugins, you might as well do your blog on WP. I believe for people earning a living from their blog, collecting email subscribers is crucial and my uneducated guess would be that a forum can’t replace that because people will be much more reluctant to sign up for a forum. So my hunch is that a forum is the next step in the sales funnel: keeping the more interested people engaged (and have them produce content for you).

On the other hand, I think a strong argument for using discourse for blogging applies when your blog posts are less about informing people but about starting a conversation. But that doesn’t sound like a typical business strategy to me…


(Ben Curthoys) #15

My marketing person says that the problem with using Discourse (or any forum) as a Blog is that because it can be written to by 3rd parties it is basically ignored by search engines. Remember when forums all filled up with spam links? Well, as well as being blocked by forum developers, the search engines noticed and just ignored it all.

Most of the reason my business wants a blog is so that people share links to blog articles, and we get traffic to the site and search engine ranking that way, and that’s no good if google won’t index forums.

But I’m lazy and I don’t want to host and run a whole copy of wordpress for functionality that I don’t really need. So I wrote a small ASP.NET page that picks up the forums posts from the JSON feed, and just basically spits them out of an ASP.NET page that looks more like a blog.

Thus:

http://forums.monadticketing.com/c/blog

gets turned into

http://www.monadticketing.com/blog.aspx

Code looks like this:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using System.Net.Http;
using Newtonsoft.Json;
using System.Web.UI.HtmlControls;

namespace MonadSite
{
    public partial class Blog : System.Web.UI.Page
    {
        private string _TopicId;
        private string _BlogDateFormat;
        protected void Page_Load(object sender, EventArgs e)
        {
            _TopicId = Request.QueryString["TopicId"];
            _BlogDateFormat = "MMM d, yyyy";

            Discourse d = new Discourse();

            List<BlogTopicDT> blogPosts = d.GetDiscourseBlogPosts(_TopicId);

            rptBlogPosts.DataSource = blogPosts;
            rptBlogPosts.DataBind();

        }
        
        protected void rptBlogPosts_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                BlogTopicDT data = (BlogTopicDT)e.Item.DataItem;

                Literal litTopicTitle = (Literal)e.Item.FindControl("litTopicTitle");
                Literal litTopicDate = (Literal)e.Item.FindControl("litTopicDate");
                Literal litTopicPoster = (Literal)e.Item.FindControl("litTopicPoster");
                if (!String.IsNullOrEmpty(data.Html))
                {
                    litTitle.Text = data.Title;
                    litDate.Text = data.DateTime.ToString(_BlogDateFormat);
                    litPoster.Text = data.Poster;
                    imgPosterAvatar.ImageUrl = data.Avatar;
                    litBlogPost.Text = data.Html + "<p class=\"monad-blogpost-links\"><a href=\"" + data.BlogUrl  + "\">Permalink</a> | <a href=\"" + data.ForumUrl + "\">Discuss on our forums</a></p>"; ;
                }
                else
                {
                    litTopicTitle.Text = "<a href=\"" + data.BlogUrl + "\"> " + data.Title + "</a>";
                    litTopicDate.Text = data.DateTime.ToString(_BlogDateFormat);
                }
            }
        }
    }

}

and

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;

namespace MonadSite
{
public class Discourse
{
private CookieContainer _CookieContainer = new CookieContainer();
public static string BaseAddress = “http://forums.monadticketing.com”;
private HttpClient client;

    public Discourse()
    {
        HttpClientHandler handler = new HttpClientHandler
        {
            CookieContainer = _CookieContainer
        };
        client = new System.Net.Http.HttpClient(handler)
        {
            BaseAddress = new Uri(BaseAddress)
        };

        // Add an Accept header for JSON format.
        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
    }

    public List<BlogTopicDT> GetDiscourseBlogPosts(string TopicId)
    {
        List<BlogTopicDT> blogPosts = new List<BlogTopicDT>(); ;

        dynamic blogTopics = GetData("/c/9.json");


        foreach (dynamic blogTopicHeader in blogTopics.topic_list.topics)
        {
            BlogTopicDT blogPost = new BlogTopicDT();

            blogPost.TopicId = blogTopicHeader.id;
            blogPost.Title = blogTopicHeader.title;
            blogPost.DateTime = blogTopicHeader.created_at;
           
            blogPosts.Add(blogPost);
        }

        blogPosts = blogPosts.OrderByDescending(x => x.DateTime).ToList();


        int counter = 0;
        foreach (BlogTopicDT blogPost in blogPosts)
        {
            if (string.IsNullOrEmpty(TopicId))
            {
                if (counter == 0)
                {
                    GetDiscourseBlogPost(blogPost);
                }
                counter++;
            }
            else
            {
                if (blogPost.TopicId == TopicId)
                {
                    GetDiscourseBlogPost(blogPost);
                }
            }
        }
        return blogPosts;
    }

    private BlogTopicDT GetDiscourseBlogPost(BlogTopicDT blogPost)
    {
        dynamic blogTopicPosts = GetData("/t/" + blogPost.TopicId + ".json");

        blogPost.Title = blogTopicPosts.title;
        blogPost.Slug = blogTopicPosts.slug;
        blogPost.Poster = blogTopicPosts.details.created_by.username;
        blogPost.Avatar = string.Format("http://forums.monadticketing.com{0}", blogTopicPosts.details.created_by.avatar_template).Replace("{size}", "45"); ;
     
        dynamic post = blogTopicPosts.post_stream.posts[0];
        blogPost.Html = post.cooked;


        return blogPost;
    }

    public BlogTopicDT GetDiscourseBlogPost(string TopicId)
    {
        BlogTopicDT blogTopic = new BlogTopicDT();
        blogTopic.TopicId = TopicId;

        GetDiscourseBlogPost(blogTopic);
        return blogTopic;

    }

    private dynamic GetData(string v)
    {
        HttpResponseMessage response = client.GetAsync(v).Result;  // Blocking call!

        var serializerSettings = new JsonSerializerSettings
        {
            DateFormatString = "yyyy-MM-dd'T'HH:mm:ss.fff'Z'"
        };

        if (response.IsSuccessStatusCode)
        {
            return JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result, serializerSettings);
        }
        else
        {
            Exception ex = new Exception(String.Format("Error in Discourse GetData: {0} - {1}", (int)response.StatusCode, response.ReasonPhrase));
            throw ex;
        }
    }
}

public class BlogTopicDT
{
    public string TopicId;
    public string Title;
    public string Html;
    public DateTime DateTime;
    public string Slug;
    public string Avatar;
    public string Poster;
    public string ForumUrl
    {
        get
        {
            return String.Format("{0}/t/{1}/{2}", Discourse.BaseAddress, Slug, TopicId);
        }
    }

    public string BlogUrl
    {
        get
        {
            return String.Format("/Blog.aspx?TopicId={0}", TopicId);
        }
    }
}

}

(I’m not even slightly interested in anyone having a go at the code quality above, it was for internal use only on one page and I don’t need it to scale and it was written in about an hour.)


(Jeff Atwood) #16

This is … not even remotely true.


(Ben Curthoys) #17

Having just tested her assertion by searching for the exact title of one of her blog posts, and seeing that the discourse forum version shows up above the bloggy aspx / website version, I’m inclined to agree with you.


(Stephen) #18

If that’s the “expertise” guiding the marketing aspects of your company then you probably need to go back out to market to find some real expertise.

They might be referring to how forums typically implement rel=“nofollow” on links shared by untrusted users, which reduces SEO value of those links specifically, but your team/staff wouldn’t be impacted by this. Total fiction.


(Colin Marshall) #19

There’s not a lot of “extra” functionality in a barebones WP site, and in the time you took to write that code you could have had a blog up and running with Discourse comments integrated.

You could also go with a static site and use Jekyll with Discourse commenting.

You’re perfectly fine using Discourse for your blog, but I personally prefer blogs to look less like a forum topic.