Je ne peux pas ajouter un utilisateur au forum Discourse depuis un site WordPress lorsque l'utilisateur est ajouté dans un Membership

Bonjour, j’ai un problème avec le forum Discourse qui est https://community.over40connect.com/ et qui est connecté à mon site web https://over40connect.com/staging/ en utilisant le plugin wp discourse. J’ai créé une fonction pour ajouter un utilisateur au groupe Discourse lorsque le rôle de l’utilisateur change, mais cet utilisateur n’est pas ajouté au groupe Discourse. Voici le code :

function add_user_to_discourse_group_on_role_change($user_id, $role) {
    // Vérifiez si le changement de rôle est pertinent pour votre cas
    // Par exemple, vous pourriez vouloir exécuter ceci uniquement si le nouveau rôle est 's2member_level1'
    //if ($role === 's2member_level1') {
    // Définissez le point de terminaison de l'API Discourse
    $discourse_endpoint = 'https://community.over40connect.com/groups/2/members.json';

    // Configurez les données à envoyer
    $data = array(
        'usernames' => array('haseebdeveloper'), // Le nom d'utilisateur de l'utilisateur WordPress à ajouter
    );

    // Effectuez la requête API
    $response = wp_remote_post($discourse_endpoint, array(
        'method'      => 'POST',
        'timeout'     => 45,
        'redirection' => 5,
        'httpversion' => '1.0',
        'blocking'    => true,
        'headers'     => array(
            'Content-Type' => 'application/json',
            'Api-Key'      => 'REDACTED', // Ajoutez votre clé API Discourse ici
        ),
        'body'        => json_encode($data),
        'cookies'     => array(),
    ));

    // Vérifiez les erreurs et gérez la réponse
    if (!is_wp_error($response)) {
        $response_code = wp_remote_retrieve_response_code($response);

        if ($response_code === 200) {
            $response_body = wp_remote_retrieve_body($response);
            error_log('Discourse API Response: ' . $response_body); // Enregistrez la réponse
            // Gérez la réponse au besoin
        } else {
            error_log('Discourse API Error: Unexpected response code - ' . $response_code); // Enregistrez l'erreur
            // Gérez l'erreur
        }
    } else {
        $error_message = $response->get_error_message();
        error_log('Discourse API Error: ' . $error_message); // Enregistrez l'erreur
        // Gérez l'erreur
    }
    //}
}
1 « J'aime »

J’ai supprimé ce qui ressemblait à une véritable clé d’API de votre extrait de code @Haseeb_Ahmed. Vous voudrez peut-être révoquer celle-ci et en générer une nouvelle. :+1:

4 « J'aime »

D’après la visite de votre site, je pense que votre site WordPress fonctionne comme fournisseur d’authentification DiscourseConnect pour votre site Discourse. Si c’est le cas, vous pouvez utiliser la fonction d’aide add_user_to_discourse_group pour ajouter des utilisateurs WordPress aux groupes Discourse : https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L278-L326. Les détails sur l’utilisation de la fonction se trouvent ici :

Notez l’instruction use en haut de l’exemple de code :

use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;

Et comment cela est ensuite utilisé pour appeler la fonction (statique) :

$result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_name );
3 « J'aime »

Salut @simon, j’ai seulement utilisé ce code

use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;

// Hook to execute when a user role changes
add_action('set_user_role', 'add_user_to_discourse_group_on_role_change', 10, 2);

function add_user_to_discourse_group_on_role_change($user_id, $role) {

   $group_names = array("volunteers", "moderators");
   $result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_names );

}

mais il n’ajoute toujours pas l’utilisateur au groupe Discourse lorsque je change le rôle de l’utilisateur.

Je pense que cela est censé être une chaîne séparée par des virgules, pas un tableau :

2 « J'aime »

@Firepup650 a raison. Le paramètre group_names doit être défini sur une chaîne de caractères. Si vous ajoutez des utilisateurs à plusieurs groupes, séparez les noms de groupes par une virgule (sans espace après la virgule).

$group_names = "volunteers,moderators";

Si cela ne fonctionne pas, ou même si cela fonctionne, essayez d’enregistrer la valeur de $result pour voir ce qui est renvoyé.

3 « J'aime »

Salut @Firepup650 merci pour ton aide, voici mon code maintenant

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// Hook pour exécuter lorsqu'un rôle utilisateur change
add_action('set_user_role', 'add_user_to_discourse_group_on_role_change', 10, 2);

function add_user_to_discourse_group_on_role_change($user_id, $role) {

  
   $group_names = array("volunteers", "moderators");
	$group_names_string = implode(",", $group_names);

   $result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_names_string );

    
}

il ajoute l’utilisateur au groupe des volontaires mais pas à celui des modérateurs, peux-tu me dire quel est le problème

1 « J'aime »

Vous ne pouvez pas ajouter d’utilisateurs aux groupes « modérateurs », « admin » ou « staff » avec cet appel de fonction. Techniquement, vous ne pouvez pas ajouter d’utilisateurs à des groupes « automatiques » avec cette approche. Vous ne pouvez ajouter des utilisateurs qu’à des groupes personnalisés que vous avez créés.

Modification : si vous avez besoin d’ajouter des utilisateurs au groupe des modérateurs, jetez un œil à la fonction sync_sso_record : https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L70-L81. La fonction add_user_to_discourse_group n’est qu’un wrapper pratique autour de sync_sso_record.

moderator (boolean) est un argument accepté pour les paramètres SSO : discourse/lib/discourse_connect_base.rb at 5098338a9649ee8830c8a0781e0eb538e8206eac · discourse/discourse · GitHub. Vous pouvez également ajouter des groupes personnalisés auxquels vous souhaitez ajouter des utilisateurs en utilisant le paramètre add_groups. Cela vous permettrait d’ajouter un utilisateur au groupe « modérateurs » et au groupe « Volunteer Members » en un seul appel API.

Modification 2 : Si vous essayez l’approche de la fonction sync_sso_record, vous devrez peut-être utiliser la chaîne \"true\" au lieu du booléen true pour le paramètre moderator. PHP interprète true comme 1. Je pense que Discourse accepte la chaîne \"true\" pour gérer ce cas. Notez que vous pouvez utiliser la fonction get_sso_params pour définir les paramètres SSO : https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L129. Il y a un exemple de la façon de le faire dans le code de la fonction add_user_to_discourse_group.

3 « J'aime »

Salut @simon, peux-tu me donner un exemple avec du code montrant comment ajouter un utilisateur au groupe des modérateurs ?

Voici l’idée de base. Je suppose que vous devrez ajouter une condition à la fonction afin que tous les utilisateurs ne soient pas ajoutés au groupe des modérateurs lorsque leur rôle change.

function add_user_to_discourse_group_on_role_change( $user_id, $role ) {
	$sso_params = array(
		'external_id' => $user_id,
		'moderator'   => 'true', // les booléens 'true' et 'false' doivent être définis comme des chaînes de caractères !
		'add_groups'  => 'volunteers' // liste séparée par des virgules, sans espaces après les virgules
	);
    DiscourseUtilities::sync_sso_record( $sso_params );
}
1 « J'aime »

Salut @simon, j’ai un problème. Voici le code que j’utilise lorsque le rôle d’un utilisateur change :

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// Hook pour exécuter lorsque le rôle d'un utilisateur change
add_action('set_user_role', 'add_user_to_discourse_group_on_role_change', 10, 2);

function add_user_to_discourse_group_on_role_change($user_id, $role) {
// 	var_dump($role);
// 	die();
	  if ($role == 's2member_level1') {
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
// 	\t  \t$group_names = array("haseeb-group", "moderators");
// 	\t\t$s2member_level_1_groups = implode(",", $group_names);
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);
// 	\t\t  var_dump($result);
// 	\t\t  die();
	  	
// 	\t\t\tvar_dump($result);
        }
		else if($role == 's2member_level2'){
			   $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
			  $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);
		}
		
		else if($role == 's2member_level3'){
			   $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
			  $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_3_groups);
		}
	
		
		else if($role == 's2member_level4'){
			   $s2member_level_4_groups = get_option('s2member_level_4_groups', '');
			  $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_4_groups);
		}
		
		else {
    // Collect all level groups
    $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
    $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
    $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
    $s2member_level_4_groups = get_option('s2member_level_4_groups', '');

    // Combine all groups into one array
    $s2member_level_groups = array_merge(
        explode(',', $s2member_level_1_groups),
        explode(',', $s2member_level_2_groups),
        explode(',', $s2member_level_3_groups),
        explode(',', $s2member_level_4_groups)
    );

    // Remove duplicates
    $s2member_level_groups = array_unique($s2member_level_groups);

    // Remove user from all collected groups
    foreach ($s2member_level_groups as $group) {
        $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
        // You may handle $result as needed
    }
}


    
}

Le but du code est d’ajouter ou de supprimer un utilisateur en fonction de conditions, mais dans tous les cas, il envoie une notification aux administrateurs du forum indiquant qu’il faut approuver, rejeter ou supprimer l’utilisateur. Pourquoi cela se produit-il dans tous les cas ? Par exemple, dans le cas else, je veux juste supprimer l’utilisateur d’un groupe spécifique, mais dans ce cas, une notification de révision du nouvel utilisateur est toujours envoyée à l’administrateur.

Une autre chose : lorsque l’utilisateur s’inscrit sur le site WordPress, il est automatiquement ajouté à ces groupes trust_level_0 et trust_level_1, je ne sais pas pourquoi.

Pouvez-vous m’aider ? Je peux aussi vous partager le hook d’enregistrement de l’utilisateur.

Ce serait parce que ce sont des groupes de discussion de base, utilisés pour gérer les autorisations et autres.

Ce serait parce que vous avez activé le paramètre qui exige que tous les nouveaux utilisateurs soient approuvés par le personnel, comme le mentionne votre capture d’écran :

image

Il semble que vous ajoutiez de nouveaux utilisateurs, ce qui nécessite une approbation, comme je l’ai mentionné ci-dessus.

1 « J'aime »

Pour compléter ce que @Firepup650 a écrit, lorsque votre code appelle

DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);

il appelle une fonction d’aide qui fait une requête à la route sync_sso de Discourse : Sync DiscourseConnect user data with the sync_sso route. Cette requête est utilisée pour mettre à jour un utilisateur existant ou pour créer de nouveaux utilisateurs. Si l’utilisateur avec $user_id ne s’est jamais connecté à votre site Discourse, un nouvel utilisateur sera créé. Il devrait toujours être ajouté aux groupes sans aucun problème, mais cela générera une notification pour les modérateurs car votre site a activé le paramètre du site must approve users :

1 « J'aime »

Salut @simon, j’ai encore un problème.

Je veux synchroniser les données utilisateur lorsqu’un utilisateur s’inscrit sur le site web et qu’il est également ajouté à Discourse, mais les informations des champs personnalisés ne sont pas synchronisées dans son profil sur Discourse. Voici mon code, vous pouvez le vérifier :

add_action( 'user_register', 'user_registered_callback', 10, 1 ); // Ajusté pour accepter un seul argument

function user_registered_callback($user_id) {
    // Obtenir les données utilisateur basées sur l'ID utilisateur
    $user_data = get_userdata($user_id);

    // Vérifier si les données utilisateur existent
    if ($user_data) {
        // Obtenir les rôles utilisateur
        $roles = $user_data->roles;

        // Vérifier si l'utilisateur a le rôle s2Member
        if (in_array('s2member_level1', $roles)) {
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);

            // Obtenir les champs personnalisés
            $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user_id);
            // Préparer le tableau des paramètres SSO
            $sso_params_array = [];
            $sso_params_array = [
				'external_id' => $user_id,
                'custom.user_interests' => $custom_fields['user_interests'],
                'custom.user_age' => $custom_fields['user_age'],
                'custom.user_gender' => $custom_fields['user_gender'],
                'custom.user_sexual' => $custom_fields['user_sexual'],
                'custom.user_facebook' => $custom_fields['user_facebook'],
                'custom.user_linkedin' => $custom_fields['user_linkedin'],
                'custom.users_reasons' => $custom_fields['users_reasons']
            ];

            $fields_updated = DiscourseUtilities::sync_sso_record($sso_params_array, $user_id);
			var_dump($fields_updated);
			die();
        } elseif (in_array('s2member_level2', $roles)) {
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);
        } elseif (in_array('s2member_level3', $roles)) {
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_3_groups);
        } elseif (in_array('s2member_level4', $roles)) {
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_4_groups);
        } else {
            // Collecter tous les groupes de niveaux
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');

            // Combiner tous les groupes en un seul tableau
            $s2member_level_groups = array_merge(
                explode(',', $s2member_level_1_groups),
                explode(',', $s2member_level_2_groups),
                explode(',', $s2member_level_3_groups),
                explode(',', $s2member_level_4_groups)
            );

            // Supprimer les doublons
            $s2member_level_groups = array_unique($s2member_level_groups);

            // Supprimer l'utilisateur de tous les groupes collectés
            foreach ($s2member_level_groups as $group) {
                $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
                // Vous pouvez gérer $result au besoin
            }
        }
    } else {
        // Gérer les cas où les données utilisateur ne sont pas disponibles
        // Enregistrer un message ou gérer différemment selon vos besoins
        error_log("User data not available in user_registered_callback.");
    }
}

Maintenant, vous pouvez vérifier ce code.

  $sso_params_array = [
				'external_id' => $user_id,
                'custom.user_interests' => $custom_fields['user_interests'],
                'custom.user_age' => $custom_fields['user_age'],
                'custom.user_gender' => $custom_fields['user_gender'],
                'custom.user_sexual' => $custom_fields['user_sexual'],
                'custom.user_facebook' => $custom_fields['user_facebook'],
                'custom.user_linkedin' => $custom_fields['user_linkedin'],
                'custom.users_reasons' => $custom_fields['users_reasons']
            ];

Lorsque je fais var_dump($fields_updated);, cela renvoie true, mais cela n’ajoute pas les données au profil utilisateur sur Discourse. Quel est le problème ?

Sauf si quelque chose a changé, vous devez utiliser l’approche décrite ici : Map custom User Fields - #7 by simon.

Tout d’abord, assurez-vous que les champs personnalisés existent déjà sur Discourse. Ensuite, sur la page /admin/customize/user_fields de votre site Discourse, ajoutez .json à l’URL afin de pouvoir voir le JSON du champ utilisateur. Par exemple : http://localhost:4200/admin/customize/user_fields.json.

Utilisez les valeurs id du JSON pour définir des clés SSO qui ressemblent à ceci : custom.user_field_<field_id>. Par exemple : custom.user_field_1

Je ne peux pas tester cela pour le moment. Faites-moi savoir si cela fonctionne. Si cela n’a pas déjà été fait, cela devrait être documenté dans son propre sujet.

Salut @simon, j’ai utilisé ton approche mentionnée et voici mon code maintenant

add_action( 'user_register', 'user_registered_callback', 10, 1 ); // Ajusté pour accepter un seul argument

function user_registered_callback($user_id) {
    // Obtenir les données de l'utilisateur en fonction de l'ID de l'utilisateur
    $user_data = get_userdata($user_id);
// 	$user = get_user_by( 'ID', $user_id );
    // Vérifier si les données de l'utilisateur existent
    if ($user_data) {
        // Obtenir les rôles de l'utilisateur
        $roles = $user_data->roles;

        // Vérifier si l'utilisateur a le rôle s2Member
        if (in_array('s2member_level1', $roles)) {
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);
			 $sso_params = array();
//             // Obtenir les champs personnalisés
//             $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user_id);
//             // Préparer le tableau des paramètres SSO
//             $sso_params_array = [];
//             $sso_params_array = [
// 				'external_id' => $user_id,
//                 'custom.user_field_1' => $custom_fields['user_interests'],
//                 'custom.user_field_2' => $custom_fields['user_age'],
//                 'custom.user_field_3' => $custom_fields['user_gender'],
//                 'custom.user_field_4' => $custom_fields['user_sexual'],
//                 'custom.user_field_5' => $custom_fields['users_reasons']
//             ];

//             $fields_updated = DiscourseUtilities::sync_sso_record($sso_params_array);
			 $sso_params = apply_filters( 'wpdc_sso_params', $sso_params, $user_data );
			var_dump($sso_params);
			die();
        } elseif (in_array('s2member_level2', $roles)) {
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);
        } elseif (in_array('s2member_level3', $roles)) {
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_3_groups);
        } elseif (in_array('s2member_level4', $roles)) {
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_4_groups);
        } else {
            // Collecter tous les groupes de niveaux
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');

            // Combiner tous les groupes en un seul tableau
            $s2member_level_groups = array_merge(
                explode(',', $s2member_level_1_groups),
                explode(',', $s2member_level_2_groups),
                explode(',', $s2member_level_3_groups),
                explode(',', $s2member_level_4_groups)
            );

            // Supprimer les doublons
            $s2member_level_groups = array_unique($s2member_level_groups);

            // Supprimer l'utilisateur de tous les groupes collectés
            foreach ($s2member_level_groups as $group) {
                $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
                // Vous pouvez gérer $result au besoin
            }
        }
    } else {
        // Gérer les cas où les données de l'utilisateur ne sont pas disponibles
        // Enregistrer un message ou gérer différemment selon vos besoins
        error_log("Données utilisateur non disponibles dans user_registered_callback.");
    }
}




add_filter( 'wpdc_sso_params', 'my_namespace_set_discourse_custom_field', 10, 2 );

function my_namespace_set_discourse_custom_field( $sso_params, $user ) {
    $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user->ID);
	
    // Vérifier si $custom_fields est un tableau et n'est pas vide
    if (is_array($custom_fields) && !empty($custom_fields)) {
        // Assigner les champs personnalisés aux clés respectives dans les paramètres SSO
        $sso_params['custom.user_field_1'] = $custom_fields['user_interests'];
        $sso_params['custom.user_field_2'] = $custom_fields['user_age'];
        $sso_params['custom.user_field_3'] = $custom_fields['user_gender'];
        $sso_params['custom.user_field_4'] = $custom_fields['user_sexual'];
        $sso_params['custom.user_field_5'] = $custom_fields['users_reasons'];
    } else {
        // Enregistrer ou afficher un message d'erreur si $custom_fields n'est pas dans le format attendu
        error_log('Les données des champs personnalisés ne sont pas dans le format attendu.');
    }

    // Retourner les paramètres SSO modifiés
    return $sso_params;
}

maintenant, le seul problème est qu’il n’ajoute pas users_reasons dans custom.user_field_5 et ajoute d’autres données au profil de l’utilisateur. Par exemple, si je commente cette ligne $sso_params['custom.user_field_5'] = $custom_fields['users_reasons'];, il ajoute les données des autres champs à l’utilisateur Discourse. Si je ne commente pas cette ligne, aucune donnée n’est ajoutée au profil utilisateur sur Discourse. Je dois dire que le champ users_reasons sur le site Discourse et sur le site WordPress est un champ de sélection multiple. Est-ce que cela pourrait être la raison ? S’il vous plaît, dites-moi.

Oui, le problème est qu’il s’agit d’un champ à sélection multiple. Je ne suis pas sûr que ce soit déjà pris en charge : Add support for multi-select fields in DiscourseConnect protocol.

Peut-être qu’il y a un moyen de le faire fonctionner maintenant, mais je ne vois pas comment. Le code de Discourse qui est appelé se trouve ici : discourse/app/models/discourse_connect.rb at main · discourse/discourse · GitHub

Salut @simon, peux-tu s’il te plaît écrire un exemple de code selon mon code avec la référence que tu as fournie ?

Je ne pense pas que ce soit possible. D’après ce que je peux dire, le code pour définir des champs personnalisés à partir de la charge utile SSO a été légèrement modifié depuis la publication du message auquel j’ai fait référence, mais il n’a pas été modifié d’une manière qui permette de mettre à jour les champs à sélection multiple à partir de la charge utile SSO.

Idéalement, Discourse gérerait le cas d’une manière similaire à la façon dont il gère le champ SSO add_groups : discourse/app/models/discourse_connect.rb at main · discourse/discourse · GitHub. Pour que cela fonctionne, le code SSO de Discourse devrait savoir si un champ personnalisé particulier était un champ à sélection multiple. Je ne pense pas que le code ait cette information maintenant.

Encore une fois, il pourrait y avoir un moyen de le faire maintenant, mais cela me dépasse.

Salut @simon, je veux synchroniser l’avatar de l’utilisateur entre WordPress et Discourse. Comme j’utilise déjà le plugin WP Discourse pour le SSO, je veux que lorsque l’utilisateur change son avatar sur le site Discourse, il change aussi sur le site WordPress. Comment est-ce possible ? Je veux utiliser un plugin d’avatar utilisateur sur le site WordPress et voici le code que j’utilise :

function my_wpdc_sso_client_updated_user( $updated_user, $query ) {
		$avatar_url = $query['avatar_url'];
		$user_id = $updated_user->ID;
		// cela nous permet d'utiliser les fonctions download_url() et wp_handle_sideload()
	require_once( ABSPATH . 'wp-admin/includes/file.php' );

	// télécharger dans le répertoire temporaire
	$temp_file = download_url( $avatar_url );

	if( is_wp_error( $temp_file ) ) {
		return false;
	}

	// déplacer le fichier temporaire dans le répertoire des téléchargements
	$file = array(
		'name'     => basename( $image_url ),
		'type'     => mime_content_type( $temp_file ),
		'tmp_name' => $temp_file,
		'size'     => filesize( $temp_file ),
	);
	$sideload = wp_handle_sideload(
		$file,
		array(
			'test_form'   => false // pas besoin de vérifier le paramètre 'action'
		)
	);

	if( ! empty( $sideload[ 'error' ] ) ) {
		// vous pouvez retourner un message d'erreur si vous le souhaitez
		return false;
	}

	// il est temps d'ajouter notre image téléchargée à la médiathèque WordPress
	$attachment_id = wp_insert_attachment(
		array(
			'guid'           => $sideload[ 'url' ],
			'post_mime_type' => $sideload[ 'type' ],
			'post_title'     => basename( $sideload[ 'file' ] ),
			'post_content'   => '',
			'post_status'    => 'inherit',
		),
		$sideload[ 'file' ]
	);

	if( is_wp_error( $attachment_id ) || ! $attachment_id ) {
		return false;
	}

	// mettre à jour les métadonnées, régénérer les tailles d'image
	require_once( ABSPATH . 'wp-admin/includes/image.php' );

	wp_update_attachment_metadata(
		$attachment_id,
		wp_generate_attachment_metadata( $attachment_id, $sideload[ 'file' ] )
	);

	// Retourner l'ID de la pièce jointe
	update_user_meta($user_id, '1709753088_wp_user_avatar', $attachment_id);
	update_user_meta($user_id, 'wp_user_avatar', $attachment_id);
}

Comme vous pouvez le voir, je veux mettre à jour les clés meta de l’utilisateur en utilisant l’ID de la pièce jointe, mais l’ID de la pièce jointe n’est pas créé.

J’attends votre retour.

Merci.