diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php index 2f901f9230..96b4dfc068 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php @@ -135,9 +135,8 @@ class WP_REST_Block_Renderer_Controller extends WP_REST_Controller { setup_postdata( $post ); } $registry = WP_Block_Type_Registry::get_instance(); - $block = $registry->get_registered( $request['name'] ); - if ( null === $block ) { + if ( null === $registry->get_registered( $request['name'] ) ) { return new WP_Error( 'block_invalid', __( 'Invalid block.' ), @@ -147,8 +146,19 @@ class WP_REST_Block_Renderer_Controller extends WP_REST_Controller { ); } + $attributes = $request->get_param( 'attributes' ); + + // Create an array representation simulating the output of parse_blocks. + $block = array( + 'blockName' => $request['name'], + 'attrs' => $attributes, + 'innerHTML' => '', + 'innerContent' => array(), + ); + + // Render using render_block to ensure all relevant filters are used. $data = array( - 'rendered' => $block->render( $request->get_param( 'attributes' ) ), + 'rendered' => render_block( $block ), ); return rest_ensure_response( $data ); diff --git a/tests/phpunit/tests/rest-api/rest-block-renderer-controller.php b/tests/phpunit/tests/rest-api/rest-block-renderer-controller.php index dbc094ce98..cf41f079a0 100644 --- a/tests/phpunit/tests/rest-api/rest-block-renderer-controller.php +++ b/tests/phpunit/tests/rest-api/rest-block-renderer-controller.php @@ -373,7 +373,38 @@ class REST_Block_Renderer_Controller_Test extends WP_Test_REST_Controller_Testca ); } + /** + * Check filtering block output using the pre_render_block filter. + * + * @ticket 49387 + */ + public function test_get_item_with_pre_render_block_filter() { + wp_set_current_user( self::$user_id ); + $pre_render_filter = function( $output, $block ) { + if ( $block['blockName'] === self::$block_name ) { + return '

Alternate content.

'; + } + }; + add_filter( 'pre_render_block', $pre_render_filter, 10, 2 ); + + $attributes = array( + 'some_int' => '123', + 'some_string' => 'foo', + 'some_array' => array( 1, '2', 3 ), + ); + + $request = new WP_REST_Request( 'GET', self::$rest_api_route . self::$block_name ); + $request->set_param( 'context', 'edit' ); + $request->set_param( 'attributes', $attributes ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + + $data = $response->get_data(); + $this->assertEquals( '

Alternate content.

', $data['rendered'] ); + + remove_filter( 'pre_render_block', $pre_render_filter ); + } /** * Check success response for getting item with layout attribute provided.