멤버십에 추가된 사용자를 워드프레스 사이트에서 Discourse 포럼에 추가할 수 없습니다

안녕하세요. https://community.over40connect.com/ 디스커스 포럼에서 문제가 발생했습니다. 이 포럼은 wp discourse 플러그인을 사용하여 제 웹사이트 https://over40connect.com/staging/ 와 연결되어 있습니다. 사용자 역할이 변경될 때 해당 사용자를 디스커스 그룹에 추가하는 함수를 작성했는데, 사용자가 디스커스 그룹에 추가되지 않습니다. 아래는 해당 코드입니다.

function add_user_to_discourse_group_on_role_change($user_id, $role) {
    // 역할 변경이 현재 상황에 적합한지 확인합니다.
    // 예를 들어, 새로운 역할이 's2member_level1'일 때만 실행하도록 설정할 수 있습니다.
    //if ($role === 's2member_level1') {
    // 디스커스 API 엔드포인트 설정
    $discourse_endpoint = 'https://community.over40connect.com/groups/2/members.json';

    // 전송할 데이터 설정
    $data = array(
        'usernames' => array('haseebdeveloper'), // 추가할 WordPress 사용자의 사용자 이름
    );

    // API 요청 실행
    $response = wp_remote_post($discourse_endpoint, array(
        'method'      => 'POST',
        'timeout'     => 45,
        'redirection' => 5,
        'httpversion' => '1.0',
        'blocking'    => true,
        'headers'     => array(
            'Content-Type' => 'application/json',
            'Api-Key'      => 'REDACTED', // 여기에는 디스커스 API 키를 추가하세요
        ),
        'body'        => json_encode($data),
        'cookies'     => array(),
    ));

    // 오류 확인 및 응답 처리
    if (!is_wp_error($response)) {
        $response_code = wp_remote_retrieve_response_code($response);

        if ($response_code === 200) {
            $response_body = wp_remote_retrieve_body($response);
            error_log('Discourse API Response: ' . $response_body); // 응답 기록
            // 필요에 따라 응답을 처리합니다
        } else {
            error_log('Discourse API Error: Unexpected response code - ' . $response_code); // 오류 기록
            // 오류를 처리합니다
        }
    } else {
        $error_message = $response->get_error_message();
        error_log('Discourse API Error: ' . $error_message); // 오류 기록
        // 오류를 처리합니다
    }
    //}
}

@Haseeb_Ahmed 님, 코드 스니펫에서 실제 API 키로 보이는 부분을 삭제했습니다. 해당 키를 폐기하고 새 키를 생성하는 것이 좋습니다. :+1:

사이트를 방문해 본 결과, WordPress 사이트가 Discourse 사이트의 DiscourseConnect 인증 제공자로 기능하고 있는 것으로 보입니다. 만약 그렇다면, add_user_to_discourse_group 헬퍼 함수를 사용하여 WordPress 사용자를 Discourse 그룹에 추가할 수 있습니다: https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L278-L326. 함수 사용에 대한 자세한 내용은 여기에서 확인할 수 있습니다:

코드 예시 상단의 use 문구를 주의 깊게 살펴보세요:

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

그리고 이 문구가 (정적) 함수를 호출하는 데 어떻게 사용되는지 확인하세요:

$result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_name );

@simon 님, 안녕하세요. 지금은 이 코드만 사용하고 있습니다.

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// 사용자 역할이 변경될 때 실행되는 훅
add_action('set_user_role', 'add_user_to_discourse_group_on_role_change', 10, 2);

function add_user_to_discourse_group_on_role_change($user_id, $role) {

  
   $group_names = array("volunteers", "moderators");
   $result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_names );

    
}

하지만 사용자 역할을 변경해도 여전히 디스코스에 사용자를 그룹에 추가하지 않습니다.

이것은 배열이 아니라 쉼표로 구분된 문자열이어야 한다고 생각합니다:

@Firepup650의 말씀이 맞습니다. group_names 매개변수는 문자열로 설정해야 합니다. 여러 그룹에 사용자를 추가하는 경우, 그룹 이름을 쉼표로 구분하세요(쉼표 뒤에는 공백을 넣지 마세요).

$group_names = "volunteers,moderators";

동작하지 않거나, 동작하더라도 $result의 값을 로그로 기록하여 어떤 값이 반환되는지 확인해 보세요.

Hi @Firepup650, 도움을 주셔서 감사합니다. 이제 제 코드를 올립니다.

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// Hook to execute when a user role changes
add_action('set_user_role', 'add_user_to_discourse_group_on_role_change', 10, 2);

function add_user_to_discourse_group_on_role_change($user_id, $role) {

  
   $group_names = array("volunteers", "moderators");
	$group_names_string = implode(",", $group_names);

   $result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_names_string );

    
}

이 코드는 volunteers 그룹에는 사용자가 추가되지만 moderators에는 추가되지 않습니다. 문제가 무엇인지 알려주실 수 있을까요?

이 함수 호출을 사용하여 사용자를 “moderators”, “admin” 또는 “staff” 그룹에 추가할 수 없습니다. 기술적으로, 이 접근 방식을 사용하여 사용자를 어떤 “자동” 그룹에도 추가할 수 없습니다. 사용자가 추가될 수 있는 것은 사용자가 직접 만든 커스텀 그룹뿐입니다.

수정: 만약 사용자를 moderators 그룹에 추가해야 한다면, sync_sso_record 함수를 확인해 보세요: https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L70-L81. add_user_to_discourse_group 함수는 sync_sso_record를 감싼 편의 래퍼에 불과합니다.

moderator (boolean)은 SSO 파라미터로 허용되는 인자입니다: discourse/lib/discourse_connect_base.rb at 5098338a9649ee8830c8a0781e0eb538e8206eac · discourse/discourse · GitHub. add_groups 파라미터를 사용하여 사용자가 추가될 커스텀 그룹도 추가할 수 있습니다. 이렇게 하면 단일 API 호출로 사용자를 “moderators” 그룹과 “Volunteer Members” 그룹 모두에 추가할 수 있습니다.

수정 2: sync_sso_record 함수 접근 방식을 시도할 경우, moderator 파라미터에 대해 boolean true 대신 문자열 "true"를 사용해야 할 수 있습니다. PHP는 true를 1로 해석합니다. Discourse가 이 경우를 처리하도록 문자열 "true"를 허용한다고 생각합니다. 참고로 get_sso_params 함수를 사용하여 SSO 파라미터를 설정할 수 있습니다: https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L129. add_user_to_discourse_group 함수 코드 내에 이를 수행하는 예시가 있습니다.

안녕하세요 @simon. 사용자가 moderator 그룹에 추가되는 방법에 대해 말씀하신 내용을 코드를 포함한 예시로 보여줄 수 있을까요?

기본적인 아이디어는 다음과 같습니다. 사용자가 역할을 변경할 때 모든 사용자가 모더레이터 그룹에 추가되지 않도록 함수에 일부 조건을 추가해야 할 것으로 생각합니다.

function add_user_to_discourse_group_on_role_change( $user_id, $role ) {
	$sso_params = array(
		'external_id' => $user_id,
		'moderator'   => 'true', // 불리언 'true'와 'false'는 문자열로 설정해야 합니다!
		'add_groups'  => 'volunteers' // 쉼표로 구분된 목록이며, 쉼표 뒤에는 공백을 넣지 않습니다.
	);
    DiscourseUtilities::sync_sso_record( $sso_params );
}

@simon 님, 안녕하세요. 저는 지금 문제를 겪고 있습니다. 사용자 역할이 변경될 때 제가 사용하는 코드는 다음과 같습니다.

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// 사용자 역할이 변경될 때 실행되는 훅
add_action('set_user_role', 'add_user_to_discourse_group_on_role_change', 10, 2);

function add_user_to_discourse_group_on_role_change($user_id, $role) {
// 	var_dump($role);
// 	die();
	  if ($role == 's2member_level1') {
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
// 		  	$group_names = array("haseeb-group", "moderators");
// 			$s2member_level_1_groups = implode(",", $group_names);
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);
// 		  var_dump($result);
// 		  die();
		  	
// 			var_dump($result);
        }
		else if($role == 's2member_level2'){
			   $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
			  $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);
		}
		
		else if($role == 's2member_level3'){
			   $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
			  $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_3_groups);
		}
	
		
		else if($role == 's2member_level4'){
			   $s2member_level_4_groups = get_option('s2member_level_4_groups', '');
			  $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_4_groups);
		}
		
		else {
    // 모든 레벨 그룹 수집
    $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
    $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
    $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
    $s2member_level_4_groups = get_option('s2member_level_4_groups', '');

    // 모든 그룹을 하나의 배열로 결합
    $s2member_level_groups = array_merge(
        explode(',', $s2member_level_1_groups),
        explode(',', $s2member_level_2_groups),
        explode(',', $s2member_level_3_groups),
        explode(',', $s2member_level_4_groups)
    );

    // 중복 제거
    $s2member_level_groups = array_unique($s2member_level_groups);

    // 수집된 모든 그룹에서 사용자 제거
    foreach ($s2member_level_groups as $group) {
        $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
        // 필요에 따라 $result 처리 가능
    }
}


    
}

이 코드의 목적은 조건에 따라 사용자를 추가하거나 제거하는 것입니다. 하지만 어떤 경우든, 어떤 조건이든 포럼 관리자에게 사용자가 승인, 거부 또는 삭제를 위해 검토해야 한다는 알림이 전송됩니다. 왜 이런 일이 발생하는 것일까요? 예를 들어, else 블록에서는 단순히 특정 그룹에서 사용자를 제거하려 하는데, 그 경우에도 다시 관리자에게 새 사용자 검토 알림이 전송됩니다.

또 한 가지, 사용자가 워드프레스 웹사이트에 등록하면 자동으로 trust_level_0과 trust_level_1 그룹에 추가되는 이유가 무엇인지 모르겠습니다.

도움 부탁드립니다. 필요하시면 사용자 등록 훅 코드도 공유할 수 있습니다.

이는 해당 그룹들이 권한 관리 등에 사용되는 디스코스의 핵심 그룹이기 때문입니다.

화면 캡처에 언급된 대로, 모든 신규 사용자의 승인 전 스태프 승인을 요구하도록 설정되어 있기 때문입니다:

image

위에서 언급했듯이, 이는 승인 절차가 필요한 신규 사용자를 추가하고 있기 때문으로 보입니다.

@Firepup650 님이 말씀하신 내용에 덧붙이자면, 코드가

DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);

을 호출하면 Discourse의 sync_sso 라우트(Sync DiscourseConnect user data with the sync_sso route)에 요청을 보내는 헬퍼 함수가 호출됩니다. 이 요청은 기존 사용자를 업데이트하거나 새 사용자를 생성하는 데 사용됩니다. $user_id에 해당하는 사용자가 Discourse 사이트에 로그인한 적이 없다면 새 사용자가 생성됩니다. 여전히 문제없이 그룹에 추가되겠지만, 사이트 설정에서 must approve users(사용자 승인 필요)가 활성화되어 있어 관리자에게 알림이 생성됩니다:

안녕하세요 @simon, 다시 문제를 겪고 있습니다.

웹사이트에서 사용자가 등록되고 Discourse에도 추가될 때 사용자 데이터를 동기화하려고 합니다. 하지만 Discourse 프로필에 커스텀 필드 정보가 동기화되지 않습니다. 제 코드를 확인해 주실 수 있을까요?

add_action( 'user_register', 'user_registered_callback', 10, 1 ); // 인자를 하나만 받도록 조정

function user_registered_callback($user_id) {
    // 사용자 ID 기반으로 사용자 데이터 가져오기
    $user_data = get_userdata($user_id);

    // 사용자 데이터가 존재하는지 확인
    if ($user_data) {
        // 사용자 역할 가져오기
        $roles = $user_data->roles;

        // 사용자가 s2Member 역할을 가지고 있는지 확인
        if (in_array('s2member_level1', $roles)) {
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);

            // 커스텀 필드 가져오기
            $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user_id);
            // SSO 매개변수 배열 준비
            $sso_params_array = [];
            $sso_params_array = [
				'external_id' => $user_id,
                'custom.user_interests' => $custom_fields['user_interests'],
                'custom.user_age' => $custom_fields['user_age'],
                'custom.user_gender' => $custom_fields['user_gender'],
                'custom.user_sexual' => $custom_fields['user_sexual'],
                'custom.user_facebook' => $custom_fields['user_facebook'],
                'custom.user_linkedin' => $custom_fields['user_linkedin'],
                'custom.users_reasons' => $custom_fields['users_reasons']
            ];

            $fields_updated = DiscourseUtilities::sync_sso_record($sso_params_array, $user_id);
			var_dump($fields_updated);
			die();
        } elseif (in_array('s2member_level2', $roles)) {
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);
        } elseif (in_array('s2member_level3', $roles)) {
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_3_groups);
        } elseif (in_array('s2member_level4', $roles)) {
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_4_groups);
        } else {
            // 모든 레벨 그룹 수집
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');

            // 모든 그룹을 하나의 배열로 병합
            $s2member_level_groups = array_merge(
                explode(',', $s2member_level_1_groups),
                explode(',', $s2member_level_2_groups),
                explode(',', $s2member_level_3_groups),
                explode(',', $s2member_level_4_groups)
            );

            // 중복 제거
            $s2member_level_groups = array_unique($s2member_level_groups);

            // 수집된 모든 그룹에서 사용자 제거
            foreach ($s2member_level_groups as $group) {
                $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
                // 필요에 따라 $result를 처리할 수 있습니다
            }
        }
    } else {
        // 사용자 데이터를 사용할 수 없는 경우 처리
        // 요구사항에 따라 메시지를 기록하거나 다르게 처리합니다
        error_log("User data not available in user_registered_callback.");
    }
}

이제 이 코드를 확인해 주세요.

  $sso_params_array = [
				'external_id' => $user_id,
                'custom.user_interests' => $custom_fields['user_interests'],
                'custom.user_age' => $custom_fields['user_age'],
                'custom.user_gender' => $custom_fields['user_gender'],
                'custom.user_sexual' => $custom_fields['user_sexual'],
                'custom.user_facebook' => $custom_fields['user_facebook'],
                'custom.user_linkedin' => $custom_fields['user_linkedin'],
                'custom.users_reasons' => $custom_fields['users_reasons']
            ];

var_dump($fields_updated);를 실행하면 true가 반환되지만, Discourse 사용자 프로필에 데이터가 추가되지 않습니다. 문제가 무엇일까요?

특별히 변경된 사항이 없다면, 다음에 설명된 접근 방식을 사용해야 합니다: Map custom User Fields - #7 by simon.

먼저, Discourse에 커스텀 필드가 이미 존재하는지 확인하세요. 그런 다음, Discourse 사이트의 /admin/customize/user_fields 페이지에서 URL에 .json을 추가하여 userfield의 JSON을 볼 수 있도록 하세요. 예를 들어 http://localhost:4200/admin/customize/user_fields.json과 같습니다.

JSON에서 가져온 id 값을 사용하여 다음과 같은 형태의 SSO 키를 설정하세요: custom.user_field_<field_id>. 예를 들어 custom.user_field_1과 같습니다.

지금 바로 테스트할 수는 없습니다. 이 방법이 작동하는지 알려주세요. 아직 문서화가 되어 있지 않다면, 별도의 주제(topic)에서 문서화되어야 할 것입니다.

안녕하세요 @simon, 말씀해 주신 방법을 적용했고 현재 제 코드는 다음과 같습니다.

add_action( 'user_register', 'user_registered_callback', 10, 1 ); // 인수를 하나만 받도록 조정

function user_registered_callback($user_id) {
    // 사용자 ID 기반 사용자 데이터 가져오기
    $user_data = get_userdata($user_id);
// 	$user = get_user_by( 'ID', $user_id );
    // 사용자 데이터가 존재하는지 확인
    if ($user_data) {
        // 사용자 역할 가져오기
        $roles = $user_data->roles;

        // 사용자가 s2Member 역할을 가지고 있는지 확인
        if (in_array('s2member_level1', $roles)) {
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);
			 $sso_params = array();
//             // 커스텀 필드 가져오기
//             $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user_id);
//             // SSO 매개변수 배열 준비
//             $sso_params_array = [];
//             $sso_params_array = [
// 				'external_id' => $user_id,
//                 'custom.user_field_1' => $custom_fields['user_interests'],
//                 'custom.user_field_2' => $custom_fields['user_age'],
//                 'custom.user_field_3' => $custom_fields['user_gender'],
//                 'custom.user_field_4' => $custom_fields['user_sexual'],
//                 'custom.user_field_5' => $custom_fields['users_reasons']
//             ];

//             $fields_updated = DiscourseUtilities::sync_sso_record($sso_params_array);
			 $sso_params = apply_filters( 'wpdc_sso_params', $sso_params, $user_data );
			var_dump($sso_params);
			die();
        } elseif (in_array('s2member_level2', $roles)) {
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);
        } elseif (in_array('s2member_level3', $roles)) {
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_3_groups);
        } elseif (in_array('s2member_level4', $roles)) {
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_4_groups);
        } else {
            // 모든 레벨 그룹 수집
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');

            // 모든 그룹을 하나의 배열로 병합
            $s2member_level_groups = array_merge(
                explode(',', $s2member_level_1_groups),
                explode(',', $s2member_level_2_groups),
                explode(',', $s2member_level_3_groups),
                explode(',', $s2member_level_4_groups)
            );

            // 중복 제거
            $s2member_level_groups = array_unique($s2member_level_groups);

            // 수집된 모든 그룹에서 사용자 제거
            foreach ($s2member_level_groups as $group) {
                $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
                // 필요에 따라 $result를 처리할 수 있습니다
            }
        }
    } else {
        // 사용자 데이터를 사용할 수 없는 경우 처리
        // 요구 사항에 따라 메시지를 기록하거나 다르게 처리
        error_log("User data not available in user_registered_callback.");
    }
}




add_filter( 'wpdc_sso_params', 'my_namespace_set_discourse_custom_field', 10, 2 );

function my_namespace_set_discourse_custom_field( $sso_params, $user ) {
    $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user->ID);
	
    // $custom_fields가 배열이고 비어 있지 않은지 확인
    if (is_array($custom_fields) && !empty($custom_fields)) {
        // SSO 매개변수에 커스텀 필드를 각각의 키에 할당
        $sso_params['custom.user_field_1'] = $custom_fields['user_interests'];
        $sso_params['custom.user_field_2'] = $custom_fields['user_age'];
        $sso_params['custom.user_field_3'] = $custom_fields['user_gender'];
        $sso_params['custom.user_field_4'] = $custom_fields['user_sexual'];
        $sso_params['custom.user_field_5'] = $custom_fields['users_reasons'];
    } else {
        // $custom_fields가 예상 형식이 아닌 경우错误或 메시지를 기록하거나 표시
        error_log('Custom fields data is not in the expected format.');
    }

    // 수정된 SSO 매개변수 반환
    return $sso_params;
}

현재 문제는 users_reasons가 custom.user_field_5에 추가되지 않는다는 것입니다. 다른 데이터는 Discourse 사용자 프로필에 정상적으로 추가됩니다. 예를 들어 이 라인 $sso_params[‘custom.user_field_5’] = $custom_fields[‘users_reasons’]; 을 주석 처리하면 다른 필드 데이터가 Discourse 사용자에게 추가되지만, 이 라인을 주석 처리하지 않으면 Discourse 사용자 프로필에 데이터가 전혀 추가되지 않습니다. 말씀드리고 싶은 것은 Discourse 사이트와 WordPress 사이트 모두에서 users_reasons 필드가 다중 선택(multiselect) 필드라는 점입니다. 이것이 원인이 될 수 있을까요? 알려주시면 감사하겠습니다.

네, 문제는 다중 선택(multiselect) 필드라는 점입니다. 아직 지원되는지 확실하지 않습니다: Add support for multi-select fields in DiscourseConnect protocol.

지금 바로 작동하게 만드는 방법이 있을 수도 있지만, 어떻게 해야 할지 모르겠습니다. 호출되는 Discourse 코드는 여기에 있습니다: discourse/app/models/discourse_connect.rb at main · discourse/discourse · GitHub

@simon 님, 안녕하세요. 제공해주신 참고 자료를 바탕으로 제 코드에 맞는 코드 예시를 작성해 주실 수 있을까요?

가능하지 않다고 생각합니다. 제가 파악한 바로는, 제가 링크한 게시글이 작성된 이후 SSO 페이로드에서 커스텀 필드를 설정하는 코드가 약간 변경되었지만, SSO 페이로드에서 다중 선택 필드를 업데이트할 수 있도록 변경된 것은 아닙니다.

이상적으로는 Discourse가 add_groups SSO 필드를 처리하는 방식과 유사하게 이 경우를 처리해야 합니다: discourse/app/models/discourse_connect.rb at main · discourse/discourse · GitHub. 이를 위해 Discourse SSO 코드는 특정 커스텀 필드가 다중 선택 필드인지 알아야 합니다. 현재 코드가 그런 정보를 가지고 있다고 생각하지 않습니다.

다시 말하지만, 현재 가능한 방법이 있을 수도 있지만, 제 능력 밖의 일입니다.

안녕하세요 @simon, 저는 이미 SSO를 위해 WP Discourse 플러그인을 사용 중인데, 이제 사용자가 Discourse 웹사이트에서 아바타를 변경하면 WordPress 웹사이트에서도 자동으로 변경되도록 동기화하고 싶습니다. WordPress 웹사이트에서는 하나의 사용자 아바타 플러그인을 사용하길 원합니다. 현재 제가 사용하고 있는 코드는 다음과 같습니다.

function my_wpdc_sso_client_updated_user( $updated_user, $query ) {
		$avatar_url = $query['avatar_url'];
		$user_id = $updated_user->ID;
		// download_url() 및 wp_handle_sideload() 함수를 사용할 수 있도록 합니다
	require_once( ABSPATH . 'wp-admin/includes/file.php' );

	// 임시 디렉토리로 다운로드
	$temp_file = download_url( $avatar_url );

	if( is_wp_error( $temp_file ) ) {
		return false;
	}

	// 임시 파일을 업로드 디렉토리로 이동
	$file = array(
		'name'     => basename( $image_url ),
		'type'     => mime_content_type( $temp_file ),
		'tmp_name' => $temp_file,
		'size'     => filesize( $temp_file ),
	);
	$sideload = wp_handle_sideload(
		$file,
		array(
			'test_form'   => false // 'action' 파라미터를 확인할 필요가 없음
		)
	);

	if( ! empty( $sideload[ 'error' ] ) ) {
		// 원한다면 오류 메시지를 반환할 수 있습니다
		return false;
	}

	// 이제 업로드된 이미지를 WordPress 미디어 라이브러리에 추가할 시간입니다
	$attachment_id = wp_insert_attachment(
		array(
			'guid'           => $sideload[ 'url' ],
			'post_mime_type' => $sideload[ 'type' ],
			'post_title'     => basename( $sideload[ 'file' ] ),
			'post_content'   => '',
			'post_status'    => 'inherit',
		),
		$sideload[ 'file' ]
	);

	if( is_wp_error( $attachment_id ) || ! $attachment_id ) {
		return false;
	}

	// 메타데이터 업데이트 및 이미지 크기 재생성
	require_once( ABSPATH . 'wp-admin/includes/image.php' );

	wp_update_attachment_metadata(
		$attachment_id,
		wp_generate_attachment_metadata( $attachment_id, $sideload[ 'file' ] )
	);

	// 첨부 파일 ID 반환
	update_user_meta($user_id, '1709753088_wp_user_avatar', $attachment_id);
	update_user_meta($user_id, 'wp_user_avatar', $attachment_id);
}

보시다시피 첨부 파일 ID를 사용하여 사용자의 메타 키를 업데이트하려고 하는데, 첨부 파일 ID가 생성되지 않고 있습니다.

답변을 기다리고 있습니다.

감사합니다.