マストドンでGravatarアイコンにしない方法のGemini案

↬ishii00141.stars.ne.jp/?c=400

設定の「タイプ別プロフィールを有効化」で「投稿者プロフィールのみ」を選択した場合にユーザーの「プロフィール写真」がGravatarのアイコンになってしまう問題について。 #Gemini の新たな提案。

WordPress内のプロフィール写真はブログテーマCocoonによって、Gravatarを使わずにアップロードしたプロフィール画像(データベースのwp_usermeta テーブルの‘upladed_avatar’キーのURL、upladedはuploadedではない)にすることができます。しかし、プラグインActivityPubでFediverseにアバターアイコンを送る際には、Gravatarアイコンになってしまいます。それを改善したいと思っています。方法を教えてください。

データベースでupladed_avatarキーの存在を確認されたのですね。貴重な情報ありがとうございます。これで、upladed_avatarキーがCocoonテーマによって意図的に使用されていることが確実になりました。

この確認結果を踏まえ、先ほど修正したコードは以下の通り、upladed_avatarキーを使用するようにしてください。

修正後のコード:

1. ユーザーのアバターURLを取得する関数を作成する

PHP

function get_cocoon_uploaded_avatar_url( $user_id ) {
    $avatar_url = get_user_meta( $user_id, 'upladed_avatar', true );
    return $avatar_url;
}

2. pre_get_avatar_data()関数を修正する

PHP

public static function pre_get_avatar_data( $args, $id_or_email ) {
    // ... (既存のコード) ...

    if ( $avatar ) {
        // ... (既存のコード) ...
    } else {
        // コメントにアバターが設定されていない場合、ユーザーのアバターを取得
        if ( is_numeric( $id_or_email ) ) {
            $user_id = $id_or_email;
        } elseif ( is_object( $id_or_email ) && property_exists( $id_or_email, 'user_id' ) ) {
            $user_id = $id_or_email->user_id;
        } else {
            return $args; // ユーザーIDが取得できない場合は、元の処理を続ける
        }

        $user_avatar_url = get_cocoon_uploaded_avatar_url( $user_id );

        if ( $user_avatar_url ) {
            if ( empty( $args['class'] ) ) {
                $args['class'] = array();
            } elseif ( is_string( $args['class'] ) ) {
                $args['class'] = explode( ' ', $args['class'] );
            }

            $args['url'] = $user_avatar_url;
            $args['class'][] = 'avatar-activitypub';
            $args['class'][] = 'u-photo';
            $args['class'] = array_unique( $args['class'] );
        }
    }

    return $args;
}

3. get_avatar_url()関数を修正する

PHP

public static function get_avatar_url( $id_or_email ) {
    if ( is_numeric( $id_or_email ) ) {
        $comment = get_comment( $id_or_email );
        if ( $comment ) {
            $avatar_url = get_comment_meta( $comment->comment_ID, 'avatar_url', true );
            if ( $avatar_url ) {
                return $avatar_url;
            }
        }
        // コメントにアバターが設定されていない場合、ユーザーのアバターを取得
        return get_cocoon_uploaded_avatar_url( $id_or_email );
    } elseif ( is_object( $id_or_email ) && property_exists( $id_or_email, 'comment_ID' ) ) {
        return get_comment_meta( $id_or_email->comment_ID, 'avatar_url', true );
    }
    return false;
}

重要な注意点:

  • データベースの直接操作は慎重に行ってください。
  • コードの変更前に必ずバックアップを取得してください。
  • 変更後のコードをテストして、期待通りに動作することを確認してください。

これらの修正を行うことで、ActivityPubプラグインでFediverseに送信されるプロフィール画像を、Cocoonテーマでアップロードした画像に変更できるはずです。

コメント

  1. ishii ishii より:

    シンプルにしてもらったコード。

    public static function pre_get_avatar_data( $args, $id_or_email ) {
    if (
    ! $id_or_email instanceof \WP_Comment ||
    ! isset( $id_or_email->comment_type ) ||
    $id_or_email->user_id
    ) {
    // コメント以外の場合、CocoonアバターURLを使用
    if ( is_numeric( $id_or_email ) ) {
    $user_id = $id_or_email;
    } elseif ( is_object( $id_or_email ) && property_exists( $id_or_email, ‘user_id’ ) ) {
    $user_id = $id_or_email->user_id;
    } else {
    return $args; // ユーザーIDが取得できない場合は、元の処理を続ける
    }

    $user_avatar_url = get_cocoon_uploaded_avatar_url( $user_id );

    if ( $user_avatar_url ) {
    if ( empty( $args[‘class’] ) ) {
    $args[‘class’] = array();
    } elseif ( is_string( $args[‘class’] ) ) {
    $args[‘class’] = explode( ‘ ‘, $args[‘class’] );
    }

    $args[‘url’] = $user_avatar_url;
    $args[‘class’][] = ‘avatar-activitypub’;
    $args[‘class’][] = ‘u-photo’;
    $args[‘class’] = array_unique( $args[‘class’] );
    return $args; // ここでreturnすることで、コメント関連の処理をスキップ
    } else {
    return $args; // CocoonアバターURLがない場合は、元の処理を続ける
    }
    }

    $allowed_comment_types = \apply_filters( ‘get_avatar_comment_types’, array( ‘comment’ ) );
    if (
    ! empty( $id_or_email->comment_type ) &&
    ! \in_array(
    $id_or_email->comment_type,
    (array) $allowed_comment_types,
    true
    )
    ) {
    $args[‘url’] = false;
    /** This filter is documented in wp-includes/link-template.php */
    return \apply_filters( ‘get_avatar_data’, $args, $id_or_email );
    }

    // Check if comment has an avatar.
    $avatar = self::get_avatar_url( $id_or_email->comment_ID );

    if ( $avatar ) {
    if ( empty( $args[‘class’] ) ) {
    $args[‘class’] = array();
    } elseif ( \is_string( $args[‘class’] ) ) {
    $args[‘class’] = \explode( ‘ ‘, $args[‘class’] );
    }

    $args[‘url’] = $avatar;
    $args[‘class’][] = ‘avatar-activitypub’;
    $args[‘class’][] = ‘u-photo’;
    $args[‘class’] = \array_unique( $args[‘class’] );
    }

    return $args;
    }

    public static function get_avatar_url( $id_or_email ) {
    if ( is_numeric( $id_or_email ) ) {
    return get_cocoon_uploaded_avatar_url( $id_or_email );
    } elseif ( is_object( $id_or_email ) && property_exists( $id_or_email, ‘comment_ID’ ) ) {
    return get_comment_meta( $id_or_email->comment_ID, ‘avatar_url’, true );
    }
    return false;
    }

    function get_cocoon_uploaded_avatar_url( $user_id ) {
    return get_user_meta( $user_id, ‘upladed_avatar’, true );
    }

タイトルとURLをコピーしました