WP Discourse SSOはAdvanced Site Enhancementsが提供するローカルアバターを同期しません

こんにちは

現在、以下の環境を使用しています:

  • WordPress
  • WP Discourse(最新版)
  • Advanced Site Enhancements (ASE)、そのローカルユーザーアバター機能(Gravatarなし)を使用

アバターはWordPress内ではどこでも正しく表示されています。

ASEはユーザーメタフィールドに添付ファイルIDを保存しています:

local_user_avatar_attachment_id

しかし、WordPress SSOログイン時、Discourseは常にローカルアバターではなくデフォルトのアバターをインポートします。

すでにwpdc_sso_avatar_urlフィルターを使用してメディアライブラリのURLを返すように試みましたが、効果はありませんでした。

そのため、2つの質問があります:

  1. WP Discourseは現在もアバターの同期にwpdc_sso_avatar_urlを使用していますか?
  2. Discourseに送信されるアバターのURLを決定する現在の関数やフィルターは何ですか?

ご助言をいただければ幸いです。

こんにちは @miednr。はい、wpdc_sso_avatar_url はアバターの同期に引き続き使用されています。あなたのために動作するように設定してみましょう。

  1. DiscourseConnect Provider の設定で、「Force Avatar Update」は有効になっていますか?
  2. wpdc_sso_avatar_url を使用している関数を共有してください。

こんにちは @angus さん!

この件にご注目をいただきありがとうございます。はい、「アバターを強制的に更新」は有効にしています。

現時点での私の関数は以下の通りです:



<?php
add_filter( 'get_avatar_url', function( $url, $id_or_email, $args ) {
    $user = false;
    if ( is_numeric( $id_or_email ) ) {
        $user = get_user_by( 'id', (int) $id_or_email );
    } elseif ( $id_or_email instanceof WP_User ) {
        $user = $id_or_email;
    }
    if ( ! $user ) {
        return $url;
    }
    $avatar_id = get_user_meta( $user->ID, 'local_user_avatar_attachment_id', true );
    if ( ! $avatar_id ) {
        return $url;
    }
    $local_avatar_url = wp_get_attachment_image_url( (int) $avatar_id, 'full' );
    return $local_avatar_url ?: $url;
}, 10, 3 );

動作するように何度か変更しました。でも、以前はもっと良いバージョンがあったような気がします。:wink:

動作するバージョンを見つけられたら素晴らしいですね。

間違ったスニペットを共有していませんか?そのコードは get_avatar_url フィルターを使用しています。あなたが観察した通り、フィルターは wpdc_sso_avatar_url です。

こんにちは @angus

以前、試した別のアプローチをお共有しました。申し訳ありません。以下が私が共有できる最適なスニペットです:

add_filter( 'wpdc_sso_avatar_url', function( $avatar_url, $user_id ) {

$avatar_id = get_user_meta( $user_id, 'local_user_avatar_attachment_id', true );

if ( ! $avatar_id ) {
    return $avatar_url;
}

$local_avatar_url = wp_get_attachment_image_url( (int) $avatar_id, 'full' );

if ( ! $local_avatar_url ) {
    return $avatar_url;
}

return esc_url_raw( $local_avatar_url );

}, 10, 2 );

このスニペットを試しました。ASE はローカルアバターの添付ファイルIDをユーザーメタフィールド local_user_avatar_attachment_id に保存します。添付ファイルIDは存在し、メディアライブラリの画像を指しています。しかし、WordPressのログイン/SSO同期後、Discourseは引き続きデフォルトのアバターをインポートします。

また、full の代わりに thumbnail の画像サイズで同じアプローチを試しましたが、結果は同じでした。

確認していただき、ありがとうございます!

こんにちは @angus さん

ASE(Advanced Site Enhancements)の開発者から、この問題を絞り込むのに役立つかもしれない回答をいただきました。

彼らによると:

  • ASE は標準の WordPress アバター API にフックします:

  • get_avatar(優先度 5)

  • get_avatar_url(優先度 10)

  • get_avatar_data(優先度 10)

  • 現在、他のプラグインとの互換性に関する既知の問題はありません。

  • ローカルアバターはメディアライブラリに保存され、添付ファイルIDがユーザーメタフィールドに保存されます:

local_user_avatar_attachment_id

また、以下のようにアバターURLを手動で取得することも提案されました:

$attachment_id = (int) get_user_meta( $user_id, 'local_user_avatar_attachment_id', true );

if ( $attachment_id ) {

$avatar_url = wp_get_attachment_image_url( $attachment_id, array( 128, 128 ) );

}

私はこれを wpdc_sso_avatar_url フィルター内で使用してみましたが、結果は変わらず、ログイン後もデフォルトの Discourse アバターが使用されています。

ASE は get_avatar_url() にフックすると主張しているため、以下についてお伺いしたいです:

  • WP Discourse は wpdc_sso_avatar_url フィルターを適用する前か後に get_avatar_url() を呼び出していますか?

  • Discourse がアバター同期中に期待するアバターURLに関する特定の要件(サイズ、アクセシビリティ、タイミングなど)はありますか?

追加のテストを実行したり、一時的なデバッグを追加したりすることも可能ですので、お手伝いできることがあればお知らせください。

ご協力いただき、ありがとうございます!

Discourse で discourse_connect_overrides_avatar サイト設定が有効になっていますか?

はい、有効化されています。

わかりました。最終的なSSOパラメータの内容を確認しましょう。以下のフィルターを追加して、ログに記録される内容を確認してください。

add_filter( 'wpdc_sso_params', function ( $params ) {
   error_log( "avatar_url: {$params['avatar_url']} force: {$params['avatar_force_update']}" );
   return $params;
});

スニペットはページ読み込み時に毎回ロードされますが、wpdc_sso_params はログアウト/ログイン時や Discourse のログインフロー中には発火しません。

そのフィルターが実行されない場合、DiscourseConnectが正しく設定されていないか、DiscourseにログインするためのプロバイダーとしてWordPressを使用していない可能性があります。WP Discourse > ログからmetaファイルを共有してください。

こんにちは @angus

もちろんです、こちらをご確認ください:

### サーバー ###

WordPress - 7.0

PHP - 8.3.6

MySQL - 8.4.9

### WP Discourse 設定(シークレット情報は除外) ###

connection-logs - 0

display-subcategories - 1

allow-tags - 1

max-tags - 15

publish-as-unlisted - 0

full-post-content - 0

custom-excerpt-length - 100

add-featured-link - 1

auto-publish - 1

force-publish - 1

force-publish-max-age - 0

publish-failure-notice - 1

auto-track - 1

allowed_post_types - post

exclude_tags -

hide-discourse-name-field - 0

discourse-username-editable - 0

direct-db-publication-flags - 0

verbose-publication-logs - 0

enable-discourse-comments - 1

comment-type - display-public-comments-only

ajax-load - 1

load-comment-css - 1

discourse-new-tab - 1

hide-wordpress-comments - 1

show-existing-comments - 0

max-comments - 10

min-replies - 0

min-score - 0

min-trust-level - 0

bypass-trust-level-score - 0

only-show-moderator-liked - 0

custom-datetime-format -

cache-html - 0

clear-cached-comment-html - 0

verbose-comment-logs - 0

use-discourse-webhook - 1

use-discourse-user-webhook - 1

webhook-match-user-email - 0

verbose-webhook-logs - 0

verbose-sso-logs - 1

enable-sso - 1

auto-create-sso-user - 1

real-name-as-discourse-name - 0

force-avatar-update - 1

redirect-without-login - 0

sso-client-enabled - 0

sso-client-login-form-change - 0

sso-client-sync-by-email - 0

sso-client-disable-create-user - 0

sso-client-sync-logout - 0

logs-enabled - 1

WordPress は確かにプロバイダーとして設定されていますが、どうやら DiscourseConnect のコードが実行されていないようです。これは、DiscourseConnect を使用してログインしていないか、スニペットやログを正しく読み込んでいないことを示唆しています。もしかすると、OAuth などの他のログイン方法が設定されているかもしれません。この問題をテストするために、あなたが正確に何を行っているかを記録してみてください。開発者ツールのネットワークタブで「ログを保持」を有効にするか、または録画によって URL をキャプチャしてみてください。

ただし、ログアウト/ログイン時や Discourse のログインフロー中にも wpdc_sso_params は決して実行されません

また、この結論に至った経緯も共有してください。

「error_log( ‘[WPDC avatar debug] snippet loaded’ );」を追加しました。

  1. 私は標準的な WordPress ログインを介して DiscourseConnect を使用してログインしています。
  2. 私は Advanced Site Enhancements (ASE) Snippets Manager を使用してスニペットを追加しています。また、あなたのデバッグスニペット(説明通り修正)は debug.log にいくつかのエントリを記録させることができました。

wpdc_sso_params が発火しない限り、DiscourseConnect を使用したログインは不可能なため、どこかに不具合があるようです。その原因を特定する必要があります。あなたの環境に直接アクセスできないため、その部分については私が特定することはできません。

@angus さん、ご尽力いただきありがとうございます。今、この問題についてさらに詳しく調査し、その結果をお知らせします。