从古登堡的自定义REST端点获取帖子

时间:2019-11-13 作者:Sean

我想从古腾堡块中的自定义REST端点获取post对象。REST端点返回一个带有“post”键的数组,该键包含WP_Post 要返回的PHP对象。通常我会在getEntityRecordswithSelect 在块的JavaScript中:

    // ...within gutenberg block...
    edit: withSelect( ( select, props ) => {
        const { attributes } = props;
        const { getEntityRecords, getPostType } = select( \'core\' );

        const query = {
            post_id: 5, // this is made up!
        };

        return {
            children: getEntityRecords( \'postType\', \'post\', query )
        };
    } )( edit ),
。。。但这似乎只适用于标准WordPress posts REST端点。如何从古腾堡块中的自定义REST端点获取post对象?理想情况下,我希望得到一个与使用getEntityRecords.

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

(修改答案,以正确回答问题中的问题。)

对于问题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 );
    }
}

相关推荐

Order Posts in Custom Order

我正在尝试创建一种自定义方式来订购新的自定义帖子类型。以下是我的设想:有一种定制的方式,可以按照完全独特的显示顺序(数字、自动值等)对帖子进行排序,这样我就不需要手动更改帖子上的大量发布日期来获得正确的顺序</如果没有输入数字/自动值等,则将根据列表末尾发布的时间显示我正在使用CMB2作为自定义帖子类型上的元数据字段。有人有什么建议或想法吗?我意识到这是一个复杂的问题,但我希望能够按自定义顺序排序帖子,而不是按作者、发布日期或标题。