ワイヤード・パンチ

元・大阪人が、岡山の山奥でも生きていけることを証明するためのブログ。

WP User Avaterで設定したアバター画像のIDを取得する方法。

WordPressでは通常、各ユーザのアバター画像を設定するには、Gravatarというサービスを使うことになるうえに、どのWordpressサイトでも共通のアバターになってしまいます。

でも、WP User avatarというプラグインを導入すれば、Gravatarに頼らず、サイト内で完結するアバター画像変更機能を実装することができます。

そこで今回、アバターとして設定した画像のメディアIDを取得することを関数でやりたかったのですが、その方法に四苦八苦。

広告

そもそもIDを取得する関数がない。

現在サイトにログインしているユーザのアカウント名とかメールアドレスとか、そういうのを取れる関数ならすぐ見つかりました。

しかし、ユーザに設定している画像のメディアIDが取れる関数は見つかりません。

一方で、ユーザ画像のURLを取得する関数ならありました。

get_avatar_url

これをうまいこと使えば、もしかしてIDを割り出すことができるんじゃないでしょうか。

思いつく方法としては、get_postsで全メディアをいったん取得し、そこからURLが一致するものだけ抜き出すという…。

しかし、さっきの関数を実際に使ってみると、問題が発覚しました。

たとえWP User avatarを導入していても、Gravatarで設定されている方の画像のURLが取得されてしまうのです。

Gravatarの画像では、Wordpressサイト外の画像になってしまうので、これではメディアの検索に使えません。

アバターのURLなら取得可能。

get_avatar

さっきのget_avatar_urlではGravatarのURLが取得されてしまいましたが、get_avatarならばちゃんと、プラグインのアバター画像を取得することができました。

ただし、get_avatar_urlだと取得できるのは、関数名どおりURLだけですが、こちらはimgタグとして取得してしまいます。

今回はURLだけが欲しいので、そのimgタグからURL以外の部分を削除する必要があります。

function get_avatar_src() {
	$image = get_avatar(get_current_user_id(), 10000);
	if(preg_match('/src="([^"]*)"/', $image, $match)) {
		if(isset($match[1])) {
			return $match[1];
		} else {
			return false;
		}
	} else {
		return false;
	}
}

まず、get_avatarを実行するには、第一引数が必須となっており、該当ユーザのIDかメールアドレスを入力します。

get_current_user_idを使えば、現在ログイン中のユーザのIDをすぐ取得できるので、こちらを使います。

また、第二引数は画像サイズとなりますが、ここで小さい値を入れていると、縮小された方の画像のimgタグが取得されてしまいます。

今回はフルサイズの画像がほしかったため、10000という今の時代ではありえないサイズの値を入れています。

次に、get_avatarで取得したimgタグから、srcの値を抽出します。

preg_matchを行った結果、srcという部分も含んでいる値と、ダブルクオートで囲まれていたURLの部分だけの値が含まれた、配列が返ってきます。

その配列の要素0と要素1、後者の方にURLだけの値があるので、そちらの値をreturnします。

これで、get_avatarから、WP User avatarの画像URLを取得できました。

画像URLからメディアIDを割り出す。

今度はアバター画像のメディアIDの取得ですが、残念ながらURLをget_postsの引数としては指定できませんでした。

よって、先程も書いたように、いったん全メディアを取得してから、URLが一致するメディアだけ抽出するという方法にします。

上記で作ったURLを取得する関数を、get_avatar_srcという名前にしておきます。

$src = get_avatar_src();
$posts = get_posts([
	"post_type" => "attachment",
	"posts_per_page" => -1,
]);
foreach($posts as $post) {
	if($post->guid === $src) {
		return $post->ID;
	}
}

get_postsでpost_typeをattachmentにすれば、メディアを取得することになります。

投稿ではないのですが、get_postsで取得することになります。

また、posts_per_pageで1ページあたりの件数を指定しますが、全件欲しいので-1にします。

そして全件取れたあとはforeachでループをかけて、guidがアバターURLと一致するものを探します。

guidはメディアのURLとなります。

そして一致すれば、IDをreturnして終わりです。

これでようやく、アバター画像のIDを取得することができました。