Пользовательская миграция данных из WordPress в Discourse

Я использовал скрипт Discourse и перенёс данные из phpBB в Discourse. Теперь я переместил свой сайт на WordPress и мне нужно перенести некоторые данные пользователей. Я создал пользовательские поля в Discourse и использовал хук wpdc_sso_params для миграции данных из этих полей.

Однако проблема в том, что данные синхронизируются только при входе пользователя в систему. Если пользователь больше не входит в систему или его сессия истекла, его данные не будут перенесены таким образом.

Существует ли хук или скрипт, который позволил бы перенести данные всех пользователей сразу?

Кроме того, при сопоставлении пользовательских полей, как можно сопоставить полное имя с полями «Имя» и «Фамилия»? Например, мы можем установить пользовательскую аватарку, используя хук wpdc_sso_avatar_url.

Если плагин WP Discourse активирован на вашем сайте WordPress, вы можете написать скрипт, который переберет всех пользователей вашего сайта и вызовет функцию 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)

Прошло уже довольно много времени с тех пор, как я пытался это сделать. Протестируйте сначала на одном пользователе, прежде чем запускать цикл для всех пользователей сайта.

Вы можете использовать поле external_name в Discourse для полного имени. Значение, заданное в поле external_name, станет именем пользователя в Discourse. Если вам нужны отдельные поля для имени и фамилии, вам придется создать для них пользовательские поля в 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);

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:

Здесь каждый делает всё возможное, чтобы помочь решить проблемы. Симон помогает вам и автоматически получает уведомления о новых ответах, если он не отключил их.

Поэтому нет необходимости упоминать его через @mention и поднимать тему, особенно после ожидания менее 3 часов. Пожалуйста, будьте терпеливы в этом вопросе :slight_smile:

Извините за ошибку в предоставленном коде. Я неправильно прочитал код плагина. Вы вызываете функцию правильно. Также должно сработать следующее:

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

Я внесу это изменение в свой предыдущий пост.

Это ошибка:

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

Вам необходимо установить параметр external_id в вашем массиве $sso_params_array. Значение external_id должно соответствовать ID пользователя в WordPress.