Ho WordPress con Discourse configurato dove Discourse è il provider DiscourseConnect per WP. Sto usando il plugin WP Discourse e finora funziona benissimo. L’unico problema che ho riscontrato finora è che non riesco a visualizzare le immagini dell’avatar da Discourse in WP.
Mi chiedo se qualcuno ci sia riuscito? Sto usando il plugin Simple Local Avatar, ma sono felice di cambiarlo se qualcuno ha avuto successo con un altro plugin.
Non sono uno sviluppatore, quindi sto un po’ indovinando, ma per quanto ne so il plugin Simple Local Avatar normalmente aggiunge l’immagine alla libreria multimediale. Non ho trovato molta documentazione su come funziona se viene fornito tramite un URL. Il codice che sto provando è simile a questo:
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 ) {
if (isset($query['avatar_url'])) {
$new_avatar_url = $query['avatar_url'];
$avatar_data = array(
'full' => $new_avatar_url, // URL della nuova immagine avatar
);
update_user_meta($updated_user, 'simple_local_avatar', $avatar_data);
}
}
Questo mi dà un’eccezione non gestita quando provo ad accedere tramite SSO.
Potrei probabilmente assumere uno sviluppatore per aiutarmi, ma sembra che questo sarebbe un caso d’uso piuttosto comune che altri potrebbero aver già implementato, anche se non con questo plugin.
Penso che la causa dell’eccezione sia che la tua funzione my_wpdc_sso_client_updated_user non restituisce l’array $updated_user. Quell’array è necessario per la funzione che aggiunge il filtro wpdc_sso_client_updated_user per continuare.
È inoltre necessario impostare l’ID utente di WordPress nella chiamata a update_user_meta.
Questo funziona, ma disabilita la funzionalità di ridimensionamento del plugin Simple Local Avatars:
add_filter( 'simple_local_avatars_dynamic_resize', '__return_false' ); // impedisce il ridimensionamento degli avatar
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 ) {
if ( isset( $query['avatar_url'] ) ) {
$new_avatar_url = $query['avatar_url'];
$wp_user_id = $updated_user['ID'];
$avatar_data = array(
'full' => $new_avatar_url, // URL della nuova immagine avatar
);
update_user_meta( $wp_user_id, 'simple_local_avatar', $avatar_data );
}
return $updated_user;
}
Il motivo per cui si impedisce il ridimensionamento degli avatar è che il ridimensionamento viene eseguito con il codice dell’editor di immagini di WordPress. Affinché funzioni, l’immagine deve essere scaricata su WordPress. Si noti che se si omette la riga add_filter( 'simple_local_avatars_dynamic_resize', '__return_false' ) dal codice sopra, il plugin Simple Local Avatars tenterà di ridimensionare le immagini, genererà un avviso PHP, quindi utilizzerà l’immagine a dimensione intera, quindi nulla sembrerà rotto dal punto di vista dell’utente.
Sono alquanto incerto sulla combinazione dell’uso degli avatar di Discourse con il plugin Simple Local Avatars. Il problema che vedo è che il plugin offre agli utenti la possibilità di caricare un avatar personalizzato su WordPress. Se lo fanno, quindi accedono nuovamente a WordPress da Discourse, potrebbero chiedersi cosa sia successo all’avatar che hanno caricato. Sarebbe più complesso da sviluppare, ma potrebbe essere meglio aggiungere la possibilità di impostare deliberatamente il proprio avatar di Discourse come avatar di WordPress nella pagina del profilo utente di WordPress.
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 );
}
Perfetto, funziona esattamente come descritto. E sono d’accordo, è molto più pulito senza bisogno di un plugin WP e la confusione sugli avatar contrastanti. Grazie!