Come sapere se un utente Discourse non è approvato in Wordpress?

Voglio creare automaticamente un utente in Discourse quando avviene una nuova registrazione su WordPress, ma non voglio concedere loro l’accesso prima che completino un modulo di candidatura.

Riesco a utilizzare le impostazioni “sincronizza all’accesso” e “è necessario approvare gli utenti” per ottenere gran parte di questo, ma non so come verificare se l’utente è stato approvato in Discourse.

Esiste un campo di metadati dell’utente in WP che Discourse utilizza per memorizzare lo stato di approvazione dell’utente? Se no, devo utilizzare un’API per ottenere le informazioni da Discourse?

Il mio obiettivo è mostrare un pulsante sulla mia dashboard in WP con un link dinamico che cambia in base allo stato di approvazione o meno.
Utente non approvato: il link dinamico reindirizza al modulo di candidatura su WP.
Utente approvato: il link dinamico reindirizza alla community di Discourse.

Ho consultato alcuni post ma non sono riuscito a trovare una soluzione. Apprezzo molto l’aiuto!

1 Mi Piace

Ho capito come realizzare questo scrivendo una query per l’esploratore dei dati e chiamandola tramite API. Funziona bene, ma ora sto effettuando una chiamata tra due sistemi, il che è ovviamente più lento rispetto ad avere i dati salvati in WP.

Se il caricamento della pagina è lento, utilizzerei un hook per memorizzare i dati di approvazione in un campo personalizzato dell’utente. Prima di procedere, sarebbe utile sapere se il plugin WP-Discourse lo fa già.

Ehi @Himanshu_Singh, la risposta breve è che il plugin WP Discourse non memorizza lo stato di approvazione dell’utente Discourse.

Ti suggerisco di dare un’occhiata all’azione wpdc_after_sync_sso, che viene attivata dopo che il record dell’utente è stato sincronizzato al momento dell’accesso a WordPress.

Se aggiungi un log lì, ad esempio:

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

Vedrai che l’oggetto discourse_user contiene lo stato di approvazione dell’utente, ad esempio:

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

Che potrai quindi memorizzare tu stesso in un campo personalizzato dell’utente e utilizzare per creare il tuo link dinamico.

1 Mi Piace

Grazie, Angus. La tua soluzione è elegante. Io ho seguito un percorso leggermente più lungo:

  1. Ho utilizzato l’API Data Explorer per ottenere lo stato di approvazione
  2. L’ho collegato all’hook template_redirect per verificare lo stato di approvazione al momento dell’accesso
  3. Aggiornato il campo personalizzato in WP all’accesso
  4. Impedito all’API di essere eseguita nuovamente se l’utente è già approvato.
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];
	//credenziali 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'intestazione è obbligatoria per l'API di 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 ) {
    // Gestisci l'errore, chiama curl_close( $ch ) e restituisci.
	echo 'errore';
	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);
    } 
  } // chiude l'istruzione if per verificare i dati memorizzati nel campo personalizzato
} // chiude l'if per verificare la pagina corretta
          
?>
1 Mi Piace