LoginSignup
0
0

More than 3 years have passed since last update.

WP REST APIで元レスポンスを継承したレンスポンスを返すカスタムエンドポイントを追加する

Posted at

はじめに

WP REST APIのレスポンスをプロジェクトに適したものにしたい。でもプロジェクトの拡張の可能性を考慮すると元レスポンスは保ったままで、そこに変更を加えた形のレスポンスを返す独自のカスタムエンドポイントを追加したい...

そんな時のカスタムエンドポイントの追加方法について記述していきます。

結論

WP_REST_Posts_Controllerクラスのget_itemsメソッドで元レスポンスの中身を取得する。

function get_posts_custom( $request ) {
    $response = new WP_REST_Posts_Controller('post');
    $posts = $response->get_items($request);
    if ( empty( $posts ) ) {
        return null;
    }
    //処理
    return $posts->data;
}

add_action( 'rest_api_init', function () {
    register_rest_route( 'wp/custom', 'posts', array(
        'methods' => 'GET',
        'callback' => 'get_posts_custom'
    ) );
} );

方針

カスタムエンドポイントを追加することは公式にも記述がある。追加されるエンドポイントとそのエンドポイントが叩かれたときに返る値を定めることで実現できる。

<?php
add_action( 'rest_api_init', 'slug_register_starship' );
function slug_register_starship() {
    register_rest_field( 'post',
        'starship',
        array(
            'get_callback'    => 'slug_get_starship',
            'update_callback' => null,
            'schema'          => null,
        )
    );
}

/**
 * "starship"フィールドの値を取得
 *
 * @param array $object 現在の投稿の詳細データ
 * @param string $field_name フィールド名
 * @param WP_REST_Request $request 現在のリクエスト
 *
 * @return mixed
 */
function slug_get_starship( $object, $field_name, $request ) {
    return get_post_meta( $object[ 'id' ], $field_name, true );
}

上の例ではslug_get_starshipでレスポンスの内容を定めることがわかります。ここにwp-json/wp/v2/postsのレスポンスの内容を引っ張ってきたい。

そこでWP REST APIのGitHubを参照するとwp-json/wp/v2/postsのレスポンスの内容はWP_REST_Posts_Controllerクラスのget_itemsメソッドで作られることがわかります。

class WP_REST_Posts_Controller extends WP_REST_Controller {
    ..
    /**
     * Get a collection of posts.
     *
     * @param WP_REST_Request $request Full details about the request.
     * @return WP_Error|WP_REST_Response
     */
    public function get_items( $request ) {
           ..
        }
    ..
}

これだ!!ということでカスタムエンドポイントのレスポンスを定める関数の中でメソッドを呼び出します。

したのコードのようにするとwp-json/wp/v2/postsを同様のレスポンスが再現できます。あとはこれを使いやすいように変更を加えていくだけ。

function get_posts_custom( $request ) {
    $response = new WP_REST_Posts_Controller('post');
    $posts = $response->get_items($request);
    if ( empty( $posts ) ) {
        return null;
    }
    //ここでレスポンスの中身をいじる
    return $posts->data;
}

add_action( 'rest_api_init', function () {
    register_rest_route( 'wp/custom', 'posts', array(
        'methods' => 'GET',
        'callback' => 'get_posts_custom'
    ) );
} );

最後に

ご拝読ありがとうございました。少しでも役に立てれば幸いです。よいWPライフを。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0