discourse 스크립트를 사용하여 phpbb 데이터를 discourse로 마이그레이션한 후, 현재 사이트는 WordPress로 이전되었습니다. 이제 일부 사용자 데이터를 마이그레이션해야 하는데, discourse에서 사용자 정의 필드를 생성하고 “wpdc_sso_params” 훅을 사용하여 사용자 정의 필드 데이터를 마이그레이션했습니다.
하지만 문제는 이 훅이 사용자가 로그인할 때만 데이터를 동기화한다는 점입니다. 따라서 다시 로그인하지 않거나 세션이 만료된 사용자의 데이터는 이 방식으로 마이그레이션되지 않습니다.
모든 사용자의 데이터를 한 번에 마이그레이션할 수 있는 훅이나 스크립트가 있을까요?
또 다른 질문은, 사용자 정의 필드를 매핑하는 것과 유사하게 전체 이름(full name) 및 이름(first name), 성(last name) 필드를 어떻게 매핑할 수 있느냐는 것입니다. “wpdc_sso_avatar_url” 훅을 사용하여 사용자 아바타를 설정할 수 있듯이 말입니다.
simon
4월 18, 2023, 6:58오전
3
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 이렇게 하는 게 맞나요?
simon
4월 18, 2023, 7:23오전
5
$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 ( ) )
Canapin
(Coin-coin le Canapin)
4월 18, 2023, 10:08오전
8
안녕하세요, muhammad
여기 있는 모든 분들이 문제를 해결하기 위해 최선을 다하고 있어요. Simon님이 현재 도움을 주고 계신데, 통지를 비활성화하지 않았다면 답글이 달릴 때 자동으로 알림을 받으시거든요.
그래서 그를 @멘션하거나 , 특히 3시간도 채 안 된 시점에 게시물을 올리는 것은 필요 없어요. 이 부분은 조금 더 인내심을 가져주세요
simon
4월 18, 2023, 6:28오후
9
muhammad ghufran:
다음과 같이 시도해 보았습니다.
use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
DiscourseUtilities::sync_sso_record($sso_params, 3992);
이렇게 하면 치명적 오류(fatal error)는 발생하지 않지만, 커스텀 필드 데이터가 discourse에 저장되지 않습니다.
제가 제공한 코드에서 오류가 발생해서 죄송합니다. 플러그인 코드를 잘못 읽었습니다. 함수를 호출하는 방식은 정확합니다. 다음 코드도 작동해야 합니다:
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로 설정되어야 합니다.