定制数据迁移:从 WordPress 到 discourse

我使用了 discourse 脚本并将 phpbb 数据迁移到了 discourse,现在我已将我的网站迁移到 WordPress,并且需要迁移一些用户数据。我在 discourse 中创建了自定义用户字段,并使用了“wpdc_sso_params”钩子来迁移自定义字段数据。
但问题是它会在用户登录时同步数据,如果某些用户没有再次登录或过期用户的数据将不会以这种方式迁移。
是否有任何钩子或脚本可以一次性迁移所有用户数据?

另一件事是,我们正在映射自定义字段,如何映射全名以及名字和姓氏字段?就像我们可以使用“wpdc_sso_avatar_url”钩子设置自定义头像一样。

如果您的 WordPress 网站上启用了 WP Discourse 插件,您可以编写一个脚本,循环遍历您网站上的所有用户,并为每个要更新的用户调用 sync_sso_record 函数,并传入 SSO 参数:

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

这是一个静态函数,因此您需要使用以下方式调用它:

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

我尝试这样做已经有一段时间了。在尝试循环遍历网站上的所有用户之前,请先用一个用户进行测试。

您可以使用 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;);
	}

不过,可以先只用一个用户进行尝试。例如:

$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 请检查一下问题

你好 muhammad :slight_smile:

这里的每个人都在尽力帮助解决问题。Simon 正在帮助你,并且会自动收到回复通知,除非他禁用了通知。

所以,没有必要 @提及他并顶起一个话题,尤其是在只等待了不到 3 小时之后。请在这方面保持耐心 :slight_smile:

2 个赞

抱歉我之前提供的代码有误。你调用函数的方式是正确的。这样也应该可以工作:

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

我会在之前的帖子中编辑进去。

这是错误信息:

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

你需要设置 $sso_params_array 中的 external_id 参数。external_id 应该设置为用户的 WordPress ID。

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