Migração de dados personalizada de WordPress para discourse

Eu usei o script do Discourse e migrei os dados do phpBB para o Discourse, agora migrei meu site para o WordPress e preciso migrar alguns dados de usuário. Criei campos de usuário personalizados no Discourse e usei este hook “wpdc_sso_params” para migrar os dados dos campos personalizados.
mas o problema é que ele sincroniza os dados quando o usuário faz login, se algum usuário não fizer login novamente ou os dados de usuários expirados não serão migrados dessa forma.
existe algum hook ou script que possa migrar todos os dados de usuários de uma vez?

outra coisa é que estamos mapeando campos personalizados, como posso mapear os campos de nome completo e primeiro e último nome? como podemos definir um avatar personalizado usando este hook “wpdc_sso_avatar_url”.

Se o plugin WP Discourse estiver ativado em seu site WordPress, você pode escrever um script que percorre todos os usuários do seu site e chama a função sync_sso_record com os parâmetros SSO para cada usuário que você deseja atualizar:

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

É uma função estática, então você precisa chamá-la com:

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

Faz um tempo que tentei fazer isso. Teste com um usuário antes de tentar percorrer todos os usuários do site.

Você pode usar o campo external_name do Discourse para o nome completo. O nome que você definir com o campo external_name se tornará o Nome do usuário no Discourse. Se você precisar de campos separados para nome e sobrenome, terá que criar campos personalizados para eles no Discourse.

Me avise se você tiver algum problema com isso. Posso tentar testar amanhã.

1 curtida
$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, estou fazendo certo?

Você precisa definir $sso_params_array dentro do loop foreach. Algo como:

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

Tente primeiro com apenas um usuário. Por exemplo:

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

Pode ser melhor criar um usuário de teste para isso. Você pode obter o usuário com esta função: get_user_by() – Function | Developer.WordPress.org

3 curtidas

@simon
Isso está me dando um erro fatal ao usar
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()

O plugin wp discourse está ativo e o sso está funcionando bem.

Eu tentei
use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
DiscourseUtilities::sync_sso_record($sso_params, 3992);

Desta forma, não está dando erro fatal, mas os dados dos campos personalizados não estão sendo salvos no discourse.

Retornando este erro

WP_Error Object ( [errors] => Array ( [wpdc_response_error] => Array ( [0] => Uma resposta inválida foi retornada do 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 curtida

@simon você pode verificar o problema, por favor

Olá Muhammad :slight_smile:

Todos aqui fazem o seu melhor para ajudar a resolver problemas. Simon está a ajudá-lo e é notificado automaticamente das respostas, a menos que tenha desativado as notificações.

Portanto, não há necessidade de o @mencionar e de dar um empurrão a um tópico, especialmente depois de esperar menos de 3 horas. Por favor, seja paciente a este respeito :slight_smile:

2 curtidas

Desculpe pelo erro no código que forneci. Eu estava lendo o código do plugin incorretamente. A maneira como você está chamando a função está correta. Isso também deve funcionar:

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

Eu editarei isso em minha postagem anterior.

Este é o erro:

{“failed”:“FAILED”,“message”:“O external_id é necessário, mas estava em branco”}

Você precisa definir o parâmetro external_id em seu $sso_params_array. O external_id deve ser definido como o ID do usuário do WordPress.

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