<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[48069] trunk: REST API: Only register one block renderer route.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/48069">48069</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/48069","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>TimothyBlynJacobs</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2020-06-17 03:20:02 +0000 (Wed, 17 Jun 2020)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>REST API: Only register one block renderer route.

Every block has a different set of attributes. These attributes are specified as a JSON Schema object. Previously, every block registered its own block renderer route using its attributes for the schema. This allowed for the attributes to be validated using the built in endpoint validation rules. It had the unfortunate side effect, however, of creating a large number of nearly identical REST API routes, one for each dynamic block. Each registered route has a performance impact. As the number of server side blocks goes up, this becomes more and more of an issue.

Now, we register a single block renderer route and dynamically validate the attributes based on the selected block.

Fixes <a href="https://core.trac.wordpress.org/ticket/48079">#48079</a>.
Props gziolo, TimothyBlynJacobs.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpincludesrestapiendpointsclasswprestblockrenderercontrollerphp">trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php</a></li>
<li><a href="#trunktestsphpunittestsrestapirestblockrenderercontrollerphp">trunk/tests/phpunit/tests/rest-api/rest-block-renderer-controller.php</a></li>
<li><a href="#trunktestsphpunittestsrestapirestschemasetupphp">trunk/tests/phpunit/tests/rest-api/rest-schema-setup.php</a></li>
<li><a href="#trunktestsqunitfixtureswpapigeneratedjs">trunk/tests/qunit/fixtures/wp-api-generated.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpincludesrestapiendpointsclasswprestblockrenderercontrollerphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php      2020-06-16 21:22:09 UTC (rev 48068)
+++ trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php        2020-06-17 03:20:02 UTC (rev 48069)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -34,47 +34,52 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * @see register_rest_route()
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public function register_routes() {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $block_types = WP_Block_Type_Registry::get_instance()->get_all_registered();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         register_rest_route(
+                       $this->namespace,
+                       '/' . $this->rest_base . '/(?P<name>[a-z0-9-]+/[a-z0-9-]+)',
+                       array(
+                               'args'   => array(
+                                       'name' => array(
+                                               'description' => __( 'Unique registered name for the block.' ),
+                                               'type'        => 'string',
+                                       ),
+                               ),
+                               array(
+                                       'methods'             => array( WP_REST_Server::READABLE, WP_REST_Server::CREATABLE ),
+                                       'callback'            => array( $this, 'get_item' ),
+                                       'permission_callback' => array( $this, 'get_item_permissions_check' ),
+                                       'args'                => array(
+                                               'context'    => $this->get_context_param( array( 'default' => 'view' ) ),
+                                               'attributes' => array(
+                                                       'description'       => __( 'Attributes for the block' ),
+                                                       'type'              => 'object',
+                                                       'default'           => array(),
+                                                       'validate_callback' => static function ( $value, $request ) {
+                                                               $block = WP_Block_Type_Registry::get_instance()->get_registered( $request['name'] );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                foreach ( $block_types as $block_type ) {
-                       if ( ! $block_type->is_dynamic() ) {
-                               continue;
-                       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                                         if ( ! $block ) {
+                                                                       // This will get rejected in ::get_item().
+                                                                       return true;
+                                                               }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        register_rest_route(
-                               $this->namespace,
-                               '/' . $this->rest_base . '/(?P<name>' . $block_type->name . ')',
-                               array(
-                                       'args'   => array(
-                                               'name' => array(
-                                                       'description' => __( 'Unique registered name for the block.' ),
-                                                       'type'        => 'string',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                                         $schema = array(
+                                                                       'type'                 => 'object',
+                                                                       'properties'           => $block->get_attributes(),
+                                                                       'additionalProperties' => false,
+                                                               );
+
+                                                               return rest_validate_value_from_schema( $value, $schema );
+                                                       },
</ins><span class="cx" style="display: block; padding: 0 10px">                                                 ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        ),
-                                       array(
-                                               'methods'             => array( WP_REST_Server::READABLE, WP_REST_Server::CREATABLE ),
-                                               'callback'            => array( $this, 'get_item' ),
-                                               'permission_callback' => array( $this, 'get_item_permissions_check' ),
-                                               'args'                => array(
-                                                       'context'    => $this->get_context_param( array( 'default' => 'view' ) ),
-                                                       'attributes' => array(
-                                                               /* translators: %s: The name of the block. */
-                                                               'description'          => sprintf( __( 'Attributes for %s block' ), $block_type->name ),
-                                                               'type'                 => 'object',
-                                                               'additionalProperties' => false,
-                                                               'properties'           => $block_type->get_attributes(),
-                                                               'default'              => array(),
-                                                       ),
-                                                       'post_id'    => array(
-                                                               'description' => __( 'ID of the post context.' ),
-                                                               'type'        => 'integer',
-                                                       ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                         'post_id'    => array(
+                                                       'description' => __( 'ID of the post context.' ),
+                                                       'type'        => 'integer',
</ins><span class="cx" style="display: block; padding: 0 10px">                                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                                        ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'schema' => array( $this, 'get_public_item_schema' ),
-                               )
-                       );
-               }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         ),
+                               'schema' => array( $this, 'get_public_item_schema' ),
+                       )
+               );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -136,9 +141,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        // Set up postdata since this will be needed if post_id was set.
</span><span class="cx" style="display: block; padding: 0 10px">                        setup_postdata( $post );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $registry = WP_Block_Type_Registry::get_instance();
</del><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( null === $registry->get_registered( $request['name'] ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $registry   = WP_Block_Type_Registry::get_instance();
+               $registered = $registry->get_registered( $request['name'] );
+
+               if ( null === $registered || ! $registered->is_dynamic() ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         return new WP_Error(
</span><span class="cx" style="display: block; padding: 0 10px">                                'block_invalid',
</span><span class="cx" style="display: block; padding: 0 10px">                                __( 'Invalid block.' ),
</span></span></pre></div>
<a id="trunktestsphpunittestsrestapirestblockrenderercontrollerphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/rest-api/rest-block-renderer-controller.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/rest-api/rest-block-renderer-controller.php     2020-06-16 21:22:09 UTC (rev 48068)
+++ trunk/tests/phpunit/tests/rest-api/rest-block-renderer-controller.php       2020-06-17 03:20:02 UTC (rev 48069)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -47,6 +47,15 @@
</span><span class="cx" style="display: block; padding: 0 10px">        protected static $context_block_name = 'core/context-test-block';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * Non dynamic block name.
+        *
+        * @since 5.5.0
+        *
+        * @var string
+        */
+       protected static $non_dynamic_block_name = 'core/non-dynamic';
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * Test API user's ID.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 5.0.0
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -117,6 +126,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        public function setUp() {
</span><span class="cx" style="display: block; padding: 0 10px">                $this->register_test_block();
</span><span class="cx" style="display: block; padding: 0 10px">                $this->register_post_context_test_block();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                $this->register_non_dynamic_block();
</ins><span class="cx" style="display: block; padding: 0 10px">                 parent::setUp();
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -128,6 +138,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        public function tearDown() {
</span><span class="cx" style="display: block; padding: 0 10px">                WP_Block_Type_Registry::get_instance()->unregister( self::$block_name );
</span><span class="cx" style="display: block; padding: 0 10px">                WP_Block_Type_Registry::get_instance()->unregister( self::$context_block_name );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                WP_Block_Type_Registry::get_instance()->unregister( self::$non_dynamic_block_name );
</ins><span class="cx" style="display: block; padding: 0 10px">                 parent::tearDown();
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -176,6 +187,15 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * Registers the non-dynamic block name.
+        *
+        * @since 5.5.0
+        */
+       protected function register_non_dynamic_block() {
+               register_block_type( self::$non_dynamic_block_name );
+       }
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * Test render callback.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 5.0.0
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -210,9 +230,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertContains( self::$block_name, $dynamic_block_names );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $routes = rest_get_server()->get_routes();
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                foreach ( $dynamic_block_names as $dynamic_block_name ) {
-                       $this->assertArrayHasKey( self::$rest_api_route . "(?P<name>$dynamic_block_name)", $routes );
-               }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertArrayHasKey( self::$rest_api_route . '(?P<name>[a-z0-9-]+/[a-z0-9-]+)', $routes );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -261,7 +279,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $request->set_param( 'context', 'edit' );
</span><span class="cx" style="display: block; padding: 0 10px">                $response = rest_get_server()->dispatch( $request );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertErrorResponse( 'rest_no_route', $response, 404 );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertErrorResponse( 'block_invalid', $response, 404 );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -511,6 +529,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * @ticket 48079
+        */
+       public function test_get_item_non_dynamic_block() {
+               wp_set_current_user( self::$user_id );
+               $request = new WP_REST_Request( 'GET', self::$rest_api_route . self::$non_dynamic_block_name );
+
+               $request->set_param( 'context', 'edit' );
+               $response = rest_get_server()->dispatch( $request );
+
+               $this->assertErrorResponse( 'block_invalid', $response, 404 );
+       }
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * Get item schema.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @ticket 45098
</span></span></pre></div>
<a id="trunktestsphpunittestsrestapirestschemasetupphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/rest-api/rest-schema-setup.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/rest-api/rest-schema-setup.php  2020-06-16 21:22:09 UTC (rev 48068)
+++ trunk/tests/phpunit/tests/rest-api/rest-schema-setup.php    2020-06-17 03:20:02 UTC (rev 48069)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -120,17 +120,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        '/wp/v2/comments',
</span><span class="cx" style="display: block; padding: 0 10px">                        '/wp/v2/comments/(?P<id>[\\d]+)',
</span><span class="cx" style="display: block; padding: 0 10px">                        '/wp/v2/search',
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        '/wp/v2/block-renderer/(?P<name>core/archives)',
-                       '/wp/v2/block-renderer/(?P<name>core/block)',
-                       '/wp/v2/block-renderer/(?P<name>core/calendar)',
-                       '/wp/v2/block-renderer/(?P<name>core/categories)',
-                       '/wp/v2/block-renderer/(?P<name>core/latest-comments)',
-                       '/wp/v2/block-renderer/(?P<name>core/latest-posts)',
-                       '/wp/v2/block-renderer/(?P<name>core/rss)',
-                       '/wp/v2/block-renderer/(?P<name>core/search)',
-                       '/wp/v2/block-renderer/(?P<name>core/shortcode)',
-                       '/wp/v2/block-renderer/(?P<name>core/social-link)',
-                       '/wp/v2/block-renderer/(?P<name>core/tag-cloud)',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 '/wp/v2/block-renderer/(?P<name>[a-z0-9-]+/[a-z0-9-]+)',
</ins><span class="cx" style="display: block; padding: 0 10px">                         '/wp/v2/settings',
</span><span class="cx" style="display: block; padding: 0 10px">                        '/wp/v2/themes',
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span></span></pre></div>
<a id="trunktestsqunitfixtureswpapigeneratedjs"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/qunit/fixtures/wp-api-generated.js</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/qunit/fixtures/wp-api-generated.js    2020-06-16 21:22:09 UTC (rev 48068)
+++ trunk/tests/qunit/fixtures/wp-api-generated.js      2020-06-17 03:20:02 UTC (rev 48069)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -4394,7 +4394,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 "self": "http://example.org/index.php?rest_route=/wp/v2/search"
</span><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px">         },
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        "/wp/v2/block-renderer/(?P<name>core/archives)": {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        "/wp/v2/block-renderer/(?P<name>[a-z0-9-]+/[a-z0-9-]+)": {
</ins><span class="cx" style="display: block; padding: 0 10px">             "namespace": "wp/v2",
</span><span class="cx" style="display: block; padding: 0 10px">             "methods": [
</span><span class="cx" style="display: block; padding: 0 10px">                 "GET",
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -4424,7 +4424,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                         "attributes": {
</span><span class="cx" style="display: block; padding: 0 10px">                             "required": false,
</span><span class="cx" style="display: block; padding: 0 10px">                             "default": [],
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                            "description": "Attributes for core/archives block",
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                            "description": "Attributes for the block",
</ins><span class="cx" style="display: block; padding: 0 10px">                             "type": "object"
</span><span class="cx" style="display: block; padding: 0 10px">                         },
</span><span class="cx" style="display: block; padding: 0 10px">                         "post_id": {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -4436,426 +4436,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px">             ]
</span><span class="cx" style="display: block; padding: 0 10px">         },
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        "/wp/v2/block-renderer/(?P<name>core/block)": {
-            "namespace": "wp/v2",
-            "methods": [
-                "GET",
-                "POST"
-            ],
-            "endpoints": [
-                {
-                    "methods": [
-                        "GET",
-                        "POST"
-                    ],
-                    "args": {
-                        "name": {
-                            "required": false,
-                            "description": "Unique registered name for the block.",
-                            "type": "string"
-                        },
-                        "context": {
-                            "required": false,
-                            "default": "view",
-                            "enum": [
-                                "edit"
-                            ],
-                            "description": "Scope under which the request is made; determines fields present in response.",
-                            "type": "string"
-                        },
-                        "attributes": {
-                            "required": false,
-                            "default": [],
-                            "description": "Attributes for core/block block",
-                            "type": "object"
-                        },
-                        "post_id": {
-                            "required": false,
-                            "description": "ID of the post context.",
-                            "type": "integer"
-                        }
-                    }
-                }
-            ]
-        },
-        "/wp/v2/block-renderer/(?P<name>core/calendar)": {
-            "namespace": "wp/v2",
-            "methods": [
-                "GET",
-                "POST"
-            ],
-            "endpoints": [
-                {
-                    "methods": [
-                        "GET",
-                        "POST"
-                    ],
-                    "args": {
-                        "name": {
-                            "required": false,
-                            "description": "Unique registered name for the block.",
-                            "type": "string"
-                        },
-                        "context": {
-                            "required": false,
-                            "default": "view",
-                            "enum": [
-                                "edit"
-                            ],
-                            "description": "Scope under which the request is made; determines fields present in response.",
-                            "type": "string"
-                        },
-                        "attributes": {
-                            "required": false,
-                            "default": [],
-                            "description": "Attributes for core/calendar block",
-                            "type": "object"
-                        },
-                        "post_id": {
-                            "required": false,
-                            "description": "ID of the post context.",
-                            "type": "integer"
-                        }
-                    }
-                }
-            ]
-        },
-        "/wp/v2/block-renderer/(?P<name>core/categories)": {
-            "namespace": "wp/v2",
-            "methods": [
-                "GET",
-                "POST"
-            ],
-            "endpoints": [
-                {
-                    "methods": [
-                        "GET",
-                        "POST"
-                    ],
-                    "args": {
-                        "name": {
-                            "required": false,
-                            "description": "Unique registered name for the block.",
-                            "type": "string"
-                        },
-                        "context": {
-                            "required": false,
-                            "default": "view",
-                            "enum": [
-                                "edit"
-                            ],
-                            "description": "Scope under which the request is made; determines fields present in response.",
-                            "type": "string"
-                        },
-                        "attributes": {
-                            "required": false,
-                            "default": [],
-                            "description": "Attributes for core/categories block",
-                            "type": "object"
-                        },
-                        "post_id": {
-                            "required": false,
-                            "description": "ID of the post context.",
-                            "type": "integer"
-                        }
-                    }
-                }
-            ]
-        },
-        "/wp/v2/block-renderer/(?P<name>core/latest-comments)": {
-            "namespace": "wp/v2",
-            "methods": [
-                "GET",
-                "POST"
-            ],
-            "endpoints": [
-                {
-                    "methods": [
-                        "GET",
-                        "POST"
-                    ],
-                    "args": {
-                        "name": {
-                            "required": false,
-                            "description": "Unique registered name for the block.",
-                            "type": "string"
-                        },
-                        "context": {
-                            "required": false,
-                            "default": "view",
-                            "enum": [
-                                "edit"
-                            ],
-                            "description": "Scope under which the request is made; determines fields present in response.",
-                            "type": "string"
-                        },
-                        "attributes": {
-                            "required": false,
-                            "default": [],
-                            "description": "Attributes for core/latest-comments block",
-                            "type": "object"
-                        },
-                        "post_id": {
-                            "required": false,
-                            "description": "ID of the post context.",
-                            "type": "integer"
-                        }
-                    }
-                }
-            ]
-        },
-        "/wp/v2/block-renderer/(?P<name>core/latest-posts)": {
-            "namespace": "wp/v2",
-            "methods": [
-                "GET",
-                "POST"
-            ],
-            "endpoints": [
-                {
-                    "methods": [
-                        "GET",
-                        "POST"
-                    ],
-                    "args": {
-                        "name": {
-                            "required": false,
-                            "description": "Unique registered name for the block.",
-                            "type": "string"
-                        },
-                        "context": {
-                            "required": false,
-                            "default": "view",
-                            "enum": [
-                                "edit"
-                            ],
-                            "description": "Scope under which the request is made; determines fields present in response.",
-                            "type": "string"
-                        },
-                        "attributes": {
-                            "required": false,
-                            "default": [],
-                            "description": "Attributes for core/latest-posts block",
-                            "type": "object"
-                        },
-                        "post_id": {
-                            "required": false,
-                            "description": "ID of the post context.",
-                            "type": "integer"
-                        }
-                    }
-                }
-            ]
-        },
-        "/wp/v2/block-renderer/(?P<name>core/rss)": {
-            "namespace": "wp/v2",
-            "methods": [
-                "GET",
-                "POST"
-            ],
-            "endpoints": [
-                {
-                    "methods": [
-                        "GET",
-                        "POST"
-                    ],
-                    "args": {
-                        "name": {
-                            "required": false,
-                            "description": "Unique registered name for the block.",
-                            "type": "string"
-                        },
-                        "context": {
-                            "required": false,
-                            "default": "view",
-                            "enum": [
-                                "edit"
-                            ],
-                            "description": "Scope under which the request is made; determines fields present in response.",
-                            "type": "string"
-                        },
-                        "attributes": {
-                            "required": false,
-                            "default": [],
-                            "description": "Attributes for core/rss block",
-                            "type": "object"
-                        },
-                        "post_id": {
-                            "required": false,
-                            "description": "ID of the post context.",
-                            "type": "integer"
-                        }
-                    }
-                }
-            ]
-        },
-        "/wp/v2/block-renderer/(?P<name>core/search)": {
-            "namespace": "wp/v2",
-            "methods": [
-                "GET",
-                "POST"
-            ],
-            "endpoints": [
-                {
-                    "methods": [
-                        "GET",
-                        "POST"
-                    ],
-                    "args": {
-                        "name": {
-                            "required": false,
-                            "description": "Unique registered name for the block.",
-                            "type": "string"
-                        },
-                        "context": {
-                            "required": false,
-                            "default": "view",
-                            "enum": [
-                                "edit"
-                            ],
-                            "description": "Scope under which the request is made; determines fields present in response.",
-                            "type": "string"
-                        },
-                        "attributes": {
-                            "required": false,
-                            "default": [],
-                            "description": "Attributes for core/search block",
-                            "type": "object"
-                        },
-                        "post_id": {
-                            "required": false,
-                            "description": "ID of the post context.",
-                            "type": "integer"
-                        }
-                    }
-                }
-            ]
-        },
-        "/wp/v2/block-renderer/(?P<name>core/shortcode)": {
-            "namespace": "wp/v2",
-            "methods": [
-                "GET",
-                "POST"
-            ],
-            "endpoints": [
-                {
-                    "methods": [
-                        "GET",
-                        "POST"
-                    ],
-                    "args": {
-                        "name": {
-                            "required": false,
-                            "description": "Unique registered name for the block.",
-                            "type": "string"
-                        },
-                        "context": {
-                            "required": false,
-                            "default": "view",
-                            "enum": [
-                                "edit"
-                            ],
-                            "description": "Scope under which the request is made; determines fields present in response.",
-                            "type": "string"
-                        },
-                        "attributes": {
-                            "required": false,
-                            "default": [],
-                            "description": "Attributes for core/shortcode block",
-                            "type": "object"
-                        },
-                        "post_id": {
-                            "required": false,
-                            "description": "ID of the post context.",
-                            "type": "integer"
-                        }
-                    }
-                }
-            ]
-        },
-        "/wp/v2/block-renderer/(?P<name>core/social-link)": {
-            "namespace": "wp/v2",
-            "methods": [
-                "GET",
-                "POST"
-            ],
-            "endpoints": [
-                {
-                    "methods": [
-                        "GET",
-                        "POST"
-                    ],
-                    "args": {
-                        "name": {
-                            "required": false,
-                            "description": "Unique registered name for the block.",
-                            "type": "string"
-                        },
-                        "context": {
-                            "required": false,
-                            "default": "view",
-                            "enum": [
-                                "edit"
-                            ],
-                            "description": "Scope under which the request is made; determines fields present in response.",
-                            "type": "string"
-                        },
-                        "attributes": {
-                            "required": false,
-                            "default": [],
-                            "description": "Attributes for core/social-link block",
-                            "type": "object"
-                        },
-                        "post_id": {
-                            "required": false,
-                            "description": "ID of the post context.",
-                            "type": "integer"
-                        }
-                    }
-                }
-            ]
-        },
-        "/wp/v2/block-renderer/(?P<name>core/tag-cloud)": {
-            "namespace": "wp/v2",
-            "methods": [
-                "GET",
-                "POST"
-            ],
-            "endpoints": [
-                {
-                    "methods": [
-                        "GET",
-                        "POST"
-                    ],
-                    "args": {
-                        "name": {
-                            "required": false,
-                            "description": "Unique registered name for the block.",
-                            "type": "string"
-                        },
-                        "context": {
-                            "required": false,
-                            "default": "view",
-                            "enum": [
-                                "edit"
-                            ],
-                            "description": "Scope under which the request is made; determines fields present in response.",
-                            "type": "string"
-                        },
-                        "attributes": {
-                            "required": false,
-                            "default": [],
-                            "description": "Attributes for core/tag-cloud block",
-                            "type": "object"
-                        },
-                        "post_id": {
-                            "required": false,
-                            "description": "ID of the post context.",
-                            "type": "integer"
-                        }
-                    }
-                }
-            ]
-        },
</del><span class="cx" style="display: block; padding: 0 10px">         "/wp/v2/settings": {
</span><span class="cx" style="display: block; padding: 0 10px">             "namespace": "wp/v2",
</span><span class="cx" style="display: block; padding: 0 10px">             "methods": [
</span></span></pre>
</div>
</div>

</body>
</html>