也许是吧。既然我已经在看了,我想我也可以尝试一种不使用 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 );
}