Forse lo è. Dato che ci stavo comunque dando un’occhiata, ho pensato che avrei potuto provare un approccio che non utilizzasse il plugin Simple Local Avatars.
Il codice seguente si aggancia al filtro 'wpdc_sso_client_updated_user' che viene chiamato quando un utente accede a WordPress tramite Discourse. Se l’utente ha caricato un avatar personalizzato su Discourse, il suo custom_avatar_template di Discourse viene salvato come metadato utente su WordPress. Si aggancia quindi al filtro 'get_avatar_url' di WordPress e utilizza il custom_avatar_template di Discourse per impostare l’URL dell’avatar. Mi piace questo approccio perché sfrutta la funzionalità di ridimensionamento dei modelli di Discourse.
Nota che ho testato questo solo 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;
}
// Controlla se l'utente ha un modello per un avatar caricato su 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 il modello avatar. La dimensione da visualizzare viene sostituita nel 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 ) {
// Inizia con $user_id impostato su `null`. Il codice sottostante potrebbe non coprire alcuni casi.
$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 non è stato impostato, restituisci il parametro $url.
if ( empty( $user_id ) ) {
return $url;
}
$discourse_avatar_template = get_user_meta( $user_id, 'discourse_avatar_template', true );
// Se il metadato del modello non è stato impostato, restituisci $url.
if (empty( $discourse_avatar_template ) ) {
return $url;
}
$size = isset( $args['size']) ? $args['size'] : 128; // Non sono sicuro se 'size' possa mai essere vuoto. 128 sembra un fallback sicuro.
return str_replace( '{size}', $size, $discourse_avatar_template );
}