그럴 수도 있습니다. 어쨌든 살펴보고 있었기 때문에, 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 );
}