WordPressからDiscourseへのカスタムデータ移行

Discourseスクリプトを使用し、phpBBデータをDiscourseに移行しました。現在、サイトをWordPressに移行しており、一部のユーザーデータを移行する必要があります。Discourseでカスタムユーザーフィールドを作成し、カスタムフィールドデータを移行するために「wpdc_sso_params」フックを使用しました。
しかし、問題はユーザーがログインしたときにデータが同期されることです。ユーザーが再度ログインしない場合や、期限切れのユーザーデータは、この方法では移行されません。
すべてのユーザーデータを一度に移行できるフックやスクリプトはありますか?

もう1つは、カスタムフィールドをマッピングする方法ですが、フルネーム、名、姓のフィールドをどのようにマッピングできますか?「wpdc_sso_avatar_url」フックを使用してカスタムアバターを設定できるような方法です。

WP Discourse プラグインが WordPress サイトで有効になっている場合、サイトのすべてのユーザーをループ処理し、更新したい各ユーザーの SSO パラメータで sync_sso_record 関数を呼び出すスクリプトを作成できます。

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

これは静的関数なので、次のように呼び出す必要があります。

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

これを試したのはしばらく前です。サイトのすべてのユーザーをループ処理する前に、1人のユーザーでテストしてください。

フルネームには Discourse の external_name フィールドを使用できます。external_name フィールドで設定した名前は、Discourse 上のユーザーの名前になります。姓と名の別々のフィールドが必要な場合は、Discourse 上でカスタムフィールドを作成する必要があります。

これに関して問題が発生した場合は、お知らせください。明日、テストしてみます。

「いいね!」 1
$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 合っていますか?

foreach ループ内で $sso_params_array を設定する必要があります。たとえば、次のようになります。

$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;);
	}

ただし、まずは 1 人のユーザーで試してください。たとえば、次のようになります。

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

テストユーザーを作成するのが最善かもしれません。この関数でユーザーを取得できます: get_user_by() – Function | Developer.WordPress.org

「いいね!」 3

@simon
WPDiscourse\Utilities\PublicPluginUtilities::sync_sso_record($sso_params_array, $myuser->ID); を使用すると致命的なエラーが発生します。

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 ( ) )

「いいね!」 1

@simon 問題を確認していただけますか

こんにちは、ムハンマドさん :slight_smile:

ここにいる皆が問題を解決するために最善を尽くしています。サイモンはあなたを助けており、彼が通知を無効にしない限り、返信は自動的に通知されます。

そのため、特に3時間も待たずにメンションしてトピックを上げる必要はありません。この点については、しばらくお待ちください :slight_smile:

「いいね!」 2

提供したコードのエラーについて申し訳ありません。プラグインのコードを誤って読んでいました。関数の呼び出し方は正しいです。これも機能するはずです。

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

以前の投稿に編集します。

エラーは次のとおりです。

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

$sso_params_arrayexternal_id パラメータを設定する必要があります。 external_id はユーザーのWordPress IDに設定する必要があります。

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.