基于属性 gutenberg 块的自定义端点 API

Custom Endpoint API based on attribute gutenberg block

浏览了 4 次

0

我需要 return 所有具有保存在自定义块属性 gutenberg 中的特定属性值的帖子。查询中的这个值将根据下面的端点。

http://idinheiro.local/wp-json/idinheiro/v1/blocks-posts/id-here-attribute-gutenberg-block

在我的回调函数下面。简而言之,如何查找此属性并将其放入 get_posts?

注册路由器

public function register_routes() {
        $namespace = 'idinheiro/v1';
        $path = 'blocks-posts';

        register_rest_route( $namespace, '/' . $path . '/(?P<id>[A-Za-z0-9_-]+)', [
            [
                'methods'             => 'GET',
                'callback'            => [$this, 'get_items'],
                'permission_callback' => [$this, 'get_items_permissions_check'],
            ],
        ]); 
    }

响应数据

public function get_items($request) {
        $args = [
            'post_status' => 'publish',
            'post_type' => 'post',
            's' => 'cgb/block-idinheiro-blocks',
        ];

        $posts = get_posts($args);

        if (empty($posts)) {
            return new WP_Error( 'empty_post', 'there is no blocks inside on posts', [ 'status' => 404 ] );
        }

        $data = [];
        $i = 0;

        foreach ($posts as $post) {
            $data[$i]['id'] = $request['id'];
            $data[$i]['post_id'] = $post->ID;
            $data[$i]['post_name'] = $post->post_title;
            $data[$i]['post_url'] = get_permalink($post->ID);
            $i++;
        }

        wp_reset_postdata();

        return new WP_REST_Response($data, 200);
    }

我想到了这样的事情。或者如果您有其他解决方法,我将不胜感激

$args = [
            'post_status' => 'publish',
            'post_type' => 'post',
            's' => 'cgb/block-idinheiro-blocks',
            'value_attribute_my_block' = $request['id']
        ];

        $posts = get_posts($args);

根据您提供的代码,这里有一个可能解决您问题的潜在解决方案:

在您的自定义块 cgb/block-idinheiro-blocks 中,您可以在 php/your 主插件文件中将 value_attribute_my_block 属性源设置为 meta if the block is only used once per a post/page (multiple can be restricted in the attributes - the default is true, set to false). NB. your meta field must be registered with register_post_meta(),否则该值将不会保存。

将值存储为 post_meta 使您能够使用强大的元查询轻松地将 post 检索到您的函数 get_items() 中。这种策略避免了必须解析 post 的内容,因为默认情况下保存块属性是序列化的。在您当前的查询 $args 中,您的 's' 参数会在块中找到 posts,但仍必须解析属性的值,这将是一个替代方案,但可能不像 fast/performant 作为元查询。