Discourse-Gruppe abrufen, der der Benutzer zugeordnet ist

Hallo, ich möchte herausfinden, welcher Gruppe ein Benutzer angehört. Es scheint, als müsste ich diese Informationen über get_discourse_user abrufen können, aber diese Funktion gibt anscheinend keine Gruppendaten zurück. Laut diesem Beitrag sollte das jedoch funktionieren?

Rufen Sie die WP Discourse-Funktion get_discourse_user auf? Wenn ja, sollte sie die Gruppen des Benutzers im "groups"-Array zurückgeben.

Ja, ich rufe es so auf.
$discourseUser = \WPDiscourse\Utilities\Utilities::get_discourse_user( $current_user->ID, true );
var_dump($discourseUser);

Und es gibt Folgendes zurück:

object(stdClass)#2784 (25) { ["id"]=> int(7) ["username"]=> string(4) "chad" ["name"]=> string(13) "Chad Campbell" ["avatar_template"]=> string(59) "https://avatars.discourse.org/v4/letter/c/ecccb3/{size}.png" ["active"]=> bool(true) ["admin"]=> bool(false) ["moderator"]=> bool(false) ["last_seen_at"]=> string(24) "2019-10-25T15:59:45.439Z" ["last_emailed_at"]=> string(24) "2019-10-25T15:49:07.084Z" ["created_at"]=> string(24) "2019-10-24T21:22:40.526Z" ["last_seen_age"]=> float(2659.60627934) ["last_emailed_age"]=> float(3297.96116042) ["created_at_age"]=> float(69684.5193464) ["username_lower"]=> string(4) "chad" ["trust_level"]=> int(1) ["manual_locked_trust_level"]=> NULL ["flag_level"]=> int(0) ["title"]=> NULL ["suspended"]=> bool(false) ["time_read"]=> int(0) ["staged"]=> bool(false) ["days_visited"]=> int(2) ["posts_read_count"]=> int(0) ["topics_entered"]=> int(0) ["post_count"]=> int(0) }

Der Parameter true im Funktionsaufruf bewirkt, dass die Funktion den Benutzer auf Discourse nach seiner E-Mail-Adresse sucht, wenn kein Benutzer basierend auf der WordPress-Benutzer-ID gefunden wird. Das bedeutet, dass der Benutzer sich noch nicht mit SSO bei Discourse angemeldet hat. Wenn ein Benutzer über seine E-Mail-Adresse gefunden wird, werden weniger Informationen von Discourse zurückgegeben als bei einer Suche nach der WordPress-Benutzer-ID.

Möglicherweise könnte die Funktion verbessert werden, um den Rückgabewert klarer zu gestalten. Derzeit können Sie jedoch wissen, dass der Benutzer über seine E-Mail-Adresse gefunden wurde, wenn im Antwortobjekt kein groups-Array vorhanden ist.

Alles klar. Danke für die Erklärung, Simon!

Hey Simon,

ich habe mich über SSO bei Discourse angemeldet und erhalte diesen Fehler, wenn ich den Email-Parameter auf false setze.

object(WP_Error)#2718 (2) { ["errors"]=> array(1) { ["wpdc_response_error"]=> array(1) { [0]=> string(42) "Der Discourse-Benutzer konnte nicht abgerufen werden." } } ["error_data"]=> array(0) { } }

Wenn ich ihn auf True setze, werden immer noch keine Gruppen zurückgegeben.

Ich bin etwas verwirrt, da die SSO-Konfiguration mich sowohl bei WordPress als auch bei Discourse anmeldet (und ich mich über WordPress auch von beiden abmelden kann). Alles scheint also wie erwartet zu funktionieren, aber die Gruppen werden dennoch nicht angezeigt.

Wenn Sie den zweiten Parameter des Funktionsaufrufs auf false setzen oder den Parameter weglassen (Standardwert ist false), versucht die Funktion, den Benutzer in Discourse anhand seiner WordPress-ID abzurufen. Falls der Benutzer sich mit SSO bei Discourse angemeldet hat, sollte die Funktion den Benutzer und seine Gruppen zurückgeben.

Zur Fehlerbehebung gehen Sie zur Discourse-Verwaltungsseite des Benutzers, den Sie abrufen möchten. Scrollen Sie ganz nach unten und prüfen Sie, ob ein Abschnitt „Single Sign On

Ja, ich sehe nicht, dass dieser Abschnitt für die von mir getesteten Benutzer existiert.

Es scheint wirklich, als würde ich mich über SSO anmelden.
Hier ist der Ablauf (nicht bei WordPress oder Discourse angemeldet):

Von WordPress aus klicke ich auf den Link „Mit Discourse anmelden“.
Es wird mich zur Discourse-Website weitergeleitet.
Ich melde mich mit meinen Discourse-Anmeldedaten an.
Ich werde erfolgreich zurück zur WordPress-Website weitergeleitet.
Ich bin jetzt bei beiden Seiten angemeldet.

Was fehlt mir im Prozess, damit es offiziell SSO ist?

Ich habe das Problem jetzt verstanden. Du verwendest Discourse als SSO-Anbieter für WordPress. Diese Funktion ist jedoch dafür gedacht, wenn WordPress der SSO-Anbieter für Discourse ist. Der Name der Funktion ist unglücklich gewählt. Er sollte den Anwendungszweck klar machen.

Für den Fall, dass Discourse der SSO-Anbieter für WordPress ist, musst du eine authentifizierte API-Anfrage an /admin/users/$user_id.json stellen. $user_id muss auf die Discourse-ID des Benutzers gesetzt werden. Für Benutzer, die sich über Discourse bei WordPress angemeldet haben, kannst du ihre Discourse-Benutzer-ID mit folgendem Befehl abrufen:

get_user_meta( $wp_user_id, 'discourse_sso_user_id', true );

Ah, ok. Ich werde mich gleich mal in deine API-Dokumentation einarbeiten. Danke, dass du mir auf die Sprünge geholfen hast!