使用 WP-Discourse 或 API 添加组和类别(带安全)?

我们通过 Wordpress/Woocommerce 系统进行会员管理。几年来,我们一直在子域名上使用 Discourse,并通过 SSO 集成,效果一直很好。我的 functions 文件中有一段代码,可以在用户加入/取消会员时添加/移除组访问权限。

我们为会员系统添加了一项新功能,允许用户加入一个 6-8 人的小组,进行每周的 Zoom 视频通话。

为了管理这个功能,我们创建了一个名为“Cohorts”(队列)的 Wordpress 文章类型,其中包含每周的通话信息,然后通过自定义用户字段将这些 Cohorts 分配给用户。

以下是我想要实现的目标:

  1. 为每个 Cohort 创建一个组。
  2. 为每个 Cohort 创建一个子分类,只有来自 #1 的组才能访问。
  3. 将每个会员添加到他们各自的组中,这样他们就可以访问他们所属 Cohort 的子分类。

我知道如何实现 #3,但有没有办法以编程方式添加组和子分类(以及安全设置)?

我在 WP-Discourse 工具中找不到此功能。另外,查看 API 时,我可以看到如何添加分类,但看不到安全功能。

我想要实现的功能是否可行?

是的,这是可能的。您可以使用 discourse_request 实用方法从 WordPress 发起任何 API 请求到 Discourse,例如:

use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;
$args =  array(
   "body" => "",
   "type" => "post"
);
$response = DiscourseUtilities::discourse_request( $path, $args );

这将正确格式化请求,并使用您在 WP Discourse 设置中提供的 API 密钥和用户。您将需要一个全局密钥来执行您提到的操作(如果您也为正常的 WP Discourse 功能使用相同的密钥)。

创建群组

您需要的端点是:Discourse API Docs 文档中没有完整的参数列表,但您可以在此处找到它们:discourse/app/controllers/admin/groups_controller.rb at main · discourse/discourse · GitHub

创建分类

您需要的端点是:https://docs.discourse.org/#operation/createCategory。同样,完整的参数列表在这里:https://github.com/discourse/discourse/blob/main/app/controllers/categories_controller.rb#L319

请注意,“安全设置”是通过 permissions 参数处理的。您只需要为其提供一个对象,其中群组名称作为键,权限级别整数作为值,例如:

{
  "cohort1": 2,
  "staff": 1
}

您可以在此处找到权限级别整数列表:discourse/app/models/category_group.rb at main · discourse/discourse · GitHub

2 个赞

@Angus,太感谢你了!这正是我需要的!

我已经成功创建了我的群组,将用户分配到群组,并创建了具有适当安全设置的类别。

我真的很感激你的帮助。

不过还有另一个问题……当我尝试运行 PUT 请求来更新类别或群组时,我收到了这个错误:

致命错误:未捕获的错误:未定义函数 wp_remote_put() 在 […]/public/wp-content/plugins/wp-discourse/lib/plugin-utilities.php:393

这是我尝试使用新名称更新类别 ID 61 的测试代码:

$path = "/categories/61.json";
$args =  array(
            "type" => "put",
            "body" => array (
                "name" => "Cohorts 1",
            )
        );
$response = DiscourseUtilities::discourse_request( $path, $args )

我哪里做错了?

有什么想法吗?非常感谢!

抱歉 Tim,我这几天不在。看起来需要调整 discourse_request 方法来支持这个。我下周会为此提交一个 PR,合并可能还需要一周时间。

如果你想更快地得到结果,可以使用底层的 WP 方法,如下所示:

$api_credentials = DiscourseUtilities::get_api_credentials();
if ( is_wp_error( $api_credentials ) ) {
    return $api_credentials;
}

$headers = array(
    'Api-Key'      => sanitize_key( $api_credentials['api_key'] ),
    'Api-Username' => sanitize_text_field( $api_credentials['api_username'] ),
    'Accept'       => 'application/json',
);
$body = array( /* specific to the endpoint you're using */ );
$url = /* The absolute url for the endpoint you're using */ ;

$opts = array(
   'headers' => $headers,
   'body'    => json_encode( $body ),
   'method'  => 'PUT'
);

$result =  wp_remote_request( $url, $opts );

@timgrahl,您能否分享适用于 Wordpress 和 Woocommerce 的有效函数,用于将用户添加到/从中删除组?

我正在使用 Woocommerce 和会员资格,并试图让它生效……如果 wordpress 用户拥有有效的 Woocommerce 会员资格,那么用户将被添加到 X 组……当会员资格被取消或过期时,用户将从 X 组 中删除

嘿 Tom,要将 Discourse 群组与 WooCommerce 会员资格同步,您需要使用此处所述的方法:

是的,我看到了……但仍然太笨拙,无法为此创建代码片段 :confused: