해결했습니다. 누군가에게 도움이 될 수 있기를 바랍니다. ‘다음 실행(Next Run)’ 필드에서 'At’을 선택하고 2020-05-10 10:00:00과 같은 날짜를 입력해야 했습니다.
동기화를 테스트해 보았는데 이제 작동합니다.
Discourse에서 여러 WooCommerce 멤버십 플랜과 그룹을 사용하는 경우 작동하는 솔루션입니다. 멤버십 ID와 Discourse 그룹 ID를 본인의 것으로 변경해야 합니다.
- WooCommerce 멤버십 플랜 ID는 Wordpress에서 플랜을 편집할 때 URL에서 찾을 수 있습니다: https://site/wp-admin/post.php?post=**441**&action=edit
- Discourse 그룹 ID는 여기에서 찾을 수 있습니다: https://site/groups/group_name.json
functions.php에 포함할 작동 코드:
요약
//wp+discourse
use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
const MEMBERSHIP_PLAN_DISCOURSE_GROUP = [
“347” => “42”,
“357” => “43”,
“441” => “44”
];
//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’);
첫 번째 열 - 멤버십 플랜 ID, 두 번째 열 - Discourse 그룹 ID를 변경해야 합니다.
요약
"347" => "42",
"357" => "43",
"441" => "44"