일정 기간이 지나면 그룹에서 사용자들을 자동으로 제거할 필요가 없다면, 즉 사용자가 그룹에 대한 임시/정기적 접근 권한이 아닌 평생 접근 권한을 구매하는 경우라면, woocommerce_payment_complete에 후킹하여 구매가 이루어질 때 사용자를 그룹에 추가할 수 있습니다. 또한 SSO에 후킹하여 로그인 시 사용자의 그룹을 업데이트할 수도 있습니다.
제이, 감사합니다!
출범 초기에는 어떤 멤버십 그룹에서도 평생 액세스 옵션을 제공하지 않을 예정입니다. 저희 "멘토 마켓플레이스"의 특성상, 사용자는 가입하고 싶은 그룹을 가진 코치/멘토가 있습니다. 몇 달간 사용해 본 후 해지하고, 자신의 필요나 기대에 더 잘 맞는 다른 멘토에게 가입할 수도 있습니다.
따라서 WP에서 멤버가 커스텀 그룹에 구독하면 Discourse의 해당 그룹에 자동으로 추가되고, WP에서 멤버십을 해지하면 Discourse의 그룹에서 자동으로 제거되도록 활성 동기화(SYNC)가 필요합니다.
이 코드의 최신 버전은 이 저장소에서 확인할 수 있습니다: GitHub - paviliondev/discourse-woocommerce · GitHub.
이 코드는 프로덕션 환경에서 사용되고 있으며, 설명된 대로 계속 정상적으로 작동하고 있습니다.
단계
- 코드를 워드프레스 플러그인으로 설치합니다.
- 그룹 ID와 플랜 ID를 업데이트합니다.
- 멤버십 상태가 변경될 때마다 동기화가 수행됩니다.
누군가 OP를 위키로 정리해 주신다면, 더 나은 설명으로 업데이트하겠습니다.
안녕하세요! Woocommerce memberships 플러그인을 구매했습니다. 필요한 모든 기능을 지원하며, 덕분에 모든 문제가 해결되었습니다. 제가 직접 설정하여 완전히 정상적으로 작동하는 통합 방법에 대한 안내서를 여기에 게시했습니다.
그러면 먼저 OP에서 플러그인을 설치해야 하나요?
저도 SSO 제공자로 Discourse(이 주제 제목과 OP에서 언급된 것과 달리)가 아니라 WordPress를 사용하고 있습니다.
OP이 Discourse가 SSO 제공자일 때 그룹을 동기화하는 방법에 관한 것임을 알고 있습니다. 하지만, WordPress가 SSO 제공자일 때 이 동기화를 수행하는 방법을 포함하도록 주제 제목을 업데이트하는 것이 합리적일까요?
@Ed_Bobkov 님은 SSO 제공자가 반대인 경우 동기화를 수행하는 방법에 대해 일부 세부 사항을 제공했습니다…
따라서 명확히 하자면…
OP에 두 가지 다른 지침 세트가 있다면 장기적으로 다른 사용자들에게도 매우 유용할 것입니다.
다음의 경우 WooCommerce 멤버십을 Discourse 그룹과 동기화하는 방법:
- Discourse가 SSO 제공자인 경우
- WordPress가 SSO 제공자인 경우
잘못 알고 계십니다. 저는 SSO 제공자로 Discourse를 사용하고 있습니다. 하지만 그 의미는 변하지 않습니다.
WordPress가 SSO 제공자인 경우의 지침이 포함된 주제들을 여기서 찾으실 수 있습니다.
가장 중요한 점은 다음과 같습니다:
- 모든 경우(WordPress가 SSO 제공자인 경우 또는 Discourse가 SSO 제공자인 경우)에서, “WooCommerce Memberships” 플러그인을 사용하여 그룹 멤버십, 구독 및 약관을 관리할 수 있습니다.
- Discourse의 멤버와 그룹을 WordPress와 동기화하려면 모든 경우에서 이 플러그인을 사용해야 합니다: GitHub - discourse/wp-discourse: WordPress plugin that lets you use Discourse as the community engine for a WordPress blog · GitHub. 이 플러그인의 설정에서 통합 유형(WordPress 또는 Discourse가 SSO 제공자인지)을 선택할 수 있습니다.
또한 이 플러그인도 유용할 수 있습니다: GitHub - paviliondev/discourse-woocommerce · GitHub - cron을 사용하여 배치 동기화를 수행하려면 이 플러그인을 사용해야 합니다: WP Crontrol – WordPress plugin | WordPress.org
상세한 지침은 이 주제(위쪽)에서 확인하실 수 있습니다.
그 링크가 이제 404 오류를 반환합니다. 이동했나요?
OP가 이제 위키가 되었습니다.
OP에 최신 코드 버전 링크와 사용 방법을 업데이트했습니다.
아, 공개 설정을 안 했었네요. 감사합니다.
@jord8on Ed가 언급했듯이, SSO 제공자가 Wordpress라면 공식 Discourse Wordpress 플러그인을 사용해야 합니다.
Woo Commerce와 Discourse 연동 관련 문제를 겪고 있습니다.
사용자가 특정 멤버십을 구매하면 Discourse에서 해당 그룹에 자동으로 할당되어야 합니다.
대부분의 경우 완벽하게 정상 작동합니다.
하지만 가끔 자동화가 되지 않습니다. 예를 들어, 10명의 사용자 중 8명은 멤버십 구매 시 특정 Discourse 그룹에 정상적으로 할당되었지만, 나머지 2명은 그렇지 않았습니다. 따라서 모든 사용자에게 대해 이를 완전히 자동화하고 싶습니다.
이를 완전히 자동화할 수 있는 방법에 대한 제안이 있으신가요?
안녕하세요 ![]()
아래 항목들을 하나씩 확인해 주실 수 있을까요?
- Discourse를 Discourse Connect 제공자로 사용하고 계신가요? (Discourse 로그인 양식을 통해 WordPress에 로그인하는 방식)
- WordPress에서 WP Discourse 플러그인을 사용하고 계신가요?
- 이 주제의 첫 번째 게시물에서 제가 올린 코드를 WordPress에 적용하고 계신가요?
맞는가요?
두 번째 옵션이 정답입니다. 저는 Discourse 플러그인을 사용 중이며, 특정 멤버십을 구매하면 해당 사용자가 자동으로 특정 그룹에 배정되도록 설정해 두었습니다.
모든 기능이 정상적으로 작동하고 있습니다. 다만, 몇 개월이 지난 후(간헐적으로) 멤버십을 구매한 특정 사용자가 해당 그룹에 배정되지 않는 문제가 발생하기도 합니다.
이러한 간헐적인 문제도 해결하고 싶습니다.
두 번째 옵션만 맞다면, 불행히도 이 안내문은 여러분에게 적용되지 않습니다. 세 가지 조건 모두 참이어야 합니다. 다만 동기화가 작동 중인 것으로 보입니다. 상황을 정확히 이해하기 위해 확인해 주시겠습니까?
-
WP Discourse 플러그인이 설치되어 있고;
-
WooCommerce 그룹을 동기화하는 코드(예: 이 코드)가 추가되어 있습니다. ← 이 코드를 추가하셨나요? 추가하신 내용을 공유해 주시겠어요?
아니요, 제 생각에는 플러그인이 모든 자동화를 처리한 것 같습니다. 통합을 위해 어떤 코드를 작성했는지 기억나지 않아요.
아마도 제 플러그인 버전이 2.2.3이고, 현재 사용 가능한 업데이트가 2.4.1이므로 구버전인 것 같습니다.
이 버전 문제 때문에 이런 현상이 발생하는 것일 수도 있습니다. 다만 업데이트를 진행한 후 현재 기능에 문제가 생기지는 않았을지 조금 궁금합니다.
WooCommerce와 Discourse 간 그룹을 동기화하려면 커스텀 코드가 필요합니다. WP Discourse 플러그인만으로는 이를 수행할 수 없습니다. 아마도 여기에서 설명된 함수의 구현이 이미 있을 가능성이 높습니다.
더 도움을 드리기 위해서는 먼저 동기화가 어떻게 이루어지고 있는지(단순히 WP Discourse 플러그인만으로 이루어지는 것이 아님) 파악해야 합니다.
WordPress에 @Ed_Bobkov님이 게시한 코드를 추가했습니다:
<?php
//wp+discourse
use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
const MEMBERSHIP_PLAN_DISCOURSE_GROUP = [
“112” => “41”
];
//const ACTIVE_STATUSES = array( ‘wcm-active’ );
const ACTIVE_STATUSES = array( ‘wcm-active’, ‘wcm-free_trial’ );
function update_discourse_group_access( $user_id, $membership_plan_id, $membership_plan_name, $status ) {
$options = DiscourseUtilities::get_options();
$base_url = $options[‘url’];
$api_key = $options[‘api-key’];
$api_username = $options[‘publish-username’];
if ( empty( $base_url ) || empty( $api_key ) || empty( $api_username ) ) {
return new \WP_Error( 'discourse_configuration_error', 'The WP Discourse plugin has not been properly configured.' );
}
$user_info = get_userdata( $user_id );
$user_email = $user_info->user_email;
$logger = wc_get_logger();
$logger->info( sprintf( '%s membership of %s changed to %s', $user_email, $membership_plan_name, $status ) );
if ( in_array( $status, ACTIVE_STATUSES ) ) {
$action = 'PUT';
} else {
$action = 'DELETE';
}
$external_url = esc_url_raw( $base_url . "/groups/" . MEMBERSHIP_PLAN_DISCOURSE_GROUP[$membership_plan_id] . "/members" );
$logger->info( sprintf( 'Sending %s request to %s with %s', $action, $external_url, $user_email ) );
$response = wp_remote_request( $external_url,
array(
'method' => $action,
'headers' => array(
'Api-Key' => sanitize_key( $api_key ),
'Api-Username' => sanitize_text_field( $api_username ),
),
'body' => array( 'user_emails' => $user_email ),
)
);
$logger->info( sprintf( 'Response from Discourse: %s %s',
wp_remote_retrieve_response_code( $response ),
wp_remote_retrieve_response_message( $response ) ) );
if ( ! DiscourseUtilities::validate( $response ) ) {
return new \WP_Error( 'discourse_response_error', 'There has been an error in retrieving the user data from Discourse.' );
}
}
function handle_wc_membership_saved( $membership_plan, $args ) {
$logger = wc_get_logger();
$logger->info( sprintf( 'Running handle_wc_membership_saved %s, %s, %s', $args['user_id'], $args['user_membership_id'], $args['is_update'] ) );
$user_id = $args['user_id'];
$membership = wc_memberships_get_user_membership( $args['user_membership_id'] );
$membership_plan_id = $membership->plan->id;
if ( $membership && isset(MEMBERSHIP_PLAN_DISCOURSE_GROUP[$membership_plan_id])) {
$membership_plan_name = $membership_plan->name;
$status = $membership->status;
update_discourse_group_access( $user_id, $membership_plan_id, $membership_plan_name, $status );
}
}
add_action( ‘wc_memberships_user_membership_saved’, ‘handle_wc_membership_saved’, 10, 2 );
/* run_full_wc_membership_sync */
function full_wc_membership_sync() {
$allusers = get_users();
$logger = wc_get_logger();
$logger->info( sprintf('Running full_wc_membership_sync') );
foreach ( $allusers as $user ) {
$user_id = $user->id;
$membership = wc_memberships_get_user_membership($user_id);
$membership_plan_id = $membership->plan->id;
$logger->info( sprintf('Checking membership of %s', $user->user_login) );
if ($membership && isset(MEMBERSHIP_PLAN_DISCOURSE_GROUP[$membership_plan_id])) {
$membership_plan_name = $membership->plan->name;
$status = $membership->status;
$logger->info( sprintf('Updating group access of %s', $user->user_login) );
update_discourse_group_access($user_id, $membership_plan_id, $membership_plan_name, $status);
$logger->info( sprintf('Sleeping for 5 seconds') );
sleep(5);
}
}
}
add_action(‘run_full_wc_membership_sync’, ‘full_wc_membership_sync’);
또한 WP Crontrol을 통해 run_full_wc_membership_sync를 추가하고 실행했습니다.
안타깝게도 활성 멤버십(id 112)을 가진 WordPress 사용자는 Discourse 그룹(id 41)에 추가되지 않습니다. 여기서 제가 놓치고 있는 부분이 무엇일까요?
이 부분이 계속 혼란을 주고 있어서, WooCommerce 멤버십 동기화(Wordpress든 Discourse든 DiscourseConnect 제공자가 되는 경우)에 대한 전체 “How to” 가이드를 게시할 예정입니다.
다음 주 초까지 제가 별도로 연락을 드리지 않았다면, 이 글에서 확인해 주세요.
감사합니다! 방법을 알아내려고 노력해 봤는데… GitHub - paviliondev/discourse-woocommerce · GitHub 플러그인도 사용해 봤지만 역시 안 됐습니다.