WordPressで作成したカスタムフィールドは、デフォルトではREST APIのレスポンスに含まれない。しかし、register_rest_field()関数を使用することで、カスタムフィールドをREST APIのレスポンスに追加できる。本記事では、カスタムフィールドをREST APIで取得する手順を具体的に解説する。
前提環境
- WordPress 5.0以上
- 対象カスタムフィールドが既に投稿に設定済み
- functions.phpまたはプラグインファイルへの編集権限
カスタムフィールドをREST APIに追加する手順
コードの実装
以下のコードをテーマのfunctions.phpまたはプラグインファイルに追加する。
add_action('rest_api_init', function() {
register_rest_field('post', 'custom_field_name', array(
'get_callback' => function($post) {
return get_post_meta($post['id'], 'custom_field_name', true);
},
'schema' => array(
'description' => 'Custom field description',
'type' => 'string'
)
));
});
このコードの各パラメータについて詳しく説明する。
パラメータの説明
register_rest_field()関数の第1引数では、対象となる投稿タイプを指定する。投稿の場合は'post'、固定ページの場合は'page'、カスタム投稿タイプの場合はその投稿タイプ名を指定する。
第2引数では、REST APIのレスポンスに表示されるフィールド名を指定する。この名前は実際のカスタムフィールド名と異なっても構わないが、わかりやすさのため同じ名前にすることが多い。
第3引数の配列では、以下の設定を行う。get_callbackは、フィールドの値を取得するための関数を定義する。ここでget_post_meta()関数を使用してカスタムフィールドの値を取得している。第3引数にtrueを指定することで、配列ではなく単一の値として取得される。
schemaでは、API仕様書に表示されるフィールドの説明とデータ型を定義する。データ型にはstring、integer、booleanなどが指定できる。
実際の使用例
たとえば、記事の閲覧数を記録するpage_viewsというカスタムフィールドがある場合、以下のように実装する。
add_action('rest_api_init', function() {
register_rest_field('post', 'page_views', array(
'get_callback' => function($post) {
return get_post_meta($post['id'], 'page_views', true);
},
'schema' => array(
'description' => 'Page view count',
'type' => 'integer'
)
));
});
この設定を行うと、REST APIのレスポンスは以下のようになる。
{
"id": 123,
"title": {
"rendered": "サンプル記事"
},
"content": {
"rendered": "記事の内容..."
},
"page_views": 1500,
"meta": {...}
}
カスタムフィールドpage_viewsが、投稿データと同じレベル(トップレベル)に配置されていることがわかる。
動作確認の方法
curlコマンドでの確認
コマンドラインからcurlを使用して確認する。
curl https://example.com/wp-json/wp/v2/posts/123
レスポンスのJSONデータの中に、設定したカスタムフィールド名とその値が含まれていれば実装成功である。
複数のカスタムフィールドを追加する場合
複数のカスタムフィールドをREST APIに追加したい場合は、register_rest_field()を複数回呼び出す。
add_action('rest_api_init', function() {
// 閲覧数フィールド
register_rest_field('post', 'page_views', array(
'get_callback' => function($post) {
return get_post_meta($post['id'], 'page_views', true);
},
'schema' => array(
'description' => 'Page view count',
'type' => 'integer'
)
));
// 評価フィールド
register_rest_field('post', 'rating', array(
'get_callback' => function($post) {
return get_post_meta($post['id'], 'rating', true);
},
'schema' => array(
'description' => 'Post rating',
'type' => 'number'
)
));
});
この方法により、単一のアクションフック内で複数のカスタムフィールドをまとめて追加できる。
注意点とトラブルシューティング
カスタムフィールドの値が表示されない場合
カスタムフィールドがREST APIに表示されない場合、以下を確認する必要がある。まず、対象の投稿に実際にカスタムフィールドの値が設定されているかをWordPress管理画面で確認する。値が設定されていない場合、APIのレスポンスには空の値またはnullが返される。
次に、get_post_meta()関数の第1引数で正しい投稿IDが取得できているかを確認する。デバッグのため、一時的にerror_log()関数を使用して投稿IDやカスタムフィールドの値をログに出力して確認することも有効である。
テーマ間での互換性
現在の実装方法では、テーマを変更するとfunctions.phpも変更されるため、新しいテーマでも同じコードを追加する必要がある。テーマに依存しない実装を行いたい場合は、専用のプラグインを作成することを推奨する。
プラグインとして実装する場合は、以下のようなファイル構造で作成する。
<?php
/*
Plugin Name: Custom Fields REST API
Description: Adds custom fields to REST API
Version: 1.0
*/
add_action('rest_api_init', function() {
register_rest_field('post', 'page_views', array(
'get_callback' => function($post) {
return get_post_meta($post['id'], 'page_views', true);
},
'schema' => array(
'description' => 'Page view count',
'type' => 'integer'
)
));
});
このファイルをプラグインディレクトリに配置することで、テーマに依存しない実装が可能になる。
まとめ
WordPressのカスタムフィールドをREST APIで取得するには、register_rest_field()関数を使用する方法が最も確実である。この方法により、フロントエンドのJavaScriptアプリケーションやモバイルアプリケーションから、カスタムフィールドの値に簡単にアクセスできるようになる。実装時は、データ型の指定とエラーハンドリングに注意し、動作確認を十分に行うことが重要である。