Avatars Wordpress depuis Discourse lorsque Discourse est le fournisseur SSO

J’ai Wordpress avec Discourse configuré où Discourse est le fournisseur DiscourseConnect pour WP. J’utilise le plugin WP Discourse et cela fonctionne très bien jusqu’à présent. Le seul problème que j’ai rencontré jusqu’à présent est que je n’arrive pas à afficher les images d’avatar de Discourse dans WP.

J’ai essayé de mettre en œuvre la solution dans Could you update user avatar for wordpress plugin sso? - #2 by angus - en ajoutant le code au fichier function.php de mon site WP. Mais cela ne fonctionne pas pour moi - je ne sais pas quel code ajouter pour définir l’avatar.

Je me demande si quelqu’un a réussi à faire fonctionner cela ? J’utilise le plugin Simple Local Avatar, mais je suis prêt à le changer si quelqu’un a réussi avec un autre plugin.

Salut @uffehe

Quel code ajoutez-vous et comment le plugin Simple Local Avatar enregistre-t-il les avatars ?

Salut @angus

Je ne suis pas développeur, donc je suppose, mais d’après ce que je comprends, le plugin Simple Local Avatar ajoute normalement l’image à la médiathèque. Je n’ai pas trouvé beaucoup de documentation sur son fonctionnement s’il est fourni via une URL. Le code que j’essaie ressemble à ceci :

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 de la nouvelle image d'avatar
        );
        update_user_meta($updated_user, 'simple_local_avatar', $avatar_data);
    }
}

Cela me donne une exception non gérée lorsque j’essaie de me connecter via SSO.

Je pourrais probablement engager un développeur pour m’aider, mais il semble que ce serait un cas d’utilisation assez courant que d’autres auraient déjà implémenté - même si ce n’est pas avec ce plugin.

Je pense que la cause de l’exception est que votre function my_wpdc_sso_client_updated_user ne renvoie pas le tableau $updated_user. Ce tableau est nécessaire pour la fonction qui ajoute le filtre wpdc_sso_client_updated_user afin qu’il continue.

Vous devez également définir l’ID utilisateur WordPress de l’utilisateur dans l’appel à update_user_meta.

Cela fonctionne, mais désactive la fonctionnalité de redimensionnement du plugin Simple Local Avatars :

add_filter( 'simple_local_avatars_dynamic_resize', '__return_false' ); // empêche le redimensionnement des avatars
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 de la nouvelle image d'avatar
		);
		update_user_meta( $wp_user_id, 'simple_local_avatar', $avatar_data );
	}

	return $updated_user;
}

La raison pour laquelle le redimensionnement des avatars est empêché est que le redimensionnement est effectué avec le code de l’éditeur d’images WordPress. Pour qu’il fonctionne, l’image doit être téléchargée sur WordPress. Notez que si vous omettez la ligne add_filter( 'simple_local_avatars_dynamic_resize', '__return_false' ) du code ci-dessus, le plugin Simple Local Avatars tentera de redimensionner les images, générera un avertissement PHP, puis utilisera l’image en taille réelle - donc rien ne semblera cassé du point de vue de l’utilisateur.

Je ne suis pas tout à fait sûr de la combinaison de l’utilisation des avatars Discourse avec le plugin Simple Local Avatars. Le problème que je vois est que le plugin donne aux utilisateurs la possibilité de télécharger un avatar personnalisé sur WordPress. S’ils le font, puis se reconnectent à WordPress depuis Discourse, ils pourraient se demander ce qu’il est advenu de l’avatar qu’ils ont téléchargé. Ce serait plus complexe à développer, mais il serait peut-être préférable d’ajouter la possibilité de définir délibérément votre avatar Discourse comme votre avatar WordPress sur la page de profil WordPress de l’utilisateur.

2 « J'aime »

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 );
}
3 « J'aime »

Salut @simon

Parfait - cela fonctionne exactement comme décrit. Et je suis d’accord, c’est beaucoup plus propre sans avoir besoin d’un plugin WP et de la confusion autour des avatars conflictuels. Merci !

2 « J'aime »

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.