WordPressのRest APIのユーザー情報に項目を追加する

WordPressのRest APIのユーザー情報に項目を追加する必要があったのでその際のメモ書き。

具体的には以下のようなスタッフ一覧のページを作成したかったですがデフォルトでは役職の表記や各種SNSアカウントなどの項目に対応できなたかったのでカスタマイズをしました。

ユーザー一覧のサンプル

ユーザー情報に項目を追加

Rest APIに限らずWordPressでユーザー情報に項目を追加する場合は以下の内容をfunctions.phpに追加します。

function my_user_meta($wb) {
	$wb['position'] = '役職';
	$wb['twitter'] = 'twitter';
	$wb['facebook'] = 'facebook';
	$wb['github'] = 'github';
	$wb['instagram'] = 'instagram';
	return $wb;
}
add_filter('user_contactmethods', 'my_user_meta', 10, 1);

代入している値は管理画面上のラベルに利用されます。

通常のテンプレートで上記の内容を取得する場合はget_the_author_meta関数を利用して以下のように記述します。

foreach($users as $user):
	$uid = $user->ID;
	print get_the_author_meta('twitter',$uid);
endforeach;

ただしRest APIではこれらの情報が付与されませんのでカスタマイズする必要があります。

ユーザー情報の項目をRest API に追加

Rest APIではrest_api_initアクション時に必要んあ項目を付与することが可能です。
先ほど追加した項目を

function adding_user_meta_rest() {
	register_rest_field(
		'user',
		'user_meta',
		array(
			'get_callback'      => 'facebook_get_user_field',
			'update_callback'   => null,
			'schema'            => null,
		)
	);
}
function facebook_get_user_field( $user, $field_name, $request ) {
	return array(
		'position' => get_the_author_meta('position',$user['id']),
		'twitter' => get_the_author_meta('twitter',$user['id']),
		'facebook' => get_the_author_meta('facebook',$user['id']),
		'github' => get_the_author_meta('github',$user['id']),
		'instagram' => get_the_author_meta('instagram',$user['id']),
	);
}
add_action( 'rest_api_init', 'adding_user_meta_rest' );

こうすることで各ユーザーのレスポンスにuser_metaが追加され、ユーザー管理画面で入力した内容が反映され以下のようなJSONが出力されるようになります。

{
  "name": "西畑 一馬",
  ...
  "user_meta": {
    "position": "代表取締役 / フロントエンドエンジニア",
    "twitter": "KazumaNishihata",
    "facebook": "kazuma.nishihata",
    "github": "KazumaNishihata",
    "instagram": "kazumanishihata"
  }
}

姓名などのデフォルト項目を追加

デフォルト項目である姓名などもRest APIに出力されません。

正確にはContextをeditにすれば出力されるのですが今回は認証なしに取得したかったのでContextをeditがviewのまま出力したいという意味です。

この場合は先程記載したfacebook_get_user_field内の項目をカスタマイズすることで対応が可能です。

具体的にはget_user_metaで姓(first_name)を取得して出力しています。

function facebook_get_user_field( $user, $field_name, $request ) {
	return array(
		'position' => get_the_author_meta('position',$user['id']),
		'twitter' => get_the_author_meta('twitter',$user['id']),
		'facebook' => get_the_author_meta('facebook',$user['id']),
		'github' => get_the_author_meta('github',$user['id']),
		'instagram' => get_the_author_meta('instagram',$user['id']),
		'retirement' => get_the_author_meta('retirement',$user['id']),
		'first_name' => get_user_meta( $user['id'], 'first_name', true )
	);
}

Rest APIは柔軟にカスタマイズできるのですが慣れていないとドキュメント等を読み込まないとわからないことが多いので
register_rest_routeなどで独自のエンドポイントを作るのが早いかもと思ってしまいました。

関連エントリー

WordPressのRest API のUser一覧で非投稿者も表示する

スポンサードリンク

«WordPressのRest API のUser一覧で非投稿者も表示する | メイン | React.lazyを利用してJavaScriptファイルを分割ロード»