MENU

WordPressのカスタムフィールドをREST APIで取得する方法

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仕様書に表示されるフィールドの説明とデータ型を定義する。データ型にはstringintegerbooleanなどが指定できる。

実際の使用例

たとえば、記事の閲覧数を記録する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アプリケーションやモバイルアプリケーションから、カスタムフィールドの値に簡単にアクセスできるようになる。実装時は、データ型の指定とエラーハンドリングに注意し、動作確認を十分に行うことが重要である。

目次