Quizás lo sea. Ya que lo estaba revisando de todos modos, pensé que podría intentar un enfoque que no usara el plugin Simple Local Avatars.
El código a continuación se engancha al filtro 'wpdc_sso_client_updated_user' que se llama cuando un usuario inicia sesión en WordPress a través de Discourse. Si el usuario ha subido un avatar personalizado a Discourse, su custom_avatar_template de Discourse se guarda como metadatos del usuario en WordPress. Luego se engancha al filtro 'get_avatar_url' de WordPress y utiliza el custom_avatar_template de Discourse para establecer la URL del avatar. Me gusta este enfoque porque aprovecha la funcionalidad de redimensionamiento de plantillas de Discourse.
Tenga en cuenta que solo he probado esto 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;
}
// Comprueba si el usuario tiene una plantilla para un avatar subido en 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}";
// Guarda la plantilla del avatar. El tamaño a mostrar se sustituye en el 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 ) {
// Empieza con $user_id establecido en `null`. El código a continuación puede omitir algunos 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;
}
// Si $user_id no se ha establecido, devuelve el parámetro $url.
if ( empty( $user_id ) ) {
return $url;
}
$discourse_avatar_template = get_user_meta( $user_id, 'discourse_avatar_template', true );
// Si los metadatos de la plantilla no se han establecido, devuelve $url.
if (empty( $discourse_avatar_template ) ) {
return $url;
}
$size = isset( $args['size']) ? $args['size'] : 128; // No estoy seguro de si 'size' podría ser vacío. 128 parece una opción segura.
return str_replace( '{size}', $size, $discourse_avatar_template );
}