Não consigo adicionar o usuário ao fórum Discourse a partir de um site WordPress quando o usuário é adicionado na inscrição

Olá, eu tenho um problema com o fórum Discourse, que é https://community.over40connect.com/, conectado ao meu site https://over40connect.com/staging/ usando o plugin WP Discourse. Criei uma função para adicionar o usuário ao grupo Discourse quando o cargo do usuário muda, mas ele não está adicionando esse usuário ao grupo Discourse. Aqui está o código:

function add_user_to_discourse_group_on_role_change($user_id, $role) {
    // Verifique se a alteração de cargo é relevante para o seu caso
    // Por exemplo, você pode querer executar isso apenas se o novo cargo for 's2member_level1'
    //if ($role === 's2member_level1') {
    // Defina o endpoint da API do Discourse
    $discourse_endpoint = 'https://community.over40connect.com/groups/2/members.json';

    // Configure os dados a serem enviados
    $data = array(
        'usernames' => array('haseebdeveloper'), // O nome de usuário do usuário do WordPress a ser adicionado
    );

    // Faça a solicitação da 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', // Adicione sua chave de API do Discourse aqui
        ),
        'body'        => json_encode($data),
        'cookies'     => array(),
    ));

    // Verifique erros e lide com a resposta
    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); // Registre a resposta
            // Lide com a resposta conforme necessário
        } else {
            error_log('Discourse API Error: Unexpected response code - ' . $response_code); // Registre o erro
            // Lide com o erro
        }
    } else {
        $error_message = $response->get_error_message();
        error_log('Discourse API Error: ' . $error_message); // Registre o erro
        // Lide com o erro
    }
    //}
}
1 curtida

Eu ocultei o que parecia ser uma chave de API real do seu trecho de código, @Haseeb_Ahmed. Você pode desejar revogar essa e gerar uma nova. :+1:

4 curtidas

Pelo que vi em seu site, acho que seu site WordPress está funcionando como o provedor de autenticação DiscourseConnect para o seu site Discourse. Se isso estiver correto, você pode usar a função auxiliar add_user_to_discourse_group para adicionar usuários do WordPress a grupos do Discourse: https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L278-L326. Detalhes sobre como usar a função estão aqui:

Observe a instrução use no topo do exemplo de código:

use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;

E como isso é então usado para chamar a função (estática):

$result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_name );
3 curtidas

Olá @simon, agora usei apenas este código

use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;

// Hook para executar quando uma função de usuário muda
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 );


}

mas ele ainda não está adicionando o usuário ao grupo do Discourse quando eu mudo a função do usuário.

Eu acho que isso deveria ser uma string separada por vírgulas, não um array:

2 curtidas

@Firepup650 está correto. O parâmetro group_names precisa ser definido como uma string. Se você estiver adicionando usuários a vários grupos, separe os nomes dos grupos com uma vírgula (sem espaço após a vírgula).

$group_names = "volunteers,moderators";

Se não estiver funcionando, ou mesmo se estiver, tente registrar o valor de $result para ver o que está sendo retornado.

3 curtidas

Olá @Firepup650, obrigado pela sua ajuda, aqui está o meu código

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// Hook para executar quando uma função de usuário muda
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 );

    
}

ele está adicionando o usuário ao grupo de voluntários, mas não ao de moderadores, você pode me dizer qual é o problema?

1 curtida

Você não pode adicionar usuários aos grupos “moderadores”, “admin” ou “staff” com esta chamada de função. Tecnicamente, você não pode adicionar usuários a nenhum grupo “automático” com essa abordagem. Você só pode adicionar usuários a grupos personalizados que você criou.

Editar: se você precisar adicionar usuários ao grupo de moderadores, dê uma olhada na função sync_sso_record: https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L70-L81. A função add_user_to_discourse_group é apenas um invólucro de conveniência em torno de sync_sso_record.

moderator (boolean) é um argumento aceito para os parâmetros SSO: discourse/lib/discourse_connect_base.rb at 5098338a9649ee8830c8a0781e0eb538e8206eac · discourse/discourse · GitHub. Você também pode adicionar quaisquer grupos personalizados aos quais deseja adicionar usuários usando o parâmetro add_groups. Isso permitiria que você adicionasse um usuário ao grupo “moderadores” e ao grupo “Volunteer Members” com uma única chamada de API.

Editar 2: Se você tentar a abordagem da função sync_sso_record, pode ser necessário usar a string "true" em vez do booleano true para o parâmetro moderator. O PHP interpreta true como 1. Acho que o Discourse aceita a string "true" para lidar com esse caso. Observe que você pode usar a função get_sso_params para definir os parâmetros SSO: https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L129. Há um exemplo de como fazer isso no código da função add_user_to_discourse_group.

3 curtidas

Olá @simon, você pode me dar um exemplo com código de como você está dizendo para adicionar um usuário ao grupo de moderadores?

Aqui está a ideia básica. Estou assumindo que você precisará adicionar alguma condição à função para que todos os usuários não sejam adicionados ao grupo de moderadores quando sua função for alterada.

function add_user_to_discourse_group_on_role_change( $user_id, $role ) {
	$sso_params = array(
		'external_id' => $user_id,
		'moderator'   => 'true', // os booleanos 'true' e 'false' precisam ser definidos como strings!
		'add_groups'  => 'volunteers' // lista separada por vírgulas, sem espaços após as vírgulas
	);
    DiscourseUtilities::sync_sso_record( $sso_params );
}
1 curtida

Olá @simon, estou enfrentando um problema aqui está meu código que estou usando quando o cargo do usuário muda

use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;

// Hook para executar quando um cargo de usuário muda
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', '');
// 		  	$group_names = array("haseeb-group", "moderators");
// 			$s2member_level_1_groups = implode(",", $group_names);
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);
// 		  var_dump($result);
// 		  die();
		  	
// 			var_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 {
    // Coleta todos os grupos de nível
    $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', '');

    // Combina todos os grupos em um único 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 duplicatas
    $s2member_level_groups = array_unique($s2member_level_groups);

    // Remove o usuário de todos os grupos coletados
    foreach ($s2member_level_groups as $group) {
        $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
        // Você pode lidar com $result conforme necessário
    }
}


    
}

agora o propósito do código é adicionar ou remover o usuário com base na condição, mas em qualquer caso ou em qualquer condição, ele envia uma notificação aos administradores do fórum de que é necessário aprovar ou rejeitar ou excluir o usuário. Por que isso está acontecendo em qualquer caso, como no caso else, eu só quero remover o usuário de um grupo específico, mas nesse caso, ele novamente envia uma notificação de revisão de novo usuário para o administrador

mais uma coisa é que quando o usuário se registra no site do WordPress, ele é adicionado automaticamente a esses grupos trust_level_0 e trust_level_1, não sei por quê

por favor ajude e eu também posso compartilhar o hook de registro de usuário com você

Isso acontece porque esses são grupos principais do Discourse, usados para gerenciar permissões e afins.

Isso acontece porque você tem a configuração ativada para exigir que todos os novos usuários sejam aprovados pela equipe, como sua captura de tela menciona:

image

Parece que você está adicionando novos usuários, o que requer aprovação, como mencionei acima.

1 curtida

Para complementar o que @Firepup650 escreveu, quando seu código chama

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

ele está chamando uma função auxiliar que faz uma solicitação à rota sync_sso do Discourse: Sync DiscourseConnect user data with the sync_sso route. Essa solicitação é usada para atualizar um usuário existente ou para criar novos usuários. Se o usuário com $user_id nunca fez login no seu site Discourse, um novo usuário será criado. Ele ainda deverá ser adicionado aos grupos sem nenhum problema, mas isso gerará uma notificação para os moderadores porque seu site habilitou a configuração do site must approve users (deve aprovar usuários):

1 curtida

Olá @simon, estou enfrentando um problema novamente.

Quero sincronizar os dados do usuário quando ele se registra no site e também adicioná-lo ao Discourse, mas as informações dos campos personalizados não estão sendo sincronizadas no perfil dele no Discourse. Aqui está meu código para você verificar.

add_action( 'user_register', 'user_registered_callback', 10, 1 ); // Ajustado para aceitar apenas um argumento

function user_registered_callback($user_id) {
    // Obter dados do usuário com base no ID do usuário
    $user_data = get_userdata($user_id);

    // Verificar se os dados do usuário existem
    if ($user_data) {
        // Obter as funções do usuário
        $roles = $user_data->roles;

        // Verificar se o usuário tem a função 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);

            // Obter campos personalizados
            $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user_id);
            // Preparar array de parâmetros 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 {
            // Coletar todos os grupos de nível
            $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', '');

            // Combinar todos os grupos em um único 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)
            );

            // Remover duplicatas
            $s2member_level_groups = array_unique($s2member_level_groups);

            // Remover usuário de todos os grupos coletados
            foreach ($s2member_level_groups as $group) {
                $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
                // Você pode lidar com $result conforme necessário
            }
        }
    } else {
        // Lidar com casos em que os dados do usuário não estão disponíveis
        // Registrar uma mensagem ou lidar de forma diferente com base em seus requisitos
        error_log("User data not available in user_registered_callback.");
    }
}

Agora você pode verificar este código.

  $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']
            ];

Quando eu uso var_dump($fields_updated);, ele retorna true, mas os dados não estão sendo adicionados ao perfil do usuário no Discourse. Qual é o problema?

A menos que algo tenha mudado, você precisa usar a abordagem descrita aqui: Map custom User Fields - #7 by simon.

Primeiro, certifique-se de que os campos personalizados já existem no Discourse. Em seguida, na página /admin/customize/user_fields do seu site Discourse, adicione .json à URL para que você possa ver o JSON do campo de usuário. Por exemplo: http://localhost:4200/admin/customize/user_fields.json.

Use os valores de id do JSON para definir chaves SSO que se pareçam com isto: custom.user_field_<field_id>. Por exemplo: custom.user_field_1

Não posso testar isso agora. Me diga se isso funciona. Se ainda não foi feito, deve ser documentado em seu próprio tópico.

Olá @simon, usei sua abordagem que você mencionou e aqui está meu código agora

add_action( 'user_register', 'user_registered_callback', 10, 1 ); // Ajustado para aceitar apenas um argumento

function user_registered_callback($user_id) {
    // Obter dados do usuário com base no ID do usuário
    $user_data = get_userdata($user_id);
// 	$user = get_user_by( 'ID', $user_id );
    // Verificar se os dados do usuário existem
    if ($user_data) {
        // Obter as funções do usuário
        $roles = $user_data->roles;

        // Verificar se o usuário tem a função 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();
//             // Obter campos personalizados
//             $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user_id);
//             // Preparar array de parâmetros 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 {
            // Coletar todos os grupos de nível
            $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', '');

            // Combinar todos os grupos em um único 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)
            );

            // Remover duplicatas
            $s2member_level_groups = array_unique($s2member_level_groups);

            // Remover usuário de todos os grupos coletados
            foreach ($s2member_level_groups as $group) {
                $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
                // Você pode lidar com $result conforme necessário
            }
        }
    } else {
        // Lidar com casos em que os dados do usuário não estão disponíveis
        // Registrar uma mensagem ou lidar de forma diferente com base em seus requisitos
        error_log("User data not available in 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);
	
    // Verificar se $custom_fields é um array e não está vazio
    if (is_array($custom_fields) && !empty($custom_fields)) {
        // Atribuir campos personalizados às chaves respectivas nos parâmetros 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 {
        // Registrar ou exibir uma mensagem de erro se $custom_fields não estiver no formato esperado
        error_log('Custom fields data is not in the expected format.');
    }

    // Retornar parâmetros SSO modificados
    return $sso_params;
}

agora o único problema é que ele não está adicionando users_reasons ao custom.user_field_5 e está adicionando outros dados ao perfil do usuário, por exemplo, se eu comentar esta linha $sso_params['custom.user_field_5'] = $custom_fields['users_reasons'];, então ele está adicionando dados de outros campos ao usuário do Discourse e se eu não comentar esta linha, nenhum dado está sendo adicionado ao perfil do usuário no Discourse agora preciso dizer que o campo users_reasons tanto no site do Discourse quanto no site do WordPress é um campo de múltipla seleção, então isso pode ser o motivo? por favor me diga

Sim, o problema é que é um campo de múltipla seleção. Não tenho certeza se isso é suportado ainda: Add support for multi-select fields in DiscourseConnect protocol.

Talvez haja uma maneira de fazer funcionar agora, mas não estou vendo como. O código do Discourse que é chamado está aqui: discourse/app/models/discourse_connect.rb at main · discourse/discourse · GitHub

Olá @simon, você pode por favor escrever um exemplo de código de acordo com meu código com a sua referência que você forneceu?

Eu não acho que seja possível. Pelo que pude apurar, o código para definir campos personalizados a partir da carga útil do SSO foi ligeiramente alterado desde a época em que a postagem que linkei foi escrita, mas não foi alterado de forma a permitir que campos de seleção múltipla sejam atualizados a partir da carga útil do SSO.

Idealmente, o Discourse lidaria com o caso de maneira semelhante a como lida com o campo SSO add_groups: discourse/app/models/discourse_connect.rb at main · discourse/discourse · GitHub. Para que isso funcione, o código SSO do Discourse precisaria saber se um determinado campo personalizado era um campo de seleção múltipla. Acho que o código não tem essa informação agora.

Novamente, pode haver uma maneira de fazer isso agora, mas está além de mim.

Olá @simon, quero sincronizar o avatar do usuário entre o WordPress e o Discourse. Como já estou usando o plugin WP Discourse para SSO, agora quero que, quando um usuário alterar o avatar no site do Discourse, ele também seja alterado no site do WordPress. Como isso pode ser possível? E quero usar um plugin de avatar de usuário no site do WordPress. Aqui está o código que estou usando:

function my_wpdc_sso_client_updated_user( $updated_user, $query ) {
		$avatar_url = $query['avatar_url'];
		$user_id = $updated_user->ID;
		// isso nos permite usar as funções download_url() e wp_handle_sideload()
	require_once( ABSPATH . 'wp-admin/includes/file.php' );

	// baixar para o diretório temporário
	$temp_file = download_url( $avatar_url );

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

	// mover o arquivo temporário para o diretório de uploads
	$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 // não há necessidade de verificar o parâmetro 'action'
		)
	);

	if( ! empty( $sideload[ 'error' ] ) ) {
		// você pode retornar uma mensagem de erro se quiser
		return false;
	}

	// é hora de adicionar nossa imagem carregada à biblioteca de mídia do 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;
	}

	// atualizar metadados, regenerar tamanhos de imagem
	require_once( ABSPATH . 'wp-admin/includes/image.php' );

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

	// Retornar o ID do anexo
	update_user_meta($user_id, '1709753088_wp_user_avatar', $attachment_id);
	update_user_meta($user_id, 'wp_user_avatar', $attachment_id);
}

Como você pode ver, quero atualizar as chaves de metadados do usuário usando o ID do anexo, mas o ID do anexo não está sendo criado.

Aguardo seu retorno.

Obrigado.