timgrahl
(Tim Grahl)
12월 21, 2021, 3:35오후
1
저희는 WordPress/Woocommerce 시스템을 통해 멤버십을 운영하고 있습니다. 지난 몇 년간 서브도메인에서 SSO를 활용하여 Discourse를 사용해 왔고, 지금까지 잘 작동해 왔습니다. functions 파일에 코드를 넣어 두어 사용자가 가입하거나 취소할 때 각각 그룹 접근 권한을 추가/제거하고 있습니다.
최근 멤버십 기능에 6~8명의 소규모 그룹이 매주 Zoom 통화를 할 수 있는 기능이 추가되었습니다.
이를 관리하기 위해 주간 통화 정보를 담은 "Cohorts"라는 WordPress Post Type을 생성하고, 사용자별 커스텀 사용자 필드를 통해 해당 Cohorts를 사용자에게 할당하고 있습니다.
저희가 하고 싶은 일은 다음과 같습니다:
각 Cohort마다 하나의 그룹을 생성합니다.
각 Cohort마다 #1의 그룹만 접근할 수 있는 하위 카테고리(서브카테고리)를 생성합니다.
각 멤버를 해당 그룹에 배치하여, 해당 멤버가 자신의 Cohort와 관련된 하위 카테고리에 접근할 수 있게 합니다.
#3은 어떻게 하는지 알고 있지만, 그룹과 하위 카테고리(보안 설정 포함)를 프로그래매틱하게 추가할 수 있는 방법이 있을까요?
WP-Discourse 유틸리티에서 이 기능을 찾을 수 없었습니다. 또한 API를 살펴보면 카테고리를 추가하는 위치는 보이지만, 보안 관련 함수는 보이지 않습니다.
제가 원하는 것이 가능한가요?
angus
(Angus McLeod)
12월 22, 2021, 3:36오전
2
네, 가능합니다. discourse_request 유틸리티 메서드를 사용하여 WordPress에서 Discourse로 어떤 API 요청이든 보낼 수 있습니다. 예를 들어 다음과 같습니다.
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 . API 문서에 매개변수의 전체 목록은 없지만, 여기에서 찾을 수 있습니다: discourse/app/controllers/admin/groups_controller.rb at main · discourse/discourse · GitHub
카테고리 생성
원하시는 엔드포인트는 이겁니다: Discourse API Docs . 마찬가지로 전체 매개변수 목록은 여기에서 찾을 수 있습니다: discourse/app/controllers/categories_controller.rb at main · discourse/discourse · GitHub
"보안 설정"은 permissions 매개변수를 통해 처리된다는 점에 유의하세요. 그룹 이름을 키로, 권한 수준 정수 값을 값으로 가진 객체만 전달하면 됩니다. 예를 들어 다음과 같습니다.
{
"cohort1": 2,
"staff": 1
}
권한 수준 정수 목록은 여기에서 찾을 수 있습니다: discourse/app/models/category_group.rb at main · discourse/discourse · GitHub
timgrahl
(Tim Grahl)
12월 24, 2021, 12:38오후
3
@Angus , 정말 감사합니다! 제가 필요했던 것이 바로 이거였어요!
그룹을 생성하고, 사용자를 그룹에 할당하며, 적절한 보안 설정으로 카테고리를 만드는 데 성공했습니다.
도움 주셔서 정말 감사드립니다.
그런데 다른 질문이 하나 더 있습니다… 카테고리와 그룹을 업데이트하기 위해 PUT 요청을 시도했을 때 다음과 같은 오류가 발생했습니다:
Fatal error : Uncaught Error: Call to undefined function wp_remote_put() in […]/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 )
무엇이 잘못되었나요?
timgrahl
(Tim Grahl)
12월 28, 2021, 3:22오후
4
혹시 아이디어가 있으신가요? 정말 감사합니다!
angus
(Angus McLeod)
12월 30, 2021, 1:27오전
5
팀, 죄송합니다. 지난 며칠 동안 자리를 비웠습니다. 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( /* 사용 중인 엔드포인트에 따라 다름 */ );
$url = /* 사용 중인 엔드포인트의 절대 URL */;
$opts = array(
'headers' => $headers,
'body' => json_encode( $body ),
'method' => 'PUT'
);
$result = wp_remote_request( $url, $opts );
tom00953
(Tom Robak)
5월 17, 2022, 10:48오전
6
@timgrahl 님, WordPress와 Woocommerce에서 그룹에 사용자를 추가/제거하는 작동하는 함수를 공유해 주실 수 있을까요?
저는 멤버십을 위해 Woocommerce를 사용 중인데, 이 기능을 구현하려고 하고 있습니다… WordPress 사용자가 활성 Woocommerce 멤버십을 가지고 있으면 해당 사용자는 X group에 추가되고… 멤버십이 해지되거나 만료되면 X group에서 제거되도록 하려 합니다.
angus
(Angus McLeod)
5월 17, 2022, 12:13오후
7
톰 씨, 디스커스 그룹을 WooCommerce 멤버십과 동기화하려면 다음에 설명된 방법을 사용해야 합니다:
WP Discourse functions
The WP Discourse plugin has a couple of functions that can be used to associate WordPress users with Discourse groups.
These functions are only enabled on sites that are using WordPress as the SSO provider for Discourse.
add_user_to_discourse_group( $user_id, $group_names ) View Code
remove_user_from_discourse_group( $user_id, $group_names ) View Code
Each of these functions take the same two parameters:
$user_id: the WordPress user’s id
$group_names: a comma separat…
tom00953
(Tom Robak)
5월 17, 2022, 12:27오후
8
응, 그거 봤어… 근데 아직 그거 코드 스니펫을 만들려면 너무 멍청한 것 같아