WP APIのレスポンス内容をPHPでカスタマイズする方法

WP APIを使ってWordPress内の記事データをREST形式のAPIリクエストで取得できます。レスポンスカスタマイズ方法として、_fieldsパラメータを使用する方法や、register_rest_field関数を使用してカスタムなデータを追加する方法が紹介されています。ただし、デフォルトで提供されているAPIのレスポンス内容を減らすことは非推奨であり、注意が必要です。カスタムフィールドの情報を含める場合には、get_post_meta関数と組み合わせることができます。また、追加したフィールドには_fieldクエリを使用して必要なデータのみを取得することもできます。

広告ここから
広告ここまで

目次

    WP APIを使うことで、WordPress内の記事データをREST形式のAPIリクエストで取得できます。複数のサービスを組み合わせる場合や、カスタムフィールドなどを組み合わせる場合の、レスポンスカスタマイズ方法を紹介します。

    レスポンスの内容を減らしたい場合は、_fieldsを先に検討する

    ハンドブックでも注意喚起が行われていますが、デフォルトで提供されているAPIのレスポンス内容を減らすことは非推奨です。ブロックエディタやテーマ、プラグインなどが除去されたデータを参照している可能性があるため、変更によって管理画面などの動作がおかしくなるリスクがあります。

    もし記事一覧APIのレスポンスを軽量化したい場合などでは、_fieldsパラメタを利用するようにしましょう。

    % curl "http://localhost:8881/wp-json/wp/v2/posts/1?_fields[]=title&_fields[]=guid" | jq .
    
    {
      "guid": {
        "rendered": "http://localhost:8881/?p=1"
      },
      "title": {
        "rendered": "Hello world!"
      }
    }

    register_rest_fieldでレスポンスにカスタムなデータを追加する

    登録ずみのAPIにレスポンスを追加する場合、register_rest_field関数を利用します。第一引数でパスを、第二引数で追加するフィールド名を追加します。第三引数でメソッドに応じたコールバック関数を指定すれば、そのフィールドにどんなデータを含めるかが指定できます。

    add_action( 'rest_api_init', function () {
        register_rest_field(
            'post',
            'test_field',
            [
                'get_callback' => function( $post ) {
                    return "test";
                }
            ]
        );
    });

    上のサンプルコードでは、記事系のAPIレスポンスにtest_fieldフィールドが追加されます。

     % curl "http://localhost:8881/wp-json/wp/v2/posts/1" | jq .test_field
    "test"

    コールバック関数内で、記事などの情報を取得する

    コールバック関数には、投稿などのリソースに関する情報が含まれています。そのため、get_post_meta関数などを組み合わせることで、カスタムフィールドの情報をレスポンスに含めることができます。

       register_rest_field(
            'post',
            'test_field',
            [
                'get_callback' => function( $object ) {
                    $meta = get_post_meta( $object[ 'id' ] );
                    return $meta;
                }
            ]
        );

    上のカスタマイズを加えると、test_fieldのデータは次のように変わります。

    {
      "_edit_lock": [
        "1703911515:1"
      ],
      "test": [
        "hello world"
      ],
      "_edit_last": [
        "1"
      ]
    }

    _fieldと組み合わせて、必要なデータだけ取得する

    追加したフィールドについても_fieldクエリが利用できます。

    % curl "http://localhost:8881/wp-json/wp/v2/posts/1?_fields=test_field" | jq .
    
    {
      "test_field": {
        "_edit_lock": [
          "1703911560:1"
        ],
        "test": [
          "hello world"
        ],
        "_edit_last": [
          "1"
        ]
      }
    }

    「引き算は_field足し算はregister_rest_field」と覚えておくのがよいかもしれません。

    参考記事

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark