Viewed 4 times
0
I need to return all posts that have the value of a specific attribute that is saved in the custom block attributes gutenberg. This value in the query will be according to the endpoint below.
http://idinheiro.local/wp-json/idinheiro/v1/blocks-posts/id-here-attribute-gutenberg-block
below my callback function. In short, how do I look for this attribute and put it there in get_posts?
Register routers
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'],
],
]);
}
Response data
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);
}
I thought of something that went something like this. Or if you have another solution on how to get this, I'll be grateful
$args = [
'post_status' => 'publish',
'post_type' => 'post',
's' => 'cgb/block-idinheiro-blocks',
'value_attribute_my_block' = $request['id']
];
$posts = get_posts($args);
Based on your code provided, here is a potential solution that may solve your issue:
In your custom block cgb/block-idinheiro-blocks
, you could set the value_attribute_my_block
attribute source as 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() in php/your main plugin file or the value won't save.
Storing the value as post_meta
enables you to use the powerful meta query to retrieve posts into your function get_items()
easily. This strategy avoids having to parse the content of the post, as by default on save block attributes are serialized. In your current query $args
, your 's'
parameter would find posts with the block but would still have to parse the value of the attribute, which would be an alternative but likely not as fast/performant as meta query would be.