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

WP Discourse プラグインを使用すると、WordPress の投稿を Discourse に公開でき、コミュニティが WordPress コンテンツについて議論できます。公開設定を行う前に、まず WordPress に WP Discourse プラグインをインストール し、Discourse と接続 する必要があります。準備が整ったら、この短いビデオを見るか、以下の手順に従ってください。

次のステップ

公開設定が完了したら、以下のトピックもご覧ください。


手順

公開設定

:warning: 設定を変更した後は、必ず保存してください。ページ下部の「オプションを保存」ボタンをクリックします。

設定は比較的わかりやすいはずです。いずれかの設定について理解に問題がある場合は、このトピックに返信してさらに詳しい説明を求めてください。

既定の Discourse カテゴリ

投稿が Discourse に公開される既定のカテゴリを設定します。この設定は、WordPress の投稿新規作成画面で個別の投稿に対して上書きできます。

サブカテゴリを表示

WordPress から公開できるカテゴリとして、フォーラムのサブカテゴリを利用可能にするかどうかを指定します。サブカテゴリを「既定の Discourse カテゴリ」オプションの入力項目で利用可能にするには、この設定を保存する必要があります。

カテゴリ更新を強制

フォーラムに新しいカテゴリを追加し、それを WordPress サイトで利用可能にしたい場合に使用します。この設定を有効にしてオプションページを保存すると、Discourse のカテゴリを取得するために単一の API 呼び出しが行われます。有効化後、次に「コメント」タブに戻ると、この設定は無効になっています。

タグを許可

WordPress を通じて作成された Discourse トピックにタグを追加したい場合は、これを有効にしてください。

未公開トピックとして公開

WordPress から公開された投稿が Discourse で未公開(リストに表示されない)になります。「同期コメントデータ」ウェブフック設定を有効にすると、未公開の投稿は Discourse で最初の返信を受け取った際に表示されるようになります。

投稿全文を使用

要約ではなく、WordPress の投稿全文を Discourse フォーラムに公開できます。Discourse 上の投稿下に「投稿全文を表示」ボタンが表示されないようにするには、Discourse の「投稿を切り取る」サイト設定(yourforum.com/admin/site_settings/category/posting にあります)のチェックを外す必要があります。

カスタム要約長

「投稿全文を使用」設定を選択していない場合、この設定は Discourse に公開される要約の長さを決定します。また、WordPress 投稿を作成する際に「要約」メタボックスに要約を追加することで、手動で要約を作成することもできます。

自動公開

投稿新規作成画面に表示される「Discourse に公開」チェックボックスを、Discourse に公開する投稿タイプの既定でチェック済みにします。投稿作成時にこのチェックボックスのチェックを外すことは可能です。

公開トピックの自動追跡

この設定はデフォルトで有効です。有効にすると、WordPress から Discourse に公開された投稿の著者は、自動的にトピックを「ウォッチ」状態に設定されます(すべての新しい返信について Discore の通知を受け取ります)。

公開する投稿タイプ

この設定は必須です。デフォルトは「投稿」ですが、「ページ」やカスタム投稿タイプも選択できます。

タグで投稿を除外

この設定に WordPress タグを追加すると、そのタグのいずれかを持つ WordPress 投稿は Discourse に公開されません。

Discourse 名フィールドを表示しない

ユーザーのプロフィールにある「Discourse ユーザー名」フィールドを非表示にします。Discourse ユーザー名は、投稿を Discourse に公開する際のトピックの著者を設定するために使用されます。

Discourse ユーザー名の編集可能

管理者以外のユーザーが自分のプロフィールで Discourse ユーザー名を編集できるかどうかを決定します。Discourse ユーザー名は、投稿を Discourse に公開する際のトピックの著者を設定するために使用されます。

直接データベース公開フラグ

この設定は、特殊な WordPress 環境を持つ特定の構成で使用されます。その機能を理解していない限り、この設定を使用しないでください。

詳細な公開ログ

この設定を有効にすると、成功した投稿であっても、Discourse に公開されたすべての投稿が WP Discourse ログに記録されます。通常はエラーのみが記録されます。

XML-RPC による投稿の有効化

XML-RPC は、ブログソフトウェアが WordPress に投稿を送信するために頻繁に使用するリモートプロシージャコールです。このプロシージャを使用するアプリには、wordpress.comブログアプリ などがあります。

デフォルトでは、WP Discourse は XML-RPC を通じて作成された投稿を Discourse に公開しません。その理由は、ブログソフトウェアを通じて公開された投稿が Discourse に公開されるべきかどうかを示す優れた方法がないためです。

ブログソフトウェアを使用して直接 Discourse に公開される投稿を作成したい場合は、テーマの functions.php ファイルに、wp_discourse_before_xmlrpc_publish フィルターにフックするコードを追加する必要があります。wp_discourse_before_xmlrpc_publish フィルターは、フックする関数に 2 つの引数を渡します。最初の引数 $publish_to_discourse は、XML-RPC による公開を無効にするために false に設定されるブール値です。2 番目の引数は post オブジェクトです。

すべての XML-RPC 投稿を自動的に Discourse で公開するには、常に true を返す関数を作成する必要があります。以下のようなコードを使用してください。

警告: これにより、XML-RPC を通じて公開されたすべての投稿(ブログソフトウェアで編集された過去の投稿も含む)が Discourse に公開されます。

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

タグによる XML-RPC 投稿のフィルタリング

wordpress.com のブログアプリでは、投稿にタグを追加できます。タグを使用して、投稿を Discourse に公開するかどうかを制御できます。‘discourse’ タグを持つ投稿のみを公開するには、以下のようなコードを使用します。

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;
}

この方法を使用したいが、公開された投稿に discourse タグが表示されないようにしたい場合は、以下のようなコードでタグを削除できます。

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;
}

投稿日による XML-RPC 投稿のフィルタリング

特定の日以降に公開された投稿のみを XML-RPC を通じて Discourse に公開するには、functions.php ファイルに以下のようなコードを追加します。このコードは、2016 年 1 月 1 日以降に公開されたすべての投稿を 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: XML-RPC を通じて新しい投稿(編集された投稿ではなく)のみを公開できるようにするフィルターを wp-discourse プラグインに追加する。

カスタム投稿タイプに対して利用可能なカテゴリをフィルタリング

Discourse カテゴリが WordPress の admin/post-new ページにある「Discourse に公開」メタボックスに表示される前に、WordPress のフィルター 'wp_discourse_publish_categories' が適用されます。このフィルターには、Discourse カテゴリの配列と現在の投稿が引数として渡されます。これは、テーマの functions.php ファイルで使用して、特定の投稿タイプに対して利用可能なカテゴリを制限できます。

以下は、'acme_product' という投稿タイプを作成し、そのタイプの投稿に対して「fun」と「scratch」という Discourse カテゴリのみを「Discourse に公開」メタボックスに表示する例です。

// 投稿タイプを作成。
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,
    )
  );
}

// 'acme_product' 投稿タイプに対して利用可能なカテゴリをフィルタリング。
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;
}

特定の投稿タイプに厳密に特定のカテゴリを適用したい場合(つまり 1:1 の対応)は、wpdc_publish_post_category を使用してください。

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' );

接続された Discourse トピックのメタデータを表示

公開設定が完了したら、テンプレートのカスタマイズ を使用して、Discourse トピックのメタデータを表示できます。

まず、どのテンプレートを変更するかを決定します。例えば、コメントとして返信を表示せず、トピックのメタデータのみを表示したい場合は、no_replies テンプレートを変更します。

テンプレートを選択したら、Discourse トピックのメタデータを追加するように変更できます。以下は、コードの動作を説明するコメント付きのスニペットです。

// 好みの方法で wp-discourse が存在することを確認
// 例: https://wordpress.stackexchange.com/questions/127818/how-to-make-a-plugin-require-another-plugin

// wp-discourse プラグインから plugin-utilities を読み込む
require_once ABSPATH . 'wp-content/plugins/wp-discourse/lib/plugin-utilities.php';
use WPDiscourse\Shared\PluginUtilities;

// プラグインユーティリティを簡単に使用できるように、トピックメタデータテンプレートをクラスにカプセル化
class DiscourseTopicMetadata {
  
  // クラス内で wp プラグインユーティリティを使用
  use PluginUtilities;
  
  public function __construct() {

    // クラスの初期化時にテンプレートフィルターを追加
    add_filter( 'discourse_no_replies_html', array( $this, 'topic_metadata_html' ) );
  }

  function topic_metadata_html( $input ) {
    // 投稿メタデータから Discourse パーマリンクを取得
    $discourse_permalink = get_post_meta( get_the_ID(), 'discourse_permalink', true );

    // 認証を自動的に処理するプラグインユーティリティのヘルパーメソッドを使用して、Discourse パーマリンクからトピックの JSON を取得
    $topic = $this->get_discourse_topic($discourse_permalink);
   
    // 表示したいトピックメタデータを含むマークアップを出力
    ob_start();
    ?>
    <div id="discourse-topic-meta">
        <div class="views">
          ビュー
          <?php echo $topic->views; ?>
        </div>
        <div class="replies">
          返信
          <?php echo $topic->reply_count; ?>
        </div>
    </div>
    <?php
    
    return ob_get_clean();
  }
}

// フィルターを追加するためにクラスをインスタンス化
new DiscourseTopicMetadata();

get_discourse_topic のレスポンスで利用可能なトピックメタデータの詳細については、Discourse API Docs を参照してください。

「いいね!」 10

以前投稿したブログ記事をインポートすることはできますか?例えば、過去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