您可以使用 WP Discourse 插件将 WordPress 帖子发布到您的 Discourse 论坛,以便您的社区可以讨论您的 WordPress 内容。在设置发布功能之前,您必须先在 WordPress 上安装 WP Discourse 插件,并将其连接到您的 Discourse。如果您已准备好开始,请先观看这段简短的视频,或按照以下说明操作。
下一步
设置发布功能后,您可能想查看以下主题:
操作说明
发布设置
更改设置后,请务必保存。请点击页面底部的「保存选项」按钮。
这些设置应该相对直观易懂。如果您在理解任何设置时遇到问题,请回复此主题以获取进一步说明。
默认 Discourse 分类
设置帖子在 Discourse 上发布时的默认分类。此设置可在 WordPress 的「新建帖子」屏幕上针对单个帖子进行覆盖。
显示子分类
指示是否希望论坛的子分类可作为从 WordPress 发布帖子的可用分类。您需要先保存此设置,子分类才会出现在「默认 Discourse 分类」选项输入框中。
强制更新分类
当您向论坛添加了新分类并希望它们在 WordPress 站点上可用时使用。启用此设置并保存选项页面后,系统将向 Discourse 发起一次 API 调用以获取分类列表。启用后,下次您返回「评论」标签页时,会发现该设置已自动禁用。
允许标签
如果您希望通过 WordPress 为创建的 Discourse 主题添加标签,请启用此项。
以未列出主题发布
将使从 WordPress 发布的帖子在 Discourse 上处于未列出状态。如果您启用了 Sync Comment Data Webhook 设置,这些未列出的帖子将在首次收到 Discourse 回复时变为可见。
使用完整帖子内容
允许您将完整的 WordPress 帖子而非摘要发布到 Discourse 论坛。若要避免在 Discourse 帖子下方显示「显示完整帖子」按钮,您必须在 Discourse 上取消选中 embed truncate 站点设置(位于 yourforum.com/admin/site_settings/category/posting)。
自定义摘要长度
如果您未选择 Use Full Post Content 设置,此设置将生成指定长度的摘要并发布到 Discourse。您也可以在创建 WordPress 帖子时,通过在 Excerpt 元数据框中添加内容来手动创建摘要。
自动发布
此设置会自动勾选「发布到 Discourse」复选框,该复选框出现在针对需发布到 Discourse 的帖子类型的「新建帖子」屏幕上。创建帖子时仍可取消勾选该复选框。
自动追踪已发布主题
此设置默认启用。启用后,从 WordPress 发布到 Discourse 的帖子作者将自动「关注」该主题(他们将收到关于每条新回复的 Discourse 通知)。
要发布的帖子类型
必须设置此项。默认值为 post,但也可以选择页面和自定义帖子类型。
按标签排除帖子
如果在此设置中添加 WordPress 标签,则带有这些标签的任何 WordPress 帖子都不会发布到 Discourse。
不显示 Discourse 用户名字段
这将隐藏用户个人资料中的「Discourse 用户名」字段。Discourse 用户名用于在发布帖子到 Discourse 时设置主题作者。
Discourse 用户名可编辑
此设置决定非管理员用户是否能在其个人资料中编辑自己的 Discourse 用户名。Discourse 用户名用于在发布帖子到 Discourse 时设置主题作者。
直接数据库发布标志
此设置用于某些具有特殊 WordPress 环境的配置。除非您清楚其作用,否则请勿使用此设置。
详细发布日志
启用此设置后,所有发布到 Discourse 的帖子(即使成功)都将记录在 WP Discourse 日志中。通常仅记录错误。
通过 XML-RPC 启用发帖
XML-RPC 是一种远程过程调用,通常由博客软件用于向 WordPress 发送帖子。使用此过程的 App 包括 wordpress.com 的 博客应用。
默认情况下,WP Discourse 不会将通过 XML-RPC 创建的帖子发布到 Discourse。原因是目前没有很好的方法来判断通过博客软件发布的帖子是否意在发布到 Discourse。
如果您希望使用博客软件创建直接发布到 Discourse 的帖子,需要在主题的 functions.php 文件中添加一些代码,以挂钩到 wp_discourse_before_xmlrpc_publish 过滤器。wp_discourse_before_xmlrpc_publish 过滤器会将两个参数传递给挂钩到它的函数。第一个参数 $publish_to_discourse 是一个布尔值,默认为 false,用于禁用通过 XML-RPC 发布。第二个参数是 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;
}
待办:为 wp-discourse 插件添加过滤器,以仅允许通过 XML-RPC 发布新帖子(而非编辑过的帖子)。
为自定义帖子类型过滤可用分类
在 Discourse 分类显示于 WordPress admin/post-new 页面上的「发布到 Discourse」元数据框之前,会应用 WordPress 过滤器 'wp_discourse_publish_categories'。该过滤器接收 Discourse 分类数组和当前帖子作为参数。您可以在主题的 functions.php 文件中使用它来限制特定帖子类型可用的分类。
以下示例创建了一个名为 'acme_product' 的帖子类型,然后返回 Discourse 分类 ‘fun’ 和 ‘scratch’,以便在该类型的帖子「发布到 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);
// 输出您的 HTML 标记,包括您希望显示的主题元数据
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

