WP Discourse プラグインを使用すると、WordPress の投稿を Discourse に公開でき、コミュニティが WordPress コンテンツについて議論できます。公開設定を行う前に、まず WordPress に WP Discourse プラグインをインストール し、Discourse と接続 する必要があります。準備が整ったら、この短いビデオを見るか、以下の手順に従ってください。
次のステップ
公開設定が完了したら、以下のトピックもご覧ください。
手順
公開設定
設定を変更した後は、必ず保存してください。ページ下部の「オプションを保存」ボタンをクリックします。
設定は比較的わかりやすいはずです。いずれかの設定について理解に問題がある場合は、このトピックに返信してさらに詳しい説明を求めてください。
既定の 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 を参照してください。

