そうかもしれません。どうせ見ていたので、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 );
}