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

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