WordpressからDiscourseへ投稿を公開するWP Discourse

You can use the WP Discourse Plugin to Publish Wordpress Posts to your Discourse so your community can talk about your Wordpress content. Before you can set up Publishing you first have to install the WP Discourse plugin on Wordpress and connect it to your Discourse. If you’re ready to get started, start by watching this short video, or follow the instructions below.

Next Step

Once you’ve set up publishing, you may want to check out the following topics


Instructions

Publishing Settings

:warning: Make sure you always save your settings after changing them. Click the ‘Save Options’ button at the bottom of the page.

The settings should be relatively self-explanatory. If you’re having an issue understanding any of them please reply to this topic for a further clarification.

Default Discourse Category

Sets the default category in which your posts will be published on Discourse. This setting can be overridden for individual posts on the WordPress post-new screen.

Display Subcategories

Indicates whether or not you want your forum’s subcategories to be available as categories that you can publish to from WordPress. You will need to save this setting before subcategories become available in the Default Discourse Category option input.

Force Category Update

For when you have added new categories to your forum and would like them to be available on your WordPress site. Enabling this setting and saving the options page makes a single API call to Discourse to retrieve the Discourse categories. After enabling it, the next time you navigate back to the Commenting tab, you will find the setting disabled.

Allow Tags

Enable this if you would like to add tags to Discourse topics that are created via WordPress.

Publish as Unlisted Topics

Will cause posts published from WordPress to be unlisted on Discourse. If you enable the Sync Comment Data webhook setting, unlisted posts will be made visible when they first receive a reply on Discourse.

Use Full Post Content

Let’s you publish full WordPress posts, rather than excerpts, to your Discourse forum. To keep the Show Full Post button from appearing under your post on Discourse, you must un-select the embed truncate site setting on Discourse (found at yourforum.com/admin/site_settings/category/posting.)

Custom Excerpt Length

If you have not selected the Use Full Post Content setting, this setting will create excerpts of that length to be published to Discourse. You can also manually create excerpts when you create a WordPress post by adding the excerpt to the Excerpt meta-box.

Auto Publish

This pre-check’s the Publish to Discourse checkbox that appears on the post-new screen for post-types that are to be published to Discourse. The checkbox can still be un-checked when creating the post.

Auto Track Published Topics

This setting is enabled by default. When enabled, the author of a post published to Discourse from WordPress will automatically be ‘Watching’ the topic (they will receive Discourse notifications about every new reply)

Post Types to Publish

This setting must be set. It defaults to post, but pages and custom post types may also be selected.

Exclude Posts By Tag

If you add Wordpress tags to this setting, any Wordpress post with one of the tags will not be published to Discourse.

Do Not Display Discourse Name Field

This will hide the “Discourse Username” field in user’s profiles. The Discourse Username is used to set the author of the topic when publishing posts to Discourse.

Discourse Username Editable

This determines whether non-admins are able to edit their own Discourse Username in their profile. The Discourse Username is used to set the author of the topic when publishing posts to Discourse.

Direct Database Publication Flags

This setting is used in certain setups that have specialized Wordpress environments. Don’t use this setting unless you know what it does.

Verbose Publication Logs

Enabling this setting will mean that all posts published to Discourse are logged in the WP Discourse logs, even if they succeed. Normally only errors are logged.

Enable posting by XMLRPC

XML-RPC is a remote procedure call that is often used by blogging software for sending posts to WordPress. Apps that use this procedure include the wordpress.com blogging app.

By default, WP Discourse will not publish posts to Discourse that are created through XML-RPC. The reason for this is that there is no great way to indicate whether a post published through blogging software is meant to be published on Discourse.

If you would like to use blogging software for creating posts that are directly published to Discourse, you need to add some code to your theme’s functions.php file that hooks into the wp_discourse_before_xmlrpc_publish filter. The wp_discourse_before_xmlrpc_publish filter passes two arguments to functions that hook into it. The first argument, $publish_to_discourse is a boolean that is set to false to disable publishing by XML-RPC. The second argument is the post object.

To have all XML-RPC posts automatically published by Discourse you need to write a function that will always return true. Use something like the following code:

Warning: this will cause all posts published through XML-RPC to be published to Discourse, this will include old posts that are edited on blogging software.

add_filter('wp_discourse_before_xmlrpc_publish', 'my_namespace_xmlrpc_publish', 10, 2 );
function my_namespace_xmlrpc_publish( $publish_to_discourse, $post ) {
  return true;
}

Filtering XML-RPC posts by post tag

The wordpress.com blogging app allows you to add tags to posts. Tags can be used to control whether or not a post is published to Discourse. To only publish posts that have a ‘discourse’ tag, use something like this:

add_filter('wp_discourse_before_xmlrpc_publish', 'my_namespace_xmlrpc_publish_by_tag', 10, 2 );
function my_namespace_xmlrpc_publish_by_tag( $publish_to_discourse, $post ) {
  if ( has_tag( 'discourse', $post ) ) {
    return true;
  }
  return false;
}

If you would like to use this method, but not have the discourse tag appear in your published posts, you can remove it with some code like this:

add_filter( 'term_links-post_tag', 'my_prefix_remove_discourse_tag' );
function my_prefix_remove_discourse_tag( $tags ) {
    foreach( $tags as $key => $value ) {
        if ( strpos( $value, 'discourse' ) ) {
            unset( $tags[ $key ] );
        }
    }

    return $tags;
}

Filtering XML-RPC posts by post date

To only allow posts published after a certain date to be published to Discourse through XML-RPC, add some code like this to your functions.php file. This code will allow all posts published after January 1, 2016 to be published to Discourse.

add_filter('wp_discourse_before_xmlrpc_publish', 'my_namespace_xmlrpc_publish_by_date', 10, 2 );
function my_namespace_xmlrpc_publish_by_date( $publish_to_discourse, $post ) {
  if ( strtotime( $post->post_date ) > strtotime( '2016-01-01') ) {
    return true;
  }
  return false;
}

Todo: add a filter to the wp-discourse plugin to allow for only publishing new posts (as opposed to edited posts) through XML-RPC.

Filtering the available categories for a custom post type

Before the Discourse categories are displayed in the Publish to Discourse meta-box on the Wordpress admin/post-new page, the Wordpress filter 'wp_discourse_publish_categories' is applied to them. It is given the Discourse categories array, and the current post as arguments. This can be used in your theme’s functions.php file to limit which categories are available for a given post type.

Here is an example that creates an 'acme_product' post type and then returns the Discourse categories ‘fun’ and ‘scratch’ to be displayed in the Publish to Discourse meta-box for posts of that type.

// Create the post type.
add_action(  'init', 'my_namespace_create_post_type' );
function my_namespace_create_post_type() {
  register_post_type( 'acme_product',
    array(
      'labels' => array(
      'name' => __( 'Products' ),
      'singular_name' => __( 'Product' )
    ),
    'public' => true,
    'supports' => array( 'title', 'editor', 'comments', 'custom-fields' ),
    'has_archive' => true,
    'show_in_rest' => true,
    )
  );
}

// Filter the available categories for the 'acme_product' post type.
add_filter( 'wp_discourse_publish_categories', 'my_namespace_filter_categories', 10, 2 );
function my_namespace_filter_categories( $categories, $post ) {
   if ( 'acme_product' === get_post_type( $post ) ) {
     $output = [];
     foreach ( $categories as $category ) {
        if ( 'fun' === $category['name'] || 'scratch' === $category['name'] ) {
          $output[] = $category;
        }
     }
     return $output;
   }
   return $categories;
}

If you want to strictly apply a specific category to specific post types (i.e. 1:1) then you should use wpdc_publish_post_category instead.

function wpdc_change_post_category( $category, $post_id ) {
  if ( 'acme_product' === get_post_type( $post ) ) {
       $categories = WPDiscourse\Utilities\Utilities::get_discourse_categories();
       $fun_category = array_search( 'fun' , array_column( $categories, 'name' ));
       return $fun_category;
  } else {
       return $category;
  }
}
add_filter( 'wpdc_publish_post_category', 'wpdc_change_post_category' );

Display metadata of a connected Discourse topic

When you have Publishing set up you can display metadata about the Discourse topic by using Template Customisation.

First, you need to decide which template you wish to modify. If, for example, you only wish to show topic metadata, and no replies as comments, then you’ll want to modify the no_replies template.

Once you’ve chosen a template, you can modify it to add Discourse topic metadata. Here’s a snippet that does that, with some comments explaining what the code is doing

// ensure wp-discourse is present using your preferred method,
// e.g. https://wordpress.stackexchange.com/questions/127818/how-to-make-a-plugin-require-another-plugin

// Require the plugin-utilities from the wp-discourse plugin
require_once ABSPATH . 'wp-content/plugins/wp-discourse/lib/plugin-utilities.php';
use WPDiscourse\Shared\PluginUtilities;

// Encapsulate your topic metadata template in a class so you can easily include the plugin utilities
class DiscourseTopicMetadata {
  
  // Include the wp plugin utilities in your class
  use PluginUtilities;
  
  public function __construct() {

    // Add the template filter on the initialization of the class
    add_filter( 'discourse_no_replies_html', array( $this, 'topic_metadata_html' ) );
  }

  function topic_metadata_html( $input ) {
    // Get the discourse permalink from the post metadata
    $discourse_permalink = get_post_meta( get_the_ID(), 'discourse_permalink', true );

    // Use the discourse permanlink to get the topic JSON from Discourse, using the helper method from the plugin utilities which handles authorization for you
    $topic = $this->get_discourse_topic($discourse_permalink);
   
    // Output your markup, including which topic metadata you wish to display
    ob_start();
    ?>
    <div id="discourse-topic-meta">
        <div class="views">
          Views
          <?php echo $topic->views; ?>
        </div>
        <div class="replies">
          Replies
          <?php echo $topic->reply_count; ?>
        </div>
    </div>
    <?php
    
    return ob_get_clean();
  }
}

// Instantiate the class to add the filter
new DiscourseTopicMetadata();

For more details on what topic metadata is available in the response from get_discourse_topic see Discourse API Docs.

「いいね!」 9

以前投稿したブログ記事をインポートすることはできますか?例えば、過去30日以内のブログ記事などです。カテゴリを少しでも充実させるために。よろしくお願いします。

「いいね!」 2

現時点では一括インポートオプションはありません。代わりに、古い投稿をそれぞれ編集して Discourse に公開することで、これを実現できます。

「いいね!」 2

WordPress のサイトを設定しており、ログインできるのはごく一部の人(著者)だけです。しかし、Discourse はほぼ誰でも利用できます。Discourse は認証に使用されます。

記事から作成されたトピックに、「システム」(または「公開ユーザー名」に設定されているもの)ではなく、Discourse ユーザー名が表示されるようにしたいと考えています。

言い換えると、「公開ユーザー名」は「システム」に設定されています。Joe Blow が WordPress で新しい記事を投稿します。Joe Blow は Discourse に存在します(Discourse が認証を制御しているため、すべての WordPress ユーザーは Discourse ユーザーでもあります)。トピックがシステムではなく Joe Blow によって投稿されたと表示されるようにしたいです。後で、同じサイトで Jane Doe が記事を投稿した場合、Discourse のトピックがシステムではなく Jane Doe によって投稿されたと表示されるようにしたいです。

これは可能でしょうか?

わかりません。しかし、Publish タブを確認し、その中の最後のオプションである Single User API Key Publication を試してみるのが良いと思います。

DiscourseSSO(または他の接続方法)を使用している場合、WordPressを経由せずにフォーラムに登録できる人はいません。したがって、WordPressがDiscourse上のエディターのアカウントを制御している場合、誰もがWordPressに最初に登録することを要求せずに、どのようにそれを行うことができますか?私はそのようなものが使えるかもしれないので興味があります。

(そして…またしても話題が逸れてしまいました🤦‍♂️)

DiscourseConnect クライアント設定を使用しました。これは Discourse を認証システムとして使用し、ユーザーが存在しない場合は WordPress でユーザーを作成します。プラグインの説明によると、

サイトを DiscourseConnect クライアントとして機能させることで、WordPress のユーザー認証を Discourse フォーラムまたは WordPress サイトで処理できるようになります。Discourse ユーザーが DiscourseConnect リンクを通じて WordPress にログインする場合、そのユーザーは Discourse の認証情報に基づいて認証されます。そのユーザーがまだ WordPress サイトに存在しない場合、新しいユーザーが作成されます。

ユーザーは最初に WordPress の購読者として設定され、必要に応じて手動で作成者に設定します。登録されていないユーザーはすべてのコンテンツを表示できるようにサイトを設定する予定で、記事を投稿したい場合にのみ WP に登録する必要があります。

WordPress のすべてのユーザーは、まず Discourse に登録する必要があります。その後、コネクタは自動的に WP にログインするか、アカウントを作成してからログインします。

はい、その通りですが、他のすべての認証方法をオーバーライドし、フォーラムの通常のユーザーはDiscourseにアクセスする前にWordPressに登録する必要があります。

それとも、何か誤解していますか?

見た限りでは、通常のDiscourseユーザーはWPサイトにアクセスする必要はまったくありません。Discourseサイトからリンクをたどることにした場合、WPサイトに自動的に登録されます。

何について話しているのか、2つのサイトを見ていただいても構いません。まだ完成していないことに留意してください。ただし、その部分は現在機能しています。
Https://forum.oursail.boats はDiscourseです
Https://www.oursail.boats はWPサイトです

WPサイトにアカウントを作成してください。そこでのメッセージを表示したり返信したりできるようになります。

次にWPサイトにアクセスし、ログインメニュー項目を選択してください。WPのログインをバイパスし、代わりにDiscourseのログインに接続します(設定によります)。ログインしたままにするオプションを選択した場合、プロンプトは表示されません。ログイン後、すぐにWPサイトに戻ります。

Wordpressで記事を投稿しているユーザーのプロフィールに、Discourseユーザー名が入力されていることを確認するだけで済みます。ユーザーにDiscourseユーザー名があれば、Wordpressで行われた投稿は、そのユーザー名を使用してDiscourseに公開されます。

これは手動で更新することも、ユーザーデータ更新Webhook(WP Discourseの「Webhook」設定を参照)を使用して自動的に更新することもできます。

「いいね!」 3

WPの393件の公開済み投稿をすべて手動で編集する前に、これがまだそうであるかどうかを確認したかったのです。つまり、一括インポートオプションはまだないということですか?ありがとうございます!

一括インポートオプションはありません。Discourse に 393 件の投稿を公開すると、393 件のトピックのひな形が作成されることに注意してください。より的を絞った戦略を検討することをお勧めします。コミュニティでは現在、実際に何が議論される予定ですか?

「いいね!」 2

私の推測では、彼らはそうしないでしょう。Discourseはコメントに取って代わるために使われているだけで、それ以外には何もありません。したがって、Discourseのためではなく、WordPressのためです。

私は似たような状況にありました。世界のWordPressの投稿のほとんどは、どのようなコメントもキャッチしていないか、あるいは多かれ少なかれノイズに過ぎないため、私の投稿も例外ではありませんでした。しかし、すべてのコンテンツを扱う代わりに、古いWP-contentを使ってDiscourseでの活動を活性化させていました。一度にすべての投稿を接続したのではなく、少しずつ行いました。例えば、犬の熱中症や、トレイルでどれだけのカロリーを摂取すべきかといったトピックが現在アクティブになっています。これらは古い投稿ですが、Discourseで新たな命を得ました。

もし一括で接続するオプションがあれば、そのような見逃された可能性を理解せずに、それを行ったでしょう。たとえコードを書くことができたとしても、一括オプションは6フィートの深さに埋めることさえできると言えます :wink:

「いいね!」 2

WordPressサイトをGhostに移行する前に、すべてのコメントをDiscourseに取り込もうとしています。Ghostはコメント機能を提供していませんが、コメントのためにDiscourseに接続することは可能です。

しかし、今思いついたのですが、新しいGhostとDiscourseを接続してからWordPressの投稿をすべてインポートすれば、それがうまくいくかもしれません…(/me が試してみるために離れます…)

WPからDiscourseへのコメント移行は行われません。Discourseの投稿がWordPressに表示されるだけです。

私の理解が正しければ…

「いいね!」 1

WordPressの投稿とDiscourseのトピックをリンクしても、Ghostに移行する予定なら意味がありません。

皆さん、こんにちは!

Discourse でコミュニティの設定が完了しました!現在、ステージングサイトで WP Discourse プラグインをテスト中です。

SEO に関する懸念があります。具体的には、WP から Discourse に同じコンテンツを公開することで、SEO の問題としてコンテンツの重複が発生することを懸念しています。Discourse はフォーラムのコンテンツを SEO の目的でコピーとしてマークしますか?

こんにちは、Victorさん :slight_smile:

デフォルト設定でSEOは問題ないはずです(ドメインが異なるため)。また、Discourseトピックの正規URLをWordPress投稿のURLに設定することもできます。

Discourseのサイト設定 embed set canonical url を有効にすると、WP投稿のパーマリンクがDiscourseトピックの正規URLになります(つまり、DiscourseトピックのHTMLの<head>内に正規リンクとして表示されます)。

詳細については、以下をご覧ください。

「いいね!」 1

@angusさん、ありがとうございます。大変感謝しています。SEOは運に任せるのではなく、自分でコントロールする方が安全です!

「いいね!」 1

カスタム投稿タイプごとに異なるカテゴリを設定しようとしています。以下のコードは、WordPress管理画面で正しいカテゴリを選択します。しかし、Discourseに公開する際、カテゴリは設定されず(デフォルトで未分類になります)…

何か明らかなことを見落としているのでしょうか?

// WP Discourse CPTフォーラムカテゴリをCPTSに設定

add_filter( 'wp_discourse_publish_categories', 'radhr_filter_categories_policies', 10, 2 );
function radhr_filter_categories( $categories, $post ) {
    if ( 'policy' === get_post_type( $post ) ) {
        $output = [];
        foreach ( $categories as $category ) {
            if ( 'Policies' === $category['name']) {
                $output[] = $category;
            }
        }
        return $output;
    }

    elseif ( 'guide' === get_post_type( $post ) ) {
        $output = [];
        foreach ( $categories as $category ) {
            if ( 'Guides' === $category['name']) {
                $output[] = $category;
            }
        }
        return $output;
    }

    elseif ( 'post' === get_post_type( $post ) ) {
        $output = [];
        foreach ( $categories as $category ) {
            if ( 'Blogs' === $category['name']) {
                $output[] = $category;
            }
        }
        return $output;
    }

    return $categories;
}

目標達成のために合理的な推測をされましたが、gutenbergエディターで1つのカテゴリのみにフィルタリングしている場合、wp_discourse_publish_categories は確実に機能しません。

代わりに wpdc_publish_post_category を使用してください。

OPを更新してその旨を追記します。

「いいね!」 1