Wie man feststellt, ob ein Discourse-Benutzer in Wordpress nicht genehmigt ist?

Ich möchte in Discourse automatisch einen Benutzer anlegen, wenn in WordPress eine neue Registrierung stattfindet, aber ich möchte ihnen keinen Zugriff gewähren, bevor sie ein Bewerbungsformular ausgefüllt haben.

Ich kann die Einstellungen „Beim Anmelden synchronisieren

1 „Gefällt mir“

Ich habe herausgefunden, wie man das umsetzt, indem ich eine Data-Explorer-Abfrage schreibe und sie über die API aufrufe. Das funktioniert einwandfrei, aber jetzt führe ich einen Aufruf zwischen zwei Systemen durch, was natürlich langsamer ist, als wenn die Daten in WP gespeichert wären.

Wenn die Seitenladung langsam ist, würde ich einen Hook verwenden, um die Genehmigungsdaten selbst in einem benutzerdefinierten Feld des Benutzers zu speichern. Bevor ich weitermache, wäre es gut zu wissen, ob das WP-Discourse-Plugin das bereits macht.

Hey @Himanshu_Singh, die kurze Antwort lautet, dass das WP Discourse-Plugin den Genehmigungsstatus des Discourse-Benutzers nicht speichert.

Ich empfehle dir, dir die Aktion wpdc_after_sync_sso anzusehen, die ausgelöst wird, nachdem der Benutzereintrag nach einer Anmeldung bei WordPress synchronisiert wurde.

Wenn du dort ein Log einfügst, z.

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

wirst du sehen, dass das discourse_user-Objekt den Genehmigungsstatus des Benutzers enthält, z.

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

Diesen kannst du dann selbst in einem benutzerdefinierten Benutzerfeld speichern und zur Erstellung deines dynamischen Links verwenden.

1 „Gefällt mir“

Danke, Angus. Deine Lösung ist elegant. Ich habe einen etwas längeren Weg gewählt:

  1. Ich habe die Data Explorer-API verwendet, um den Genehmigungsstatus abzurufen.
  2. Ich habe sie mit dem Hook template_redirect verknüpft, um den Genehmigungsstatus beim Login zu prüfen.
  3. Ich habe das benutzerdefinierte Feld in WP beim Login aktualisiert.
  4. Ich habe verhindert, dass die API erneut ausgeführt wird, wenn der Benutzer bereits genehmigt ist.
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];
	// API-Anmeldedaten,
	$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 .= '"}';

	// Header sind für die Discourse-API zwingend erforderlich.
	$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 ) {
    // Fehler behandeln, curl_close( $ch ) aufrufen und zurückkehren.
	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);
    } 
  } // Ende der if-Anweisung zur Prüfung der im benutzerdefinierten Feld gespeicherten Daten
} // Ende des if-Blocks zur Prüfung der richtigen Seite
          
?>
1 „Gefällt mir“