WordPress에서 Discourse로 사용자 데이터 마이그레이션

discourse 스크립트를 사용하여 phpbb 데이터를 discourse로 마이그레이션한 후, 현재 사이트는 WordPress로 이전되었습니다. 이제 일부 사용자 데이터를 마이그레이션해야 하는데, discourse에서 사용자 정의 필드를 생성하고 “wpdc_sso_params” 훅을 사용하여 사용자 정의 필드 데이터를 마이그레이션했습니다.

하지만 문제는 이 훅이 사용자가 로그인할 때만 데이터를 동기화한다는 점입니다. 따라서 다시 로그인하지 않거나 세션이 만료된 사용자의 데이터는 이 방식으로 마이그레이션되지 않습니다.

모든 사용자의 데이터를 한 번에 마이그레이션할 수 있는 훅이나 스크립트가 있을까요?

또 다른 질문은, 사용자 정의 필드를 매핑하는 것과 유사하게 전체 이름(full name) 및 이름(first name), 성(last name) 필드를 어떻게 매핑할 수 있느냐는 것입니다. “wpdc_sso_avatar_url” 훅을 사용하여 사용자 아바타를 설정할 수 있듯이 말입니다.

WordPress 사이트에 WP Discourse 플러그인이 활성화되어 있다면, 사이트의 모든 사용자를 순회하며 갱신하려는 각 사용자의 SSO 매개변수를 사용하여 sync_sso_record 함수를 호출하는 스크립트를 작성할 수 있습니다:

https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L78

이것은 정적(static) 함수이므로 다음과 같이 호출해야 합니다:

WPDiscourse\Utilities\Utilities::sync_sso_record($sso_params_array, $wp_user_id)

이 작업을 시도한 지 꽤 오래되었으니, 사이트의 모든 사용자를 순회하기 전에 먼저 한 명의 사용자로 테스트해 보시기 바랍니다.

전체 이름에는 Discourse의 external_name 필드를 사용할 수 있습니다. external_name 필드로 설정한 이름은 Discourse에서 사용자의 이름(Name)으로 표시됩니다. 이름과 성을 별도로 구분하는 필드가 필요하면 Discourse에서 해당 필드들을 위한 커스텀 필드를 직접 생성해야 합니다.

이 과정에서 문제가 발생하면 알려주세요. 내일 직접 테스트해 볼 수 있습니다.

$myusers = get_users( );
	$sso_params_array = [];
	$sso_params_array['custom.user_field_1'] = $user->user_login;
	$sso_params_array['custom.user_field_2'] = get_user_meta( $user->ID, 'first_name', true );
	$sso_params_array['custom.user_field_3'] = get_user_meta( $user->ID, 'last_name', true );
	foreach ( $myusers as $myuser ) {
		WPDiscourse\Utilities\PublicPluginUtilities::sync_sso_record($sso_params_array, $myuser->ID;);
	}

@simon 이렇게 하는 게 맞나요?

$sso_params_array를 foreach 루프 내부에 설정해야 합니다. 다음과 같이 설정해 보세요:

$myusers = get_users();
foreach ( $myusers as $myuser ) {
    $sso_params_array = [];
    $sso_params_array['custom.user_field_1'] = $myuser->user_login;
    $sso_params_array['custom.user_field_2'] = get_user_meta( $myuser->ID, 'first_name', true );
    $sso_params_array['custom.user_field_3'] = get_user_meta( $myuser->ID, 'last_name', true );

	WPDiscourse\Utilities\Utilities::sync_sso_record($sso_params_array, $myuser->ID;);
	}

다만, 먼저 사용자 한 명으로만 시도해 보세요. 예를 들어:

$myuser = get_user_by('id', 1);

이 작업을 위해 테스트 사용자를 만드는 것이 가장 좋습니다. 이 함수를 사용하면 사용자를 가져올 수 있습니다: get_user_by() – Function | Developer.WordPress.org

@simon

WPDiscourse\Utilities\PublicPluginUtilities::sync_sso_record($sso_params_array, $myuser->ID);
를 사용했을 때 치명적인 오류(fatal error)가 발생합니다.

PHP Fatal error: Uncaught Error: Call to undefined method WPDiscourse\Utilities\PublicPluginUtilities::sync_sso_record()

wp discourse 플러그인은 활성화되어 있고 SSO는 정상적으로 작동하고 있습니다.

다음과 같이 시도해 보았습니다.
use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
DiscourseUtilities::sync_sso_record($sso_params, 3992);

이 방식으로는 치명적인 오류가 발생하지는 않지만, Discourse에 커스텀 필드 데이터가 저장되지 않습니다.

다음과 같은 오류가 반환됩니다.

WP_Error Object ( [errors] => Array ( [wpdc_response_error] => Array ( [0] => An invalid response was returned from Discourse ) ) [error_data] => Array ( [wpdc_response_error] => Array ( [http_code] => 422 [http_body] => {“failed”:“FAILED”,“message”:“The external_id is required but was blank”} ) ) [additional_data:protected] => Array ( ) )

@simon 문제를 확인해 줄 수 있을까요?

안녕하세요, muhammad :slight_smile:

여기 있는 모든 분들이 문제를 해결하기 위해 최선을 다하고 있어요. Simon님이 현재 도움을 주고 계신데, 통지를 비활성화하지 않았다면 답글이 달릴 때 자동으로 알림을 받으시거든요.

그래서 그를 @멘션하거나, 특히 3시간도 채 안 된 시점에 게시물을 올리는 것은 필요 없어요. 이 부분은 조금 더 인내심을 가져주세요 :slight_smile:

제가 제공한 코드에서 오류가 발생해서 죄송합니다. 플러그인 코드를 잘못 읽었습니다. 함수를 호출하는 방식은 정확합니다. 다음 코드도 작동해야 합니다:

WPDiscourse\Utilities\Utilities::sync_sso_record($sso_params, 3992);

이 내용을 이전 게시글에 수정하여 반영하겠습니다.

해당 오류는 다음과 같습니다:

{"failed":"FAILED","message":"The external_id is required but was blank"}

$sso_params_array에서 external_id 매개변수를 설정해야 합니다. external_id는 사용자의 WordPress ID로 설정되어야 합니다.