WP-Discourse 또는 API로 그룹과 카테고리(보안 포함)를 추가할 수 있나요?

저희는 WordPress/Woocommerce 시스템을 통해 멤버십을 운영하고 있습니다. 지난 몇 년간 서브도메인에서 SSO를 활용하여 Discourse를 사용해 왔고, 지금까지 잘 작동해 왔습니다. functions 파일에 코드를 넣어 두어 사용자가 가입하거나 취소할 때 각각 그룹 접근 권한을 추가/제거하고 있습니다.

최근 멤버십 기능에 6~8명의 소규모 그룹이 매주 Zoom 통화를 할 수 있는 기능이 추가되었습니다.

이를 관리하기 위해 주간 통화 정보를 담은 "Cohorts"라는 WordPress Post Type을 생성하고, 사용자별 커스텀 사용자 필드를 통해 해당 Cohorts를 사용자에게 할당하고 있습니다.

저희가 하고 싶은 일은 다음과 같습니다:

  1. 각 Cohort마다 하나의 그룹을 생성합니다.
  2. 각 Cohort마다 #1의 그룹만 접근할 수 있는 하위 카테고리(서브카테고리)를 생성합니다.
  3. 각 멤버를 해당 그룹에 배치하여, 해당 멤버가 자신의 Cohort와 관련된 하위 카테고리에 접근할 수 있게 합니다.

#3은 어떻게 하는지 알고 있지만, 그룹과 하위 카테고리(보안 설정 포함)를 프로그래매틱하게 추가할 수 있는 방법이 있을까요?

WP-Discourse 유틸리티에서 이 기능을 찾을 수 없었습니다. 또한 API를 살펴보면 카테고리를 추가하는 위치는 보이지만, 보안 관련 함수는 보이지 않습니다.

제가 원하는 것이 가능한가요?

네, 가능합니다. 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

@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 )

무엇이 잘못되었나요?

혹시 아이디어가 있으신가요? 정말 감사합니다!

팀, 죄송합니다. 지난 며칠 동안 자리를 비웠습니다. 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 );

@timgrahl 님, WordPress와 Woocommerce에서 그룹에 사용자를 추가/제거하는 작동하는 함수를 공유해 주실 수 있을까요?

저는 멤버십을 위해 Woocommerce를 사용 중인데, 이 기능을 구현하려고 하고 있습니다… WordPress 사용자가 활성 Woocommerce 멤버십을 가지고 있으면 해당 사용자는 X group에 추가되고… 멤버십이 해지되거나 만료되면 X group에서 제거되도록 하려 합니다.

톰 씨, 디스커스 그룹을 WooCommerce 멤버십과 동기화하려면 다음에 설명된 방법을 사용해야 합니다:

응, 그거 봤어… 근데 아직 그거 코드 스니펫을 만들려면 너무 멍청한 것 같아 :confused: