Ich kann keinen Benutzer zum Discourse-Forum hinzufügen, wenn der Benutzer in einer Membership auf WordPress hinzugefügt wurde.

Hallo, ich habe ein Problem mit dem Discourse-Forum unter https://community.over40connect.com/, das mit meiner Website https://over40connect.com/staging/ über das WP Discourse-Plugin verbunden ist. Ich habe eine Funktion erstellt, um Benutzer zur Discourse-Gruppe hinzuzufügen, wenn sich die Benutzerrolle ändert, aber der Benutzer wird nicht zur Discourse-Gruppe hinzugefügt. Hier ist der Code

function add_user_to_discourse_group_on_role_change($user_id, $role) {
    // Prüfen Sie, ob die Rollenänderung für Ihren Fall relevant ist
    // Zum Beispiel möchten Sie dies möglicherweise nur ausführen, wenn die neue Rolle 's2member_level1' ist
    //if ($role === 's2member_level1') {
    // Endpunkt der Discourse-API festlegen
    $discourse_endpoint = 'https://community.over40connect.com/groups/2/members.json';

    // Daten für den Versand einrichten
    $data = array(
        'usernames' => array('haseebdeveloper'), // Der Benutzername des hinzuzufügenden WordPress-Benutzers
    );

    // API-Anfrage stellen
    $response = wp_remote_post($discourse_endpoint, array(
        'method' => 'POST',
        'timeout' => 45,
        'redirection' => 5,
        'httpversion' => '1.0',
        'blocking' => true,
        'headers' => array(
            'Content-Type' => 'application/json',
            'Api-Key' => 'REDACTED', // Fügen Sie hier Ihren Discourse-API-Schlüssel ein
        ),
        'body' => json_encode($data),
        'cookies' => array(),
    ));

    // Auf Fehler prüfen und auf die Antwort reagieren
    if (!is_wp_error($response)) {
        $response_code = wp_remote_retrieve_response_code($response);

        if ($response_code === 200) {
            $response_body = wp_remote_retrieve_body($response);
            error_log('Discourse API Response: ' . $response_body); // Antwort protokollieren
            // Auf die Antwort reagieren, wie benötigt
        } else {
            error_log('Discourse API Error: Unexpected response code - ' . $response_code); // Fehler protokollieren
            // Auf den Fehler reagieren
        }
    } else {
        $error_message = $response->get_error_message();
        error_log('Discourse API Error: ' . $error_message); // Fehler protokollieren
        // Auf den Fehler reagieren
    }
    //}
}
1 „Gefällt mir“

Ich habe den Codeausschnitt von @Haseeb_Ahmed, der wie ein tatsächlicher API-Schlüssel aussah, geschwärzt. Sie möchten diesen möglicherweise widerrufen und einen neuen generieren. :+1:

4 „Gefällt mir“

Wenn ich Ihre Website besuche, glaube ich, dass Ihre WordPress-Website als DiscourseConnect-Authentifizierungsanbieter für Ihre Discourse-Website fungiert. Wenn das korrekt ist, können Sie die Hilfsfunktion add_user_to_discourse_group verwenden, um WordPress-Benutzer zu Discourse-Gruppen hinzuzufügen: https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L278-L326. Details zur Verwendung der Funktion finden Sie hier:

Beachten Sie die use-Anweisung am Anfang des Codebeispiels:

use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;

Und wie dies dann verwendet wird, um die (statische) Funktion aufzurufen:

$result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_name );
3 „Gefällt mir“

Hallo @simon, ich habe jetzt nur diesen Code verwendet

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// Hook to execute when a user role changes
add_action('set_user_role', 'add_user_to_discourse_group_on_role_change', 10, 2);

function add_user_to_discourse_group_on_role_change($user_id, $role) {

   $group_names = array("volunteers", "moderators");
   $result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_names );

}

aber es fügt den Benutzer immer noch nicht zur Discourse-Gruppe hinzu, wenn ich die Benutzerrolle ändere.

Ich glaube, das sollte ein durch Kommas getrennter String und kein Array sein:

2 „Gefällt mir“

@Firepup650 hat Recht. Der Parameter group_names muss auf einen String gesetzt werden. Wenn Sie Benutzer zu mehreren Gruppen hinzufügen, trennen Sie die Gruppennamen durch ein Komma (ohne Leerzeichen nach dem Komma).

$group_names = "volunteers,moderators";

Wenn es nicht funktioniert oder auch wenn es funktioniert, versuchen Sie, den Wert von $result zu protokollieren, um zu sehen, was zurückgegeben wird.

3 „Gefällt mir“

Hallo @Firepup650, danke für deine Hilfe, hier ist mein Code

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// Hook, um auszuführen, wenn sich eine Benutzerrolle ändert
add_action('set_user_role', 'add_user_to_discourse_group_on_role_change', 10, 2);

function add_user_to_discourse_group_on_role_change($user_id, $role) {

   $group_names = array("volunteers", "moderators");
	$group_names_string = implode(",", $group_names);

   $result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_names_string );

}

Es fügt den Benutzer zur Gruppe „volunteers“ hinzu, aber nicht zur Gruppe „moderators“. Können Sie mir bitte sagen, was das Problem ist?

1 „Gefällt mir“

Sie können Benutzer mit diesem Funktionsaufruf nicht zu den Gruppen „Moderator“, „Administrator“ oder „Mitarbeiter“ hinzufügen. Technisch gesehen können Sie Benutzer mit diesem Ansatz keinen „automatischen“ Gruppen hinzufügen. Sie können nur Benutzer zu benutzerdefinierten Gruppen hinzufügen, die Sie selbst erstellt haben.

Bearbeiten: Wenn Sie Benutzer zur Gruppe der Moderatoren hinzufügen müssen, sehen Sie sich die Funktion sync_sso_record an: https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L70-L81. Die Funktion add_user_to_discourse_group ist nur ein praktischer Wrapper um sync_sso_record.

moderator (boolean) ist ein akzeptiertes Argument für die SSO-Parameter: discourse/lib/discourse_connect_base.rb at 5098338a9649ee8830c8a0781e0eb538e8206eac · discourse/discourse · GitHub. Sie können auch benutzerdefinierte Gruppen, zu denen Sie Benutzer hinzufügen möchten, über den Parameter add_groups hinzufügen. Dies würde es Ihnen ermöglichen, einen Benutzer mit einem einzigen API-Aufruf zur Gruppe „Moderator“ und zur Gruppe „Freiwillige Mitglieder“ hinzuzufügen.

Bearbeiten 2: Wenn Sie den Ansatz mit der Funktion sync_sso_record ausprobieren, müssen Sie möglicherweise den String \"true\" anstelle des Boole’schen Werts true für den Parameter moderator verwenden. PHP interpretiert true als 1. Ich glaube, Discourse akzeptiert den String \"true\", um diesen Fall zu behandeln. Beachten Sie, dass Sie die Funktion get_sso_params verwenden können, um die SSO-Parameter festzulegen: https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L129. Ein Beispiel dafür finden Sie im Code der Funktion add_user_to_discourse_group.

3 „Gefällt mir“

Hallo @simon, können Sie mir bitte ein Beispiel mit Code geben, wie Sie sagen, dass ein Benutzer zur Moderatorengruppe hinzugefügt werden soll?

Hier ist die Grundidee. Ich gehe davon aus, dass Sie der Funktion eine Bedingung hinzufügen müssen, damit nicht alle Benutzer der Moderatorengruppe hinzugefügt werden, wenn sich ihre Rolle ändert.

function add_user_to_discourse_group_on_role_change( $user_id, $role ) {
	$sso_params = array(
		'external_id' => $user_id,
		'moderator'   => 'true', // die booleschen Werte 'true' und 'false' müssen als Strings gesetzt werden!
		'add_groups'  => 'volunteers' // durch Kommas getrennte Liste, ohne Leerzeichen nach den Kommas
	);
    DiscourseUtilities::sync_sso_record( $sso_params );
}
1 „Gefällt mir“

Hallo @simon, ich habe hier ein Problem mit meinem Code, den ich verwende, wenn sich die Benutzerrolle ändert.

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// Hook, der ausgeführt wird, wenn sich eine Benutzerrolle ändert
add_action('set_user_role', 'add_user_to_discourse_group_on_role_change', 10, 2);

function add_user_to_discourse_group_on_role_change($user_id, $role) {
// 	var_dump($role);
// 	die();
	  if ($role == 's2member_level1') {
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
// 	  	$group_names = array("haseeb-group", "moderators");
// 			$s2member_level_1_groups = implode(",", $group_names);
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);
// 	  	var_dump($result);
// 	  	die();
		  	
// 			var_dump($result);
        }
		else if($role == 's2member_level2'){
			   $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
			  $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);
		}
		
		else if($role == 's2member_level3'){
			   $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
			  $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_3_groups);
		}
	
		
		else if($role == 's2member_level4'){
			   $s2member_level_4_groups = get_option('s2member_level_4_groups', '');
			  $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_4_groups);
		}
		
		else {
    // Sammle alle Level-Gruppen
    $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
    $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
    $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
    $s2member_level_4_groups = get_option('s2member_level_4_groups', '');

    // Kombiniere alle Gruppen zu einem Array
    $s2member_level_groups = array_merge(
        explode(',', $s2member_level_1_groups),
        explode(',', $s2member_level_2_groups),
        explode(',', $s2member_level_3_groups),
        explode(',', $s2member_level_4_groups)
    );

    // Entferne Duplikate
    $s2member_level_groups = array_unique($s2member_level_groups);

    // Entferne den Benutzer aus allen gesammelten Gruppen
    foreach ($s2member_level_groups as $group) {
        $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
        // Du kannst $result nach Bedarf behandeln
    }
}


    
}

Der Zweck des Codes ist es, Benutzer basierend auf Bedingungen hinzuzufügen oder zu entfernen. In jedem Fall oder unter jeder Bedingung wird jedoch eine Benachrichtigung an die Administratoren des Forums gesendet, dass der Benutzer genehmigt, abgelehnt oder gelöscht werden muss. Warum passiert das in jedem Fall? Im else-Fall möchte ich den Benutzer nur aus einer bestimmten Gruppe entfernen, aber in diesem Fall wird dem Administrator immer noch eine Benachrichtigung zur Überprüfung neuer Benutzer angezeigt.

Eine weitere Sache ist, dass Benutzer, wenn sie sich auf der WordPress-Website registrieren, automatisch zu diesen Gruppen trust_level_0 und trust_level_1 hinzugefügt werden, warum weiß ich nicht.

Bitte helfen Sie mir, ich kann Ihnen auch den Benutzerregistrierungs-Hook mitteilen.

Das liegt daran, dass dies Kerndiskursgruppen sind, die zur Verwaltung von Berechtigungen und Ähnlichem verwendet werden.

Das liegt daran, dass Sie die Einstellung aktiviert haben, dass alle neuen Benutzer von den Mitarbeitern genehmigt werden müssen, wie Ihr Screenshot erwähnt:

image

Es scheint, dass Sie neue Benutzer hinzufügen, was eine Genehmigung erfordert, wie ich oben erwähnt habe.

1 „Gefällt mir“

Um das, was @Firepup650 geschrieben hat, zu ergänzen: Wenn Ihr Code aufruft

DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);

ruft er eine Hilfsfunktion auf, die eine Anfrage an die Discourse sync_sso-Route sendet: Sync DiscourseConnect user data with the sync_sso route. Diese Anfrage wird verwendet, um entweder einen bestehenden Benutzer zu aktualisieren oder neue Benutzer zu erstellen. Wenn der Benutzer mit $user_id noch nie auf Ihrer Discourse-Site angemeldet war, wird ein neuer Benutzer erstellt. Er sollte trotzdem ohne Probleme zu den Gruppen hinzugefügt werden, aber dies generiert eine Benachrichtigung für Moderatoren, da Ihre Website die Website-Einstellung Benutzer müssen genehmigt werden aktiviert hat:

1 „Gefällt mir“

Hallo @simon, ich habe wieder ein Problem.

Ich möchte Benutzerdaten synchronisieren, wenn sich ein Benutzer auf der Website registriert und auch in Discourse hinzugefügt wird, aber die Informationen zu benutzerdefinierten Feldern in seinem Profil auf Discourse werden nicht synchronisiert. Hier ist mein Code, den Sie überprüfen können.

add_action( 'user_register', 'user_registered_callback', 10, 1 ); // Angepasst, um nur ein Argument zu akzeptieren

function user_registered_callback($user_id) {
    // Benutzerdaten basierend auf der Benutzer-ID abrufen
    $user_data = get_userdata($user_id);

    // Überprüfen, ob Benutzerdaten vorhanden sind
    if ($user_data) {
        // Die Benutzerrollen abrufen
        $roles = $user_data->roles;

        // Überprüfen, ob der Benutzer die s2Member-Rolle hat
        if (in_array('s2member_level1', $roles)) {
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);

            // Benutzerdefinierte Felder abrufen
            $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user_id);
            // SSO-Parameter-Array vorbereiten
            $sso_params_array = [];
            $sso_params_array = [
				'external_id' => $user_id,
                'custom.user_interests' => $custom_fields['user_interests'],
                'custom.user_age' => $custom_fields['user_age'],
                'custom.user_gender' => $custom_fields['user_gender'],
                'custom.user_sexual' => $custom_fields['user_sexual'],
                'custom.user_facebook' => $custom_fields['user_facebook'],
                'custom.user_linkedin' => $custom_fields['user_linkedin'],
                'custom.users_reasons' => $custom_fields['users_reasons']
            ];

            $fields_updated = DiscourseUtilities::sync_sso_record($sso_params_array, $user_id);
			var_dump($fields_updated);
			die();
        } elseif (in_array('s2member_level2', $roles)) {
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);
        } elseif (in_array('s2member_level3', $roles)) {
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_3_groups);
        } elseif (in_array('s2member_level4', $roles)) {
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_4_groups);
        } else {
            // Alle Level-Gruppen sammeln
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');

            // Alle Gruppen zu einem Array zusammenführen
            $s2member_level_groups = array_merge(
                explode(',', $s2member_level_1_groups),
                explode(',', $s2member_level_2_groups),
                explode(',', $s2member_level_3_groups),
                explode(',', $s2member_level_4_groups)
            );

            // Duplikate entfernen
            $s2member_level_groups = array_unique($s2member_level_groups);

            // Benutzer aus allen gesammelten Gruppen entfernen
            foreach ($s2member_level_groups as $group) {
                $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
                // Sie können $result nach Bedarf behandeln
            }
        }
    } else {
        // Fälle behandeln, in denen Benutzerdaten nicht verfügbar sind
        // Eine Nachricht protokollieren oder je nach Ihren Anforderungen anders behandeln
        error_log("Benutzerdaten in user_registered_callback nicht verfügbar.");
    }
}

Jetzt können Sie diesen Code überprüfen.

  $sso_params_array = [
				'external_id' => $user_id,
                'custom.user_interests' => $custom_fields['user_interests'],
                'custom.user_age' => $custom_fields['user_age'],
                'custom.user_gender' => $custom_fields['user_gender'],
                'custom.user_sexual' => $custom_fields['user_sexual'],
                'custom.user_facebook' => $custom_fields['user_facebook'],
                'custom.user_linkedin' => $custom_fields['user_linkedin'],
                'custom.users_reasons' => $custom_fields['users_reasons']
            ];

Wenn ich var_dump($fields_updated); aufrufe, gibt es true zurück, aber es werden keine Daten in das Benutzerprofil auf Discourse eingetragen. Was ist das Problem?

Sofern sich nichts geändert hat, müssen Sie den hier beschriebenen Ansatz verwenden: Map custom User Fields - #7 by simon.

Stellen Sie zunächst sicher, dass die benutzerdefinierten Felder bereits in Discourse vorhanden sind. Fügen Sie dann auf der Seite /admin/customize/user_fields Ihrer Discourse-Site .json zur URL hinzu, damit Sie die JSON-Daten des Benutzerfelds sehen können. Zum Beispiel http://localhost:4200/admin/customize/user_fields.json.

Verwenden Sie die id-Werte aus den JSON-Daten, um SSO-Schlüssel festzulegen, die wie folgt aussehen: custom.user_field_<field_id>. Zum Beispiel custom.user_field_1

Ich kann dies im Moment nicht testen. Lassen Sie mich wissen, ob dies funktioniert. Wenn dies noch nicht geschehen ist, sollte es in einem eigenen Thema dokumentiert werden.

Hallo @simon, ich habe deinen Ansatz verwendet, den du erwähnt hast, und hier ist jetzt mein Code

add_action( 'user_register', 'user_registered_callback', 10, 1 ); // Angepasst, um nur ein Argument zu akzeptieren

function user_registered_callback($user_id) {
    // Benutzerdaten basierend auf der Benutzer-ID abrufen
    $user_data = get_userdata($user_id);
// 	$user = get_user_by( 'ID', $user_id );
    // Prüfen, ob Benutzerdaten vorhanden sind
    if ($user_data) {
        // Benutzerrollen abrufen
        $roles = $user_data->roles;

        // Prüfen, ob der Benutzer die s2Member-Rolle hat
        if (in_array('s2member_level1', $roles)) {
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);
			 $sso_params = array();
//             // Benutzerdefinierte Felder abrufen
//             $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user_id);
//             // SSO-Parameter-Array vorbereiten
//             $sso_params_array = [];
//             $sso_params_array = [
// 				'external_id' => $user_id,
//                 'custom.user_field_1' => $custom_fields['user_interests'],
//                 'custom.user_field_2' => $custom_fields['user_age'],
//                 'custom.user_field_3' => $custom_fields['user_gender'],
//                 'custom.user_field_4' => $custom_fields['user_sexual'],
//                 'custom.user_field_5' => $custom_fields['users_reasons']
//             ];

//             $fields_updated = DiscourseUtilities::sync_sso_record($sso_params_array);
			 $sso_params = apply_filters( 'wpdc_sso_params', $sso_params, $user_data );
			var_dump($sso_params);
			die();
        } elseif (in_array('s2member_level2', $roles)) {
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);
        } elseif (in_array('s2member_level3', $roles)) {
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_3_groups);
        } elseif (in_array('s2member_level4', $roles)) {
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_4_groups);
        } else {
            // Alle Level-Gruppen sammeln
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');

            // Alle Gruppen zu einem Array zusammenführen
            $s2member_level_groups = array_merge(
                explode(',', $s2member_level_1_groups),
                explode(',', $s2member_level_2_groups),
                explode(',', $s2member_level_3_groups),
                explode(',', $s2member_level_4_groups)
            );

            // Duplikate entfernen
            $s2member_level_groups = array_unique($s2member_level_groups);

            // Benutzer aus allen gesammelten Gruppen entfernen
            foreach ($s2member_level_groups as $group) {
                $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
                // Sie können $result nach Bedarf behandeln
            }
        }
    } else {
        // Fälle behandeln, in denen Benutzerdaten nicht verfügbar sind
        // Eine Nachricht protokollieren oder je nach Ihren Anforderungen anders behandeln
        error_log("Benutzerdaten in user_registered_callback nicht verfügbar.");
    }
}




add_filter( 'wpdc_sso_params', 'my_namespace_set_discourse_custom_field', 10, 2 );

function my_namespace_set_discourse_custom_field( $sso_params, $user ) {
    $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user->ID);
	
    // Prüfen, ob $custom_fields ein Array ist und nicht leer
    if (is_array($custom_fields) && !empty($custom_fields)) {
        // Benutzerdefinierte Felder den jeweiligen Schlüsseln in den SSO-Parametern zuweisen
        $sso_params['custom.user_field_1'] = $custom_fields['user_interests'];
        $sso_params['custom.user_field_2'] = $custom_fields['user_age'];
        $sso_params['custom.user_field_3'] = $custom_fields['user_gender'];
        $sso_params['custom.user_field_4'] = $custom_fields['user_sexual'];
        $sso_params['custom.user_field_5'] = $custom_fields['users_reasons'];
    } else {
        // Eine Fehlermeldung protokollieren oder anzeigen, wenn $custom_fields nicht wie erwartet ist
        error_log('Benutzerdefinierte Felder Daten sind nicht im erwarteten Format.');
    }

    // Modifizierte SSO-Parameter zurückgeben
    return $sso_params;
}

Das einzige Problem ist, dass users_reasons nicht zu custom.user_field_5 hinzugefügt wird und andere Daten zum Benutzerprofil hinzugefügt werden. Wenn ich zum Beispiel diese Zeile auskommentiere: $sso_params['custom.user_field_5'] = $custom_fields['users_reasons'];, dann werden die Daten der anderen Felder zum Discourse-Benutzer hinzugefügt. Wenn ich diese Zeile nicht auskommentiere, werden keine Daten zum Benutzerprofil auf Discourse hinzugefügt. Ich muss sagen, dass das Feld users_reasons sowohl auf der Discourse- als auch auf der WordPress-Seite ein Mehrfachauswahlfeld ist. Könnte das der Grund sein? Bitte sag es mir.

Ja, das Problem ist, dass es sich um ein Mehrfachauswahlfeld handelt. Ich bin mir nicht sicher, ob das bereits unterstützt wird: Add support for multi-select fields in DiscourseConnect protocol.

Vielleicht gibt es eine Möglichkeit, es jetzt zum Laufen zu bringen, aber ich sehe nicht, wie das gehen soll. Der Discourse-Code, der aufgerufen wird, befindet sich hier: discourse/app/models/discourse_connect.rb at main · discourse/discourse · GitHub

Hallo @simon, können Sie bitte ein Codebeispiel gemäß meinem Code mit Ihrem bereitgestellten Verweis schreiben?

Ich glaube nicht, dass es möglich ist. Soweit ich das beurteilen kann, wurde der Code zum Setzen von benutzerdefinierten Feldern aus der SSO-Nutzlast seit der Erstellung des von mir verlinkten Beitrags leicht geändert, aber nicht so, dass Mehrfachauswahlfelder über die SSO-Nutzlast aktualisiert werden könnten.

Idealerweise würde Discourse den Fall ähnlich behandeln, wie es das add_groups-SSO-Feld behandelt: discourse/app/models/discourse_connect.rb at main · discourse/discourse · GitHub. Damit das funktioniert, müsste der Discourse-SSO-Code wissen, ob ein bestimmtes benutzerdefiniertes Feld ein Mehrfachauswahlfeld ist. Ich glaube nicht, dass der Code diese Information jetzt hat.

Auch hier könnte es eine Möglichkeit geben, dies zu tun, aber das übersteigt meine Fähigkeiten.

Hallo @simon, ich möchte das Benutzeravatar zwischen WordPress und Discourse synchronisieren. Da ich bereits das WP Discourse-Plugin für SSO verwende, möchte ich, dass sich das Avatar auch auf der WordPress-Website ändert, wenn ein Benutzer sein Avatar auf der Discourse-Website ändert. Wie ist das möglich und ich möchte ein Avatar-Plugin für Benutzer auf der WordPress-Website verwenden. Hier ist der Code, den ich verwende:

function my_wpdc_sso_client_updated_user( $updated_user, $query ) {
		$avatar_url = $query['avatar_url'];
		$user_id = $updated_user->ID;
		// es erlaubt uns, die Funktionen download_url() und wp_handle_sideload() zu verwenden
	require_once( ABSPATH . 'wp-admin/includes/file.php' );

	// In das temporäre Verzeichnis herunterladen
	$temp_file = download_url( $avatar_url );

	if( is_wp_error( $temp_file ) ) {
		return false;
	}

	// Die temporäre Datei in das Upload-Verzeichnis verschieben
	$file = array(
		'name'     => basename( $image_url ),
		'type'     => mime_content_type( $temp_file ),
		'tmp_name' => $temp_file,
		'size'     => filesize( $temp_file ),
	);
	$sideload = wp_handle_sideload(
		$file,
		array(
			'test_form'   => false // keine Überprüfung des Parameters 'action' erforderlich
		)
	);

	if( ! empty( $sideload[ 'error' ] ) ) {
		// Sie können eine Fehlermeldung zurückgeben, wenn Sie möchten
		return false;
	}

	// Es ist an der Zeit, unser hochgeladenes Bild zur WordPress-Mediathek hinzuzufügen
	$attachment_id = wp_insert_attachment(
		array(
			'guid'           => $sideload[ 'url' ],
			'post_mime_type' => $sideload[ 'type' ],
			'post_title'     => basename( $sideload[ 'file' ] ),
			'post_content'   => '',
			'post_status'    => 'inherit',
		),
		$sideload[ 'file' ]
	);

	if( is_wp_error( $attachment_id ) || ! $attachment_id ) {
		return false;
	}

	// Metadaten aktualisieren, Bildgrößen neu generieren
	require_once( ABSPATH . 'wp-admin/includes/image.php' );

	wp_update_attachment_metadata(
		$attachment_id,
		wp_generate_attachment_metadata( $attachment_id, $sideload[ 'file' ] )
	);

	// Die Anhangs-ID zurückgeben
	update_user_meta($user_id, '1709753088_wp_user_avatar', $attachment_id);
	update_user_meta($user_id, 'wp_user_avatar', $attachment_id);
}

Wie Sie sehen können, möchte ich die Meta-Schlüssel des Benutzers mit der Anhangs-ID aktualisieren, aber die Anhangs-ID wird nicht erstellt.

Ich freue mich auf Ihre Antwort.

Vielen Dank