Memberpress + WP Discourse (그룹 관리)

몇 년째 meta.discourse 포럼을 잠복으로 지켜보며 스니펫을 수집하고, WordPress + Memberpress + Discourse(자체 호스팅)를 사용하는 클라이언트 사이트를 개선하는 방법을 배우고 있습니다.

저는 Memberpress 멤버십에 따라 Discourse 그룹을 지정해야 했습니다(아직도 필요합니다).

참고:

과거(수년간) 저는 add_filter( 'wpdc_sso_params' 필터 메서드를 사용했습니다:

이 방식의 단점은 Discourse 그룹이 사용자 로그인 시에만 업데이트된다는 것이었습니다. 저는 Memberpress 거래가 발생하는 시점과 같이 즉각적인 효과가 있는 방식을 원했습니다.

솔직히 제 PHP 코딩 실력은 매우 기초적인 수준입니다. 저는 더 프론트엔드 HTML/CSS 개발자에 가깝습니다.

이제 저는 여기에서 설명된 더 나은 WP Discourse 함수를 사용하여 클라이언트 사이트용 함수를 다시 작성했습니다.

이 함수는 \WPDiscourse\Utilities\Utilities::add_user_to_discourse_group 및 \WPDiscourse\Utilities\Utilities::remove_user_from_discourse_group 함수를 사용합니다.

이제 Memberpress 이벤트를 수신하여 다음 코드 블록(functions.php)으로 Discourse 그룹을 추가할 수 있습니다:

add_action('mepr-event-create', 'listen_to_mepr_events');
function listen_to_mepr_events($event) {
  $obj = $event->get_data();
  //$obj might be a MeprTransaction object or a MeprSubscription object

  if(!($obj instanceof MeprTransaction) && !($obj instanceof MeprSubscription)) {
    return; // nothing here to do if we're not dealing with a txn or sub
  }

  $member = $obj->user(); // get member object data from event object

  $user_id = $member->ID; // get user ID from object

  if($member->is_active_on_membership($obj)) { //active membership
    
    if(3780 == $obj->product_id) { //MONTHLY Membership
        $add_group = 'Ksenia_Basic'; // Discourse Group Name
        $remove_groups = ['Ksenia_Essential','Ksenia_Premium','Ksenia_Free','Ksenia_Annual'];
        // add to Discourse Group
        \WPDiscourse\Utilities\Utilities::add_user_to_discourse_group( $user_id, $add_group );
        // remove from Discourse Groups
        \WPDiscourse\Utilities\Utilities::remove_user_from_discourse_group( $user_id, $remove_groups );
    }
    else if(3847 == $obj->product_id) { //6 Month (Essential) Membership
        $add_group = 'Ksenia_Essential'; // Discourse Group Name
        $remove_groups = ['Ksenia_Basic','Ksenia_Premium','Ksenia_Free','Ksenia_Annual'];
        // add to Discourse Group
        \WPDiscourse\Utilities\Utilities::add_user_to_discourse_group( $user_id, $add_group );
        // remove from Discourse Groups
        \WPDiscourse\Utilities\Utilities::remove_user_from_discourse_group( $user_id, $remove_groups );
    }
  }
  else { //no matches
  }
}

추가 참고: Memberpress 액션 훅 add_action('mepr-event-create', 'listen_to_mepr_events');의 예제는 여기에서 찾을 수 있습니다:

참고 - 이것은 제 클라이언트 사이트에서 사용하는 것의 단순화된 버전입니다. 전체 버전(Learndash + Mailster 관리 포함)은 여기에서 찾을 수 있습니다: Memberpress + Learndash + Mailster + WP Discourse · GitHub

수년간 스니펫과 지원을 제공해 주신 이 포럼의 모든 분들에게 감사드립니다. 저와 같은 많은 잠복자들이 이 자원을 매우 가치 있고 유용한 것으로 인식하고 있다는 것을 알고 있습니다.

제 예제에 대해 제안 사항이나 문제를 보신다면, 어떻게 개선할 수 있는지 알려주세요.

앤드류, 감사합니다. 내일 이 부분을 확인해서 월요일에 더 자세한 답변을 드리겠습니다. 일단 참고로, @fzngagan 님이 개발한 Memberpress 그룹 동기화 플러그인을 확인해 보셨나요?

역할 기반 - 멋지네요 :sunglasses: 아니요, 그 플러그인은 처음 봤어요. 훌륭한 기여입니다.

이걸 어떻게 구현해야 할까요? WordPress와 MemberPress를 사용 중이며, DigitalOcean 드롭렛에 서브도메인으로 Discourse를 설치했습니다. 플러그인처럼 코드를 그대로 업로드하면 되는 건가요?

네, wp-discourse-mepr-sync는 단일 파일로 구성된 WordPress 플러그인입니다.

방금 코드를 살펴봤습니다. 명확하지 않을 수 있으니, Memberpress Sync 플러그인은 WP Discourse 플러그인의 코드에 의존합니다: WP Discourse – WordPress plugin | WordPress.org. 즉, WP Discourse 플러그인도 설치, 활성화 및 구성해야 합니다: Connect WP Discourse to Discourse. 또한 WordPress 사이트를 Discourse 사이트의 DiscourseConnect 제공자로 구성해야 합니다. 설정에 대한 자세한 내용은 여기에 있습니다: Configure single sign-on (SSO) with WP Discourse and DiscourseConnect.

Memberpress Sync 플러그인에서 제가 확신하지 못하는 부분이 있습니다. 제 생각에는 플러그인 코드에 두 개의 Memberpress Product ID와 두 개의 Discourse 그룹이 하드코딩되어 있는 것 같습니다:

저는 아마도 그 파일에 몇 가지 변경 사항이 필요할 것이라고 생각합니다. PV_MEMBERPRESS_PRODUCT_IDS로 정의된 배열의 값들은 사용자의 사이트 구독 ID로 설정되어야 합니다. 또한 PV_DISCOURSE_ENROLLED_GROUP과 PV_DISCOURSE_UNENROLLED_GROUP 정의는 사용자의 Discourse 사이트에 존재하는 그룹으로 설정해야 합니다.

플러그인은 활성 구독이 있는 사용자를 PV_DISCOURSE_ENROLLED_GROUP에 추가하는 것 같습니다. 하나 이상의 활성 구독이 있던 사용자가 모든 구독이 만료되면, 해당 사용자는 PV_DISCOURSE_ENROLLED_GROUP에서 제거되고 PV_DISCOURSE_UNENROLLED_GROUP에 추가됩니다.

@fzngagan 님이 이것이 맞는지 확인해 주실 수 있을까요? 맞다면 @earlysound 님의 사이트에 대한 코드 설정은 비교적 간단할 것입니다. 하지만 플러그인 작동 방식을 오해하고 있을 수도 있습니다. 저는 Memberpress 플러그인의 사본을 가지고 있지 않습니다. Memberpress의 개발 버전에 접근할 수 있다면, 직접 테스트해 볼 수 있을 것입니다.

저도 코드를 읽었을 때 설명하신 것과 동일한 로직을 파악했습니다. @fzngagan 님이 확인해 주시면 정말 좋겠습니다.

여러분, 안녕하세요. 마지막 게시글 이후 몇 달이 지났지만, 아래 내용이 여전히 도움이 되기를 바랍니다.

저는 물론 @fzngagan은 아니지만, 이 플러그인이 처음 개발되었던 클라이언트입니다!

우리의 아이디어는 활성 반복 결제 Memberpress 멤버십을 가진 사용자를 특정 Discourse 그룹에 자동으로 추가하는 것이었습니다.

사용자가 구독을 해지하고 나갔을 때, 그들은 Discourse 그룹에서 제거되고 대신 “Alumni” 그룹에 추가되었습니다. 이 그룹은 포럼의 특정 영역에만 접근할 수 있었습니다.

@simon이 지적했듯이, 멤버십 ID와 Discourse 그룹은 하드코딩되어 있습니다. 사용하려면 그것들을 자신의 것으로 교체하기만 하면 될 것 같습니다.

네, 맞습니다. 이 값들을 변경하기만 하면 됩니다.

define('PV_MEMBERPRESS_PRODUCT_IDS', array(153, 161));
define('PV_DISCOURSE_ENROLLED_GROUP', 'locker');
define('PV_DISCOURSE_UNENROLLED_GROUP', 'KaizenAlumni');
define('PV_MEPR_ACTIVE_STATUSES', array('complete'));