From 86121f4f25b31247cd9121f7323e342c66ed3e09 Mon Sep 17 00:00:00 2001 From: gziolo Date: Fri, 2 Feb 2024 13:01:21 +0000 Subject: [PATCH] Editor: Add `allowed_blocks` field to block registration and REST API There is a new block.json field called allowedBlocks, added in Gutenberg in https://github.com/WordPress/gutenberg/pull/58262. This adds support for this new field also on the server. Props: gziolo, jsnajdr. Fixes #60403. Built from https://develop.svn.wordpress.org/trunk@57521 git-svn-id: http://core.svn.wordpress.org/trunk@57022 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-admin/includes/post.php | 1 + wp-includes/blocks.php | 3 ++- wp-includes/class-wp-block-type.php | 9 +++++++++ .../class-wp-rest-block-types-controller.php | 12 ++++++++++++ wp-includes/version.php | 2 +- 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/wp-admin/includes/post.php b/wp-admin/includes/post.php index c93ac71bec..90aaf2228e 100644 --- a/wp-admin/includes/post.php +++ b/wp-admin/includes/post.php @@ -2303,6 +2303,7 @@ function get_block_editor_server_block_settings() { 'keywords' => 'keywords', 'example' => 'example', 'variations' => 'variations', + 'allowed_blocks' => 'allowedBlocks', ); foreach ( $block_registry->get_all_registered() as $block_name => $block_type ) { diff --git a/wp-includes/blocks.php b/wp-includes/blocks.php index fdf97545f7..51d05a0846 100644 --- a/wp-includes/blocks.php +++ b/wp-includes/blocks.php @@ -327,7 +327,7 @@ function get_block_metadata_i18n_schema() { * @since 6.1.0 Added support for `render` field. * @since 6.3.0 Added `selectors` field. * @since 6.4.0 Added support for `blockHooks` field. - * @since 6.5.0 Added support for `viewStyle` field. + * @since 6.5.0 Added support for `allowedBlocks` and `viewStyle` fields. * * @param string $file_or_folder Path to the JSON file with metadata definition for * the block or path to the folder where the `block.json` file is located. @@ -424,6 +424,7 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) { 'styles' => 'styles', 'variations' => 'variations', 'example' => 'example', + 'allowedBlocks' => 'allowed_blocks', ); $textdomain = ! empty( $metadata['textdomain'] ) ? $metadata['textdomain'] : null; $i18n_schema = get_block_metadata_i18n_schema(); diff --git a/wp-includes/class-wp-block-type.php b/wp-includes/class-wp-block-type.php index 5bdcee1504..33825a7888 100644 --- a/wp-includes/class-wp-block-type.php +++ b/wp-includes/class-wp-block-type.php @@ -68,6 +68,14 @@ class WP_Block_Type { */ public $ancestor = null; + /** + * Limits which block types can be inserted as children of this block type. + * + * @since 6.5.0 + * @var string[]|null + */ + public $allowed_blocks = null; + /** * Block type icon. * @@ -303,6 +311,7 @@ class WP_Block_Type { * available when nested within the specified blocks. * @type string[]|null $ancestor Setting ancestor makes a block available only inside the specified * block types at any position of the ancestor's block subtree. + * @type string[]|null $allowed_blocks Limits which block types can be inserted as children of this block type. * @type string|null $icon Block type icon. * @type string $description A detailed block type description. * @type string[] $keywords Additional keywords to produce block type as diff --git a/wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php b/wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php index 9e8ba9e929..7bf2f6af4a 100644 --- a/wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php +++ b/wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php @@ -280,6 +280,7 @@ class WP_REST_Block_Types_Controller extends WP_REST_Controller { 'keywords', 'parent', 'ancestor', + 'allowed_blocks', 'provides_context', 'uses_context', 'selectors', @@ -723,6 +724,17 @@ class WP_REST_Block_Types_Controller extends WP_REST_Controller { 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), + 'allowed_blocks' => array( + 'description' => __( 'Allowed child block types.' ), + 'type' => array( 'array', 'null' ), + 'items' => array( + 'type' => 'string', + 'pattern' => self::NAME_PATTERN, + ), + 'default' => null, + 'context' => array( 'embed', 'view', 'edit' ), + 'readonly' => true, + ), 'keywords' => $keywords_definition, 'example' => $example_definition, 'block_hooks' => array( diff --git a/wp-includes/version.php b/wp-includes/version.php index c71271b07a..ed2d6cc2b8 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.5-alpha-57520'; +$wp_version = '6.5-alpha-57521'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.