Avatares do Wordpress do Discourse, com o Discourse como provedor de SSO

Talvez seja. Como eu estava olhando de qualquer maneira, pensei que poderia tentar uma abordagem que não usa o plugin Simple Local Avatars.

O código abaixo se conecta ao filtro 'wpdc_sso_client_updated_user' que é chamado quando um usuário faz login no WordPress via Discourse. Se o usuário carregou um avatar personalizado para o Discourse, seu custom_avatar_template do Discourse é salvo como metadados do usuário no WordPress. Em seguida, ele se conecta ao filtro 'get_avatar_url' do WordPress e usa o custom_avatar_template do Discourse para definir o URL do avatar. Gosto dessa abordagem porque ela utiliza a funcionalidade de redimensionamento de modelo do Discourse.

Note que eu testei isso apenas localmente.

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

    // Verifica se o usuário tem um modelo para um avatar carregado no Discourse.
	$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}";
    // Salva o modelo de avatar. O tamanho a ser exibido é substituído no filtro `get_avatar_url`.
    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 ) {
    // Começa com $user_id definido como `null`. O código abaixo pode perder alguns casos.
    $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;
    }

    // Se $user_id não foi definido, retorna o parâmetro $url.
    if ( empty( $user_id ) ) {

        return $url;
    }

    $discourse_avatar_template = get_user_meta( $user_id, 'discourse_avatar_template', true );
    // Se os metadados do modelo não foram definidos, retorna $url.
    if (empty( $discourse_avatar_template ) ) {

        return $url;
    }

    $size = isset( $args['size']) ? $args['size'] : 128;  // Não tenho certeza se 'size' poderia ser vazio. 128 parece um fallback seguro.

    return str_replace( '{size}', $size, $discourse_avatar_template );
}