Wordpress 的头像来自 Discourse,当 Discourse 是 SSO 提供商

也许是吧。既然我已经在看了,我想我也可以尝试一种不使用 Simple Local Avatars 插件的方法。

下面的代码挂钩到用户通过 Discourse 登录 WordPress 时调用的 'wpdc_sso_client_updated_user' 过滤器。如果用户在 Discourse 上传了自定义头像,他们的 Discourse custom_avatar_template 将作为用户元数据保存在 WordPress 上。然后,它挂钩到 WordPress 的 'get_avatar_url' 过滤器,并使用 Discourse custom_avatar_template 来设置头像的 URL。我喜欢这种方法,因为它利用了 Discourse 的模板调整大小功能。

请注意,我只在本地测试过此代码。

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;
	}

    // 检查用户是否在 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}";
    // 保存头像模板。显示的大小将在 `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 ) {
    // 以 $user_id 设置为 `null` 开始。下面的代码可能遗漏一些情况。
    $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;
    }

    // 如果 $user_id 尚未设置,则返回 $url 参数。
    if ( empty( $user_id ) ) {

        return $url;
    }

    $discourse_avatar_template = get_user_meta( $user_id, 'discourse_avatar_template', true );
    // 如果模板元数据尚未设置,则返回 $url。
    if (empty( $discourse_avatar_template ) ) {

        return $url;
    }

    $size = isset( $args['size']) ? $args['size'] : 128;  // 我不确定 'size' 是否可能为空。128 似乎是一个安全的后备值。

    return str_replace( '{size}', $size, $discourse_avatar_template );
}