我正在尝试使用自定义端点(基本上是为了进行随机排序),并使用以下代码:
// 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不是很在行,所以很可能我没有正确地理解它。
干杯
最合适的回答,由SO网友:Chris Morris 整理而成
您可以调用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);
}