Migración personalizada de datos de WordPress a discourse

He usado un script de Discourse y he migrado datos de phpbb a Discourse, ahora he trasladado mi sitio a WordPress y necesito migrar algunos datos de usuario. He creado campos de usuario personalizados en Discourse y he utilizado este hook “wpdc_sso_params” para migrar los datos de los campos personalizados.
pero el problema es que sincroniza los datos cuando el usuario inicia sesión, si algún usuario no inicia sesión nuevamente o los datos de usuarios caducados no se migrarán de esta manera.
¿Hay algún hook o script que pueda migrar todos los datos de usuario a la vez?

Otra cosa es que estamos mapeando campos personalizados, ¿cómo puedo mapear los campos de nombre completo y nombre y apellido? como podemos establecer un avatar personalizado usando este hook “wpdc_sso_avatar_url”.

Si el plugin WP Discourse está activado en tu sitio de WordPress, puedes escribir un script que recorra todos los usuarios de tu sitio y llame a la función sync_sso_record con los parámetros SSO para cada usuario que desees actualizar:

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

Es una función estática, por lo que necesitas llamarla con:

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

Ha pasado un tiempo desde que intenté hacer esto. Pruébalo con un usuario antes de intentar recorrer todos los usuarios del sitio.

Podrías usar el campo external_name de Discourse para el nombre completo. El nombre que establezcas con el campo external_name se convertirá en el Nombre del usuario en Discourse. Si necesitas campos separados para el nombre y el apellido, tendrás que crear campos personalizados para ellos en Discourse.

Avísame si tienes algún problema con esto. Puedo intentar probarlo mañana.

1 me gusta
$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 ¿lo estoy haciendo bien?

Necesitas configurar $sso_params_array dentro del bucle 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;);
	}

Inténtalo primero con un solo usuario. Por ejemplo:

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

Sería mejor crear un usuario de prueba para esto. Puedes obtener el usuario con esta función: get_user_by() – Function | Developer.WordPress.org

3 Me gusta

@simon
esto me está dando un error fatal cuando 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()

el plugin wp discourse está activo y el sso funciona bien.

Intenté
use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
DiscourseUtilities::sync_sso_record($sso_params, 3992);

de esta manera no da error fatal, pero los datos de los campos personalizados no se guardan en discourse.

devuelve este error

WP_Error Object ( [errors] => Array ( [wpdc_response_error] => Array ( [0] => Se devolvió una respuesta no válida de Discourse ) ) [error_data] => Array ( [wpdc_response_error] => Array ( [http_code] => 422 [http_body] => {“failed”:“FAILED”,“message”:“El external_id es requerido pero estaba en blanco”} ) ) [additional_data:protected] => Array ( ) )

1 me gusta

@simon ¿puedes revisar el problema, por favor?

Hola muhammad :slight_smile:

Todos aquí hacen lo posible por ayudar a resolver problemas. Simon te está ayudando y se le notifica automáticamente de las respuestas a menos que haya desactivado las notificaciones.

Por lo tanto, no es necesario mencionarlo (@mention) y subir un tema, especialmente después de esperar menos de 3 horas. Por favor, ten paciencia al respecto :slight_smile:

2 Me gusta

Lamento el error en el código que proporcioné. Estaba leyendo mal el código del plugin. La forma en que llamas a la función es correcta. Esto también debería funcionar:

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

Lo editaré en mi publicación anterior.

Este es el error:

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

Necesitas establecer el parámetro external_id en tu $sso_params_array. El external_id debe establecerse en el ID de usuario de WordPress.

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