(修改答案,以正确回答问题中的问题。)
对于问题1(JS)
如何从古腾堡块中的自定义REST端点获取post对象?
这就是apiFetch()
您可以使用它从REST API获取资源。
但不同于return { children: getEntityRecords() }
, return { children: apiFetch() }
不起作用,因为apiFetch()
始终返回Promise
实例(&M);getEntityRecords()
总是在成功的API请求时返回一个对象/数组(并且响应实际上很好)。
所以特别是如果你想与之合作withSelect()
, 然后可以将端点添加为实体:
因此,在PHP中,您可以注册自定义端点,如下所示:
register_rest_route( \'my-namespace/v1\', \'posts\', array( ...your args... ) )
在古腾堡,您可以将其添加为如下实体:
var dispatch = wp.data.dispatch;
dispatch( \'core\' ).addEntities( [
{
name: \'posts\', // route name
kind: \'my-namespace/v1\', // namespace
baseURL: \'/my-namespace/v1/posts\' // API path without /wp-json
}
]);
然后在自定义块中:
// Used with withSelect():
return {
children: select( \'core\' ).getEntityRecords( \'my-namespace/v1\', \'posts\' )
}
对于问题2(PHP)
我想得到一篇与使用
getEntityRecords
.
你可以create your very own controller class.
或者可以扩展WP_REST_Posts_Controller
类(与标准POST路线一起使用,如wp/v2/posts
).
或者只利用prepare_item_for_response()
和prepare_response_for_collection()
中的方法WP_REST_Posts_Controller
. 这两种方法可用于返回帖子列表。
第三个选项的基本示例(在实际实现中,您可能希望添加授权/权限检查和/或接受自定义参数,如per_page
):
class My_REST_Posts_Controller {
public function __construct() {
$this->namespace = \'/my-namespace/v1\';
$this->resource_name = \'posts\';
}
public function register_routes() {
register_rest_route( $this->namespace, \'/\' . $this->resource_name, array(
array(
\'methods\' => \'GET\',
\'callback\' => array( $this, \'get_items\' ),
),
) );
}
public function get_items( $request ) {
$post_type = \'post\'; // or this can be defined as a property in the class
$posts = get_posts( array(
\'post_type\' => $post_type,
) );
$data = array();
if ( empty( $posts ) ) {
return rest_ensure_response( $data );
}
// Here we make use of the default controller class.
// Remember that only a single post type is supported.
$class = new WP_REST_Posts_Controller( $post_type );
foreach ( $posts as $post ) {
$response = $class->prepare_item_for_response( $post, $request );
$data[] = $class->prepare_response_for_collection( $response );
}
return rest_ensure_response( $data );
}
}