web-dev-qa-db-ja.com

WP-API v2カスタムエンドポイントレスポンスフォーマット

私は(基本的にはランダムなソートを機能させるために)カスタムエンドポイントを使用しようとしており、次のコードを使用しています。

// Custom WP API endpoint
function theme_enable_random_api() {

    // create json-api endpoint

    add_action('rest_api_init', function () {

        // http://example.com/wp-json/random/v2/posts

        register_rest_route('random/v2', '/random', array (
            'methods'             => 'GET',
            'callback'            => 'wp_json_offers_v2__posts',
            'permission_callback' => function (WP_REST_Request $request) {
                return true;
            }
        ));
    });

    // handle the request

    function wp_json_offers_v2__posts($request) {
        // json-api params

        $parameters = $request->get_query_params();

        // default search args

        $args = array(
            'post_type'     => $parameters['type'],
            'numberposts'   => 9,
            'offset'        => $parameters['offset'],
            'post_not_in'       => $parameters['exclude'],
            'orderby'       => 'Rand',
        );

        // run query

        $posts = get_posts($args);

        // return results
        return new WP_REST_Response($posts, 200);
    }

}

add_action('init', 'theme_enable_random_api');

しかし、私が得ている応答は、APIへの標準的な呼び出しから得られる応答と同じではありません。

標準:

 

カスタムエンドポイント

 

問題は、私が標準的なもののように分類法/ acf情報にアクセスできないということです。私はPHPがあまり得意ではないので、おそらくそれが正しく得られないのです。

乾杯。

5
evu

プラグインがデフォルトで行うのと同じ方法でREST AP​​Iメソッドを呼び出して出力を準備できます。これにより、ACFプラグインを使用したときと同じようにプラグインを出力に結び付けることもできます出力例.

WP_REST_Posts_Controllerクラスのget postsメソッドには以下のものがあります。

$posts_query = new WP_Query();
$query_result = $posts_query->query( $query_args );

$posts = array();
foreach ( $query_result as $post ) {
    if ( ! $this->check_read_permission( $post ) ) {
        continue;
    }

    $data = $this->prepare_item_for_response( $post, $request );
    $posts[] = $this->prepare_response_for_collection( $data );
}

そのため、新しいWP_REST_Posts_Controllerインスタンスをインスタンス化し、データに対してprepare_item_for_responseおよびprepare_response_for_collectionメソッドを呼び出して、デフォルトのエンドポイントと同じようにフォーマットすることができます。

次のようなものが動作するはずです(未テスト)。

function wp_json_offers_v2__posts($request) {
    // json-api params

    $parameters = $request->get_query_params();

    // default search args

    $args = array(
        'post_type'     => $parameters['type'],
        'numberposts'   => 9,
        'offset'        => $parameters['offset'],
        'post_not_in'       => $parameters['exclude'],
        'orderby'       => 'Rand',
    );

    // run query

    $posts = get_posts($args);

    $controller = new WP_REST_Posts_Controller($parameters['type']);

    foreach ( $posts as $post ) {
       $data    = $controller->prepare_item_for_response( $post, $request );
       $posts[] = $controller->prepare_response_for_collection( $data );
    }

    // return results
    return new WP_REST_Response($posts, 200);
}
6
Chris Morris

上記の答えは新しい配列変数を設定するのを忘れていました。あなたがそれを追加するとそれは素晴らしい作品です。

function get_all_posts($request)
{
    $posts = get_posts([
        'posts_per_page' => -1,
        'post_status' => 'publish'
    ]);

    $controller = new WP_REST_Posts_Controller('post');

    $array = [];

    foreach ( $posts as $post ) {
        $data = $controller->prepare_item_for_response($post,$request);
        $array[] = $controller->prepare_response_for_collection($data);
    }

    return $array;
}

出力は通常のapi応答とまったく同じです。

1
Myles Hyson