timgrahl
(Tim Grahl)
1
我们通过 Wordpress/Woocommerce 系统进行会员管理。几年来,我们一直在子域名上使用 Discourse,并通过 SSO 集成,效果一直很好。我的 functions 文件中有一段代码,可以在用户加入/取消会员时添加/移除组访问权限。
我们为会员系统添加了一项新功能,允许用户加入一个 6-8 人的小组,进行每周的 Zoom 视频通话。
为了管理这个功能,我们创建了一个名为“Cohorts”(队列)的 Wordpress 文章类型,其中包含每周的通话信息,然后通过自定义用户字段将这些 Cohorts 分配给用户。
以下是我想要实现的目标:
- 为每个 Cohort 创建一个组。
- 为每个 Cohort 创建一个子分类,只有来自 #1 的组才能访问。
- 将每个会员添加到他们各自的组中,这样他们就可以访问他们所属 Cohort 的子分类。
我知道如何实现 #3,但有没有办法以编程方式添加组和子分类(以及安全设置)?
我在 WP-Discourse 工具中找不到此功能。另外,查看 API 时,我可以看到如何添加分类,但看不到安全功能。
我想要实现的功能是否可行?
angus
(Angus McLeod)
2
是的,这是可能的。您可以使用 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 个赞
timgrahl
(Tim Grahl)
3
@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 )
我哪里做错了?
angus
(Angus McLeod)
5
抱歉 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 );
tom00953
(Tom Robak)
6
嘿 @timgrahl,您能否分享适用于 Wordpress 和 Woocommerce 的有效函数,用于将用户添加到/从中删除组?
我正在使用 Woocommerce 和会员资格,并试图让它生效……如果 wordpress 用户拥有有效的 Woocommerce 会员资格,那么用户将被添加到 X 组……当会员资格被取消或过期时,用户将从 X 组 中删除
angus
(Angus McLeod)
7
嘿 Tom,要将 Discourse 群组与 WooCommerce 会员资格同步,您需要使用此处所述的方法:
tom00953
(Tom Robak)
8
是的,我看到了……但仍然太笨拙,无法为此创建代码片段 