Migration de données personnalisée de WordPress vers Discourse

J’ai utilisé un script Discourse et migré des données phpBB vers Discourse, j’ai maintenant déplacé mon site vers WordPress et j’ai besoin de migrer certaines données utilisateur. J’ai créé des champs utilisateur personnalisés dans Discourse et utilisé ce hook “wpdc_sso_params” pour migrer les données des champs personnalisés.
mais le problème est que cela synchronise les données lorsque l’utilisateur se connecte. Si certains utilisateurs ne se connectent pas à nouveau ou si les données des utilisateurs expirés ne sont pas migrées de cette manière.
existe-t-il un hook ou un script qui peut migrer toutes les données utilisateur en une seule fois ?

autre chose, comme nous mappons des champs personnalisés, comment puis-je mapper les champs nom complet, prénom et nom de famille ? comme nous pouvons définir un avatar personnalisé en utilisant ce hook “wpdc_sso_avatar_url”.

Si le plugin WP Discourse est activé sur votre site WordPress, vous pouvez écrire un script qui parcourt tous les utilisateurs de votre site et appelle la fonction sync_sso_record avec les paramètres SSO pour chaque utilisateur que vous souhaitez mettre à jour :

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

C’est une fonction statique, vous devez donc l’appeler avec :

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

Cela fait un moment que j’ai essayé de faire cela. Testez-le avec un utilisateur avant d’essayer de parcourir tous les utilisateurs du site.

Vous pourriez utiliser le champ external_name de Discourse pour le nom complet. Le nom que vous définissez avec le champ external_name deviendra le nom de l’utilisateur sur Discourse. Si vous avez besoin de champs séparés pour le prénom et le nom de famille, vous devrez créer des champs personnalisés pour eux sur Discourse.

Faites-moi savoir si vous rencontrez des problèmes avec cela. Je peux essayer de tester cela demain.

1 « J'aime »
$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 est-ce que je fais ça correctement ?

Vous devez définir le $sso_params_array à l’intérieur de la boucle foreach. Quelque chose comme ceci :

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

Essayez d’abord avec un seul utilisateur. Par exemple :

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

Il serait peut-être préférable de créer un utilisateur de test pour cela. Vous pouvez obtenir l’utilisateur avec cette fonction : get_user_by() – Function | Developer.WordPress.org

3 « J'aime »

@simon
Ceci me donne une erreur fatale lors de l’utilisation de
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()

Le plugin wp discourse est actif et le sso fonctionne correctement.

J’ai essayé
use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
DiscourseUtilities::sync_sso_record($sso_params, 3992);

de cette façon, il ne donne pas d’erreur fatale, mais les données des champs personnalisés ne sont pas enregistrées dans discourse.

renvoie cette erreur

WP_Error Object ( [errors] => Array ( [wpdc_response_error] => Array ( [0] => Une réponse invalide a été retournée par 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 « J'aime »

@simon peux-tu s’il te plaît vérifier le problème

Salut muhammad :slight_smile:

Tout le monde ici fait de son mieux pour aider à résoudre les problèmes. Simon vous aide et est automatiquement informé des réponses, sauf s’il a désactivé les notifications.

Il n’est donc pas nécessaire de le @mentionner et de faire remonter un sujet, surtout après avoir attendu moins de 3 heures seulement. Merci de faire preuve de patience à cet égard :slight_smile:

2 « J'aime »

Désolé pour l’erreur dans le code que j’ai fourni. Je lisais mal le code du plugin. La façon dont vous appelez la fonction est correcte. Ceci devrait également fonctionner :

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

Je vais modifier cela dans mon message précédent.

Voici l’erreur :

{“failed”:“FAILED”,“message”:“L'external_id est requis mais était vide”}

Vous devez définir le paramètre external_id dans votre $sso_params_array. L’external_id doit être défini sur l’ID de l’utilisateur WordPress.

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