Peut-être que c’est le cas. Puisque je l’examinai de toute façon, j’ai pensé que je pourrais aussi bien essayer une approche qui n’utilise pas le plugin Simple Local Avatars.
Le code ci-dessous s’accroche au filtre 'wpdc_sso_client_updated_user' qui est appelé lorsqu’un utilisateur se connecte à WordPress via Discourse. Si l’utilisateur a téléchargé un avatar personnalisé sur Discourse, son custom_avatar_template Discourse est enregistré en tant que métadonnées utilisateur sur WordPress. Il s’accroche ensuite au filtre WordPress 'get_avatar_url' et utilise le custom_avatar_template Discourse pour définir l’URL de l’avatar. J’aime cette approche car elle utilise la fonctionnalité de redimensionnement de modèle de Discourse.
Notez que je n’ai testé cela qu’en local.
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;
}
// Check to see if the user has a template for an uploaded avatar on 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}";
// Save the avatar template. The size to display gets substituted in the `get_avatar_url` filter.
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 ) {
// Start with $user_id set to `null`. The code below may miss some cases.
$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;
}
// If $user_id hasn't been set, return the $url parameter.
if ( empty( $user_id ) ) {
return $url;
}
$discourse_avatar_template = get_user_meta( $user_id, 'discourse_avatar_template', true );
// If the template metadata hasn't been set, return $url.
if (empty( $discourse_avatar_template ) ) {
return $url;
}
$size = isset( $args['size']) ? $args['size'] : 128; // I'm not sure if 'size' could ever be empty. 128 seems like a safe fallback.
return str_replace( '{size}', $size, $discourse_avatar_template );
}