Wordpress Avatare von Discourse, wenn Discourse der SSO-Anbieter ist

Ich habe WordPress mit Discourse eingerichtet, wobei Discourse der DiscourseConnect-Anbieter für WP ist. Ich verwende das WP Discourse-Plugin und es funktioniert bisher gut. Das einzige Problem, auf das ich bisher gestoßen bin, ist, dass ich die Avatarbilder von Discourse nicht in WP anzeigen kann.

Ich habe versucht, die Lösung unter Could you update user avatar for wordpress plugin sso? - #2 by angus zu implementieren – das Hinzufügen des Codes zur function.php-Datei meiner WP-Website. Aber es funktioniert bei mir nicht – ich weiß nicht, welchen Code ich hinzufügen soll, um den Avatar festzulegen.

Ich frage mich, ob das schon jemand zum Laufen gebracht hat? Ich verwende das Simple Local Avatar-Plugin, bin aber bereit, es zu ändern, wenn jemand mit einem anderen Plugin erfolgreich war.

Hallo @uffehe

Welchen Code fügst du hinzu und wie speichert das Simple Local Avatar Plugin Avatare?

Hallo @angus

Ich bin kein Entwickler, daher rate ich hier ein wenig, aber meines Verständnisses nach fügt das Simple Local Avatar Plugin normalerweise das Bild zur Mediathek hinzu. Ich konnte nicht viele Dokumentationen darüber finden, wie es funktioniert, wenn es über eine URL bereitgestellt wird. Der Code, den ich ausprobiere, sieht so aus:

add_filter( 'wpdc_sso_client_updated_user', 'my_wpdc_sso_client_updated_user', 10, 2 );
function my_wpdc_sso_client_updated_user( $updated_user, $query ) {
    if (isset($query['avatar_url'])) {
        $new_avatar_url = $query['avatar_url'];

        $avatar_data = array(
            'full' => $new_avatar_url,  // URL des neuen Avatarbilds
        );
        update_user_meta($updated_user, 'simple_local_avatar', $avatar_data);
    }
}

Dies gibt mir eine unbehandelte Ausnahme, wenn ich versuche, mich mit SSO anzumelden.

Ich könnte wahrscheinlich einen Entwickler einstellen, um mir zu helfen, aber es scheint, dass dies ein ziemlich häufiger Anwendungsfall wäre, den andere möglicherweise bereits implementiert haben – wenn auch nicht mit diesem Plugin.

Ich glaube, die Ursache für die Ausnahme ist, dass Ihre Funktion my_wpdc_sso_client_updated_user das Array $updated_user nicht zurückgibt. Dieses Array wird für die Funktion benötigt, die den Filter wpdc_sso_client_updated_user hinzufügt, um fortzufahren.

Sie müssen auch die WordPress-Benutzer-ID des Benutzers im Aufruf von update_user_meta festlegen.

Dies funktioniert, deaktiviert jedoch die Skalierungsfunktionalität des Simple Local Avatars-Plugins:

add_filter( 'simple_local_avatars_dynamic_resize', '__return_false' ); // Verhindert die Größenänderung von Avataren
add_filter( 'wpdc_sso_client_updated_user', 'my_wpdc_sso_client_updated_user', 10, 2 );
function my_wpdc_sso_client_updated_user( $updated_user, $query ) {
	if ( isset( $query['avatar_url'] ) ) {
		$new_avatar_url = $query['avatar_url'];
		$wp_user_id = $updated_user['ID'];

		$avatar_data = array(
			'full' => $new_avatar_url,  // URL des neuen Avatarbildes
		);
		update_user_meta( $wp_user_id, 'simple_local_avatar', $avatar_data );
	}

	return $updated_user;
}

Der Grund für die Verhinderung der Größenänderung von Avataren ist, dass die Größenänderung mit dem Code des WordPress-Bildbearbeitungsprogramms erfolgt. Damit dies funktioniert, muss das Bild in WordPress heruntergeladen werden. Beachten Sie, dass, wenn Sie die Zeile add_filter( 'simple_local_avatars_dynamic_resize', '__return_false' ) aus dem obigen Code weglassen, das Simple Local Avatars-Plugin versucht, die Bilder zu skalieren, eine PHP-Warnung ausgibt und dann das Bild in voller Größe verwendet – sodass aus Benutzersicht nichts kaputt zu gehen scheint.

Ich bin mir bei der Kombination von Discourse-Avataren mit dem Simple Local Avatars-Plugin etwas unsicher. Das Problem, das ich sehe, ist, dass das Plugin Benutzern die Möglichkeit gibt, einen benutzerdefinierten Avatar auf WordPress hochzuladen. Wenn sie dies tun und sich dann wieder von Discourse bei WordPress anmelden, fragen sie sich vielleicht, was mit dem von ihnen hochgeladenen Avatar passiert ist. Es wäre komplexer zu entwickeln, aber es wäre vielleicht besser, die Möglichkeit hinzuzufügen, ihren Discourse-Avatar auf der WordPress-Profilseite des Benutzers bewusst als WordPress-Avatar festzulegen.

2 „Gefällt mir“

Vielleicht ist es das. Da ich es sowieso angesehen habe, dachte ich, ich könnte genauso gut einen Ansatz ausprobieren, der das Simple Local Avatars-Plugin nicht verwendet.

Der folgende Code greift den 'wpdc_sso_client_updated_user'-Filter ab, der aufgerufen wird, wenn sich ein Benutzer über Discourse bei WordPress anmeldet. Wenn der Benutzer einen benutzerdefinierten Avatar auf Discourse hochgeladen hat, wird seine Discourse custom_avatar_template als Benutzer-Metadaten auf WordPress gespeichert. Anschließend greift er den WordPress 'get_avatar_url'-Filter ab und verwendet die Discourse custom_avatar_template, um die URL des Avatars festzulegen. Mir gefällt dieser Ansatz, da er die Funktionalität von Discourse zur Größenanpassung von Vorlagen nutzt.

Beachten Sie, dass ich dies nur lokal getestet habe.

use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;
add_filter( 'wpdc_sso_client_updated_user', 'my_wpdc_sso_client_updated_user', 10, 2 );
function my_wpdc_sso_client_updated_user( $updated_user, $query ) {
	$options  = DiscourseUtilities::get_options();
	$base_url = $options['url'];
	$discourse_username    = $query['username'];
	$discourse_profile_url = "{$base_url}/u/{$discourse_username}.json";
	$wp_user_id             = $updated_user['ID'];
	$profile_data           = DiscourseUtilities::discourse_request( $discourse_profile_url );
	if ( is_wp_error( $profile_data ) ) {

		return $updated_user;
	}

    // Prüfen, ob der Benutzer eine Vorlage für ein hochgeladenes Avatar auf Discourse hat.
	$user_data = $profile_data->user;
	if ( ! property_exists( $user_data, 'custom_avatar_template' ) ) {

		return $updated_user;
	}

	$custom_avatar_template_path = $profile_data->user->custom_avatar_template;
    $custom_avatar_template = "{$base_url}{$custom_avatar_template_path}";
    // Speichern der Avatar-Vorlage. Die anzuzeigende Größe wird im `get_avatar_url`-Filter substituiert.
    update_user_meta( $wp_user_id, 'discourse_avatar_template', $custom_avatar_template );

    return $updated_user;
}

add_filter('get_avatar_url', 'my_get_avatar_url', 10, 3 );
function my_get_avatar_url($url, $id_or_email, $args ) {
    // Beginnen mit $user_id auf `null` gesetzt. Der folgende Code kann einige Fälle übersehen.
    $user_id = null;
    if ( is_numeric( $id_or_email ) ) {
        $user_id = $id_or_email;
    } elseif ( $id_or_email instanceof WP_User ) {
        $user_id = $id_or_email->ID;
    } elseif ( $id_or_email instanceof WP_Post ) {
        $user_id = $id_or_email->user_id;
    } elseif ( $id_or_email instanceof WP_Comment ) {
        $user_id = $id_or_email->user_id;
    }

    // Wenn $user_id nicht gesetzt wurde, geben Sie den $url-Parameter zurück.
    if ( empty( $user_id ) ) {

        return $url;
    }

    $discourse_avatar_template = get_user_meta( $user_id, 'discourse_avatar_template', true );
    // Wenn die Vorlagen-Metadaten nicht gesetzt wurden, geben Sie $url zurück.
    if (empty( $discourse_avatar_template ) ) {

        return $url;
    }

    $size = isset( $args['size']) ? $args['size'] : 128;  // Ich bin mir nicht sicher, ob 'size' jemals leer sein könnte. 128 scheint ein sicherer Fallback zu sein.

    return str_replace( '{size}', $size, $discourse_avatar_template );
}
3 „Gefällt mir“

Hallo @simon

Perfekt – es funktioniert genau wie beschrieben. Und ich stimme zu, es ist viel sauberer, ohne ein WP-Plugin und die Verwirrung um widersprüchliche Avatare zu benötigen. Danke!

2 „Gefällt mir“

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.