Comment savoir si un utilisateur Discourse n'est pas approuvé dans Wordpress ?

Je souhaite créer automatiquement un utilisateur dans Discourse lorsqu’une nouvelle inscription a lieu sur WordPress, mais je ne veux pas leur donner accès avant qu’ils n’aient rempli un formulaire de candidature.

Je peux utiliser les paramètres « synchroniser à la connexion » et « approuver les utilisateurs » pour accomplir la majeure partie de cette tâche, mais je ne sais pas comment vérifier si un utilisateur est approuvé dans Discourse.

Existe-t-il un champ de métadonnées utilisateur dans WordPress que Discourse utilise pour stocker le statut d’approbation de l’utilisateur ? Sinon, dois-je utiliser une API pour récupérer cette information depuis Discourse ?

Mon objectif : afficher un bouton sur mon tableau de bord WordPress avec un lien dynamique qui change en fonction du statut d’approuvé ou non approuvé.

  • Utilisateur non approuvé : le lien dynamique redirige vers le formulaire de candidature sur WordPress.
  • Utilisateur approuvé : le lien dynamique redirige vers la communauté Discourse.

J’ai consulté plusieurs publications mais je n’ai pas trouvé de solution. Toute aide serait appréciée !

J’ai trouvé comment réaliser cela en écrivant une requête d’explorateur de données et en l’appelant via l’API. Cela fonctionne bien, mais je fais maintenant un appel entre deux systèmes, ce qui est évidemment plus lent que d’avoir les données enregistrées dans WordPress.

Si le chargement de la page est lent, j’utiliserais un hook pour stocker les données d’approbation dans un champ personnalisé de l’utilisateur de mon côté. Avant de procéder, il serait bon de savoir si le plugin WP-Discourse le fait déjà.

Salut @Himanshu_Singh, pour faire court, le plugin WP Discourse ne stocke pas le statut d’approbation de l’utilisateur Discourse.

Je te suggère de jeter un œil à l’action wpdc_after_sync_sso, qui est déclenchée après la synchronisation de l’enregistrement utilisateur lorsqu’un utilisateur se connecte à WordPress.

Si tu ajoutes un journal là-bas, par exemple :

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

Tu verras que l’objet discourse_user contient le statut d’approbation de l’utilisateur, par exemple :

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

Tu pourrais alors le stocker toi-même dans un champ personnalisé de l’utilisateur et l’utiliser pour créer ton lien dynamique.

Merci, Angus. Votre solution est élégante. J’ai suivi un chemin légèrement plus long :

  1. J’ai utilisé l’API Data Explorer pour obtenir le statut d’approbation
  2. Je l’ai lié au hook template_redirect pour vérifier le statut d’approbation lors de la connexion
  3. J’ai mis à jour le champ personnalisé dans WP lors de la connexion
  4. J’ai empêché l’API de s’exécuter à nouveau si l’utilisateur est approuvé.
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];
	//identifiants 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 .= '"}';

	//l'en-tête est obligatoire pour l'API 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 ) {
    // Gérer l'erreur, appeler curl_close( $ch ) et retourner.
	echo 'erreur';
	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);
    } 
  } // fermer l'instruction if pour vérifier les données stockées dans le champ personnalisé
} // fermer le if pour vérifier la bonne page 
          
?>