私は(基本的にはランダムなソートを機能させるために)カスタムエンドポイントを使用しようとしており、次のコードを使用しています。
// 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があまり得意ではないので、おそらくそれが正しく得られないのです。
乾杯。
プラグインがデフォルトで行うのと同じ方法でREST APIメソッドを呼び出して出力を準備できます。これにより、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);
}
上記の答えは新しい配列変数を設定するのを忘れていました。あなたがそれを追加するとそれは素晴らしい作品です。
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応答とまったく同じです。