設定の「タイプ別プロフィールを有効化」で「投稿者プロフィールのみ」を選択した場合にユーザーの「プロフィール写真」が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テーマでアップロードした画像に変更できるはずです。
コメント
シンプルにしてもらったコード。
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 );
}
このコメントでマストドンでは503エラー。表示されなかった。
こちらのコードは試したところ、WordPressがエラーだらけで、表示が変になった。すぐに元に戻した。