Como saber se um usuário do Discourse não foi aprovado no Wordpress?

Quero criar um usuário automaticamente no Discourse quando houver um novo registro no WordPress, mas não quero dar a eles acesso antes de completarem um formulário de inscrição.

Consigo usar as configurações ‘sincronizar no login’ e ‘aprovar usuários manualmente’ para realizar a maior parte disso, mas não sei como verificar se o usuário foi aprovado no Discourse.

Existe um campo de meta do usuário no WordPress que o Discourse usa para armazenar o status de aprovação do usuário no Discourse? Se não, preciso usar uma API para obter essas informações do Discourse?

Meu objetivo: quero exibir um botão no meu painel no WordPress com um link dinâmico que muda conforme o status de aprovação ou não aprovação.
Usuário não aprovado: o link dinâmico direciona para o formulário de inscrição no WordPress.
Usuário aprovado: o link dinâmico direciona para a comunidade do Discourse.

Procurei em alguns posts, mas não encontrei uma solução. Agradeceria muito a ajuda!

1 curtida

Descobri como fazer isso criando uma consulta de explorador de dados e chamando-a via API. Funciona bem, mas agora estou fazendo uma chamada entre dois sistemas, o que, obviamente, é mais lento do que ter os dados salvos no WordPress.

Se o carregamento da página estiver lento, eu usaria um hook para armazenar os dados de aprovação em um campo personalizado do usuário por conta própria. Antes de prosseguir, seria bom saber se o plugin WP-Discourse já faz isso.

Olá @Himanshu_Singh, a resposta curta é que o plugin WP Discourse não armazena o status de aprovação do usuário do Discourse.

Sugiro que você dê uma olhada na ação wpdc_after_sync_sso, que é acionada após o registro do usuário ser sincronizado quando um usuário faz login no WordPress.

Se você adicionar um log ali, por exemplo:

function wpdc_after_sync_sso_callback($discourse_user, $user_id) {
    error_log(print_r($discourse_user, true));
}
add_action( 'wpdc_after_sync_sso', 'wpdc_after_sync_sso_callback', 10, 2 );

Você verá que o objeto discourse_user contém o status de aprovação do usuário, por exemplo:

stdClass Object
(
    [id] => 43
    [username] => angus4
    [name] => angus4
    ...
    [approved] =>
)

O que você poderia então armazenar em um campo personalizado do usuário e usar para criar seu link dinâmico.

1 curtida

Obrigado, Angus. Sua solução é elegante. Eu segui um caminho um pouco mais longo -

  1. Usei a API do Data Explorer para obter o status de aprovação
  2. Vinculei ao hook template_redirect para verificar o status de aprovação no login
  3. Atualizei o campo personalizado no WP no login
  4. Impedi que a API seja executada novamente se o usuário já estiver aprovado.
add_action('template_redirect', 'update_discourse_approval_status',1);
function update_discourse_approval_status () {
  
  global $post;
  $post_slug = $post->post_name;
  if ($post_slug == 'page-slug'){
    $current_user_id = get_current_user_id();
	$approval_status_stored_in_wp = get_user_meta($current_user_id, 'custom-field', true);
    if( $approval_status_stored_in_wp != 1) {
      $user_discourse_id = (int)get_user_meta($current_user_id,'discourse_sso_user_id')[0];
	//credenciais da API,
	$api_key = 'api-key';
	$api_username = 'name';

	$discourse_user_param_string = 'params={"user_param":';
	$discourse_user_param_string .= '"';
	$discourse_user_param_string .= $user_discourse_id;
	$discourse_user_param_string .= '"}';

	//o cabeçalho é obrigatório para a API do Discourse.
	$headers = array("Content-Type: multipart/form-data;","Api-Key:$api_key","Api-Username:$api_username",);

	$url = 'https://community.showprowess.com/admin/plugins/explorer/queries/<query-number>/run';
	$ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_POST, true );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $discourse_user_param_string);
    $result = curl_exec( $ch );

	if ( curl_errno( $ch ) !== 0 ) {
    // Lidar com erro, chamar curl_close( $ch ) e retornar.
	echo 'error';
	curl_close ($ch);
	return;
	}

	curl_close( $ch );

	$decoded_result = json_decode( $result, true );

	$user_approved = $decoded_result['rows'][0][0];
	$updated = update_user_meta( $current_user_id, 'custom-field', $user_approved);
    } 
  } // fechar instrução if para verificar dados armazenados no campo personalizado
} // fechar if para verificar a página correta 
          
?>
1 curtida