Migrazione dati personalizzata da WordPress a discourse

Ho utilizzato lo script di discourse e ho migrato i dati di phpbb a discourse, ora ho spostato il mio sito su WordPress e ho bisogno di migrare alcuni dati utente, ho creato campi utente personalizzati in discourse e ho utilizzato questo hook “wpdc_sso_params” per migrare i dati dei campi personalizzati.
ma il problema è che sincronizza i dati quando l’utente accede, se alcuni utenti non accedono di nuovo o gli utenti scaduti i dati non verranno migrati in questo modo.
esiste un hook o uno script che possa migrare tutti i dati utente in una volta sola?

un’altra cosa è come stiamo mappando i campi personalizzati, come posso mappare i campi nome completo e nome e cognome? come possiamo impostare avatar personalizzati usando questo hook “wpdc_sso_avatar_url”.

Se il plugin WP Discourse è attivato sul tuo sito WordPress, puoi scrivere uno script che scorre tutti gli utenti del tuo sito e chiama la funzione sync_sso_record con i parametri SSO per ogni utente che desideri aggiornare:

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

È una funzione statica, quindi devi chiamarla con:

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

È passato un po’ di tempo da quando ho provato a farlo. Testalo con un utente prima di provare a scorrere tutti gli utenti del sito.

Potresti usare il campo external_name di Discourse per il nome completo. Il nome che imposti con il campo external_name diventerà il Nome dell’utente su Discourse. Se hai bisogno di campi separati per nome e cognome, dovrai crearli come campi personalizzati su Discourse.

Fammi sapere se incontri problemi con questo. Posso provare a testarlo domani.

1 Mi Piace
$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 sto facendo la cosa giusta?

È necessario impostare $sso_params_array all’interno del ciclo foreach. Qualcosa del tipo:

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

Prova prima con un solo utente. Ad esempio:

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

Potrebbe essere meglio creare un utente di test per questo. Puoi ottenere l’utente con questa funzione: get_user_by() – Function | Developer.WordPress.org

3 Mi Piace

@simon
sto ricevendo un errore fatale quando uso
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()

il plugin wp discourse è attivo e l’sso funziona correttamente.

Ho provato
use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
DiscourseUtilities::sync_sso_record($sso_params, 3992);

in questo modo non dà errore fatale, ma i dati dei campi personalizzati non vengono salvati in discourse.

restituisce questo errore

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 Mi Piace

@simon puoi controllare il problema

Ciao Muhammad :slight_smile:

Tutti qui fanno del loro meglio per aiutare a risolvere i problemi. Simon ti sta aiutando ed è automaticamente notificato delle risposte a meno che non abbia disattivato le notifiche.

Quindi, non c’è bisogno di menzionarlo (@) e far riemergere un argomento, specialmente dopo aver aspettato meno di 3 ore. Per favore, sii paziente a riguardo :slight_smile:

2 Mi Piace

Mi scuso per l’errore nel codice che ho fornito. Stavo leggendo male il codice del plugin. Il modo in cui stai chiamando la funzione è corretto. Anche questo dovrebbe funzionare:

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

Lo modificherò nel mio post precedente.

Questo è l’errore:

{“failed”:“FAILED”,“message”:“L'external_id è richiesto ma era vuoto”}

Devi impostare il parametro external_id nel tuo $sso_params_array. L’external_id dovrebbe essere impostato sull’ID utente di WordPress.

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