Editor: Add selectors field to block type definition

Adds support for the new selectors property for block types. It adds it to the allowed metadata when registering a block type, makes the WP_Block_Type class aware of it, exposes it through the block types REST API, and the get_block_editor_server_block_settings function.

Corresponding work in the Gutenberg plugin: https://github.com/WordPress/gutenberg/pull/46496.

Fixes #57585.
Props aaronrobertshaw, hellofromTonya.



git-svn-id: https://develop.svn.wordpress.org/trunk@55673 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Greg Ziółkowski 2023-04-21 10:41:58 +00:00
parent fa92c3fcf2
commit f047b94d71
8 changed files with 46 additions and 1 deletions

View File

@ -2178,6 +2178,7 @@ function taxonomy_meta_box_sanitize_cb_input( $taxonomy, $terms ) {
* of a block relevant for client registration.
*
* @since 5.0.0
* @since 6.3.0 Added `selectors` field.
*
* @return array An associative array of registered block data.
*/
@ -2192,6 +2193,7 @@ function get_block_editor_server_block_settings() {
'attributes' => 'attributes',
'provides_context' => 'providesContext',
'uses_context' => 'usesContext',
'selectors' => 'selectors',
'supports' => 'supports',
'category' => 'category',
'styles' => 'styles',

View File

@ -300,6 +300,7 @@ function get_block_metadata_i18n_schema() {
* @since 5.7.0 Added support for `textdomain` field and i18n handling for all translatable fields.
* @since 5.9.0 Added support for `variations` and `viewScript` fields.
* @since 6.1.0 Added support for `render` field.
* @since 6.3.0 Added `selectors` field.
*
* @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.
@ -382,6 +383,7 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
'attributes' => 'attributes',
'providesContext' => 'provides_context',
'usesContext' => 'uses_context',
'selectors' => 'selectors',
'supports' => 'supports',
'styles' => 'styles',
'variations' => 'variations',

View File

@ -117,6 +117,14 @@ class WP_Block_Type {
*/
public $variations = array();
/**
* Custom CSS selectors for theme.json style generation.
*
* @since 6.3.0
* @var array
*/
public $selectors = array();
/**
* Supported features.
*
@ -245,6 +253,7 @@ class WP_Block_Type {
* @since 6.1.0 Added the `editor_script_handles`, `script_handles`, `view_script_handles,
* `editor_style_handles`, and `style_handles` properties.
* Deprecated the `editor_script`, `script`, `view_script`, `editor_style`, and `style` properties.
* @since 6.3.0 Added the `selectors` property.
*
* @see register_block_type()
*
@ -268,6 +277,7 @@ class WP_Block_Type {
* @type string|null $textdomain The translation textdomain.
* @type array[] $styles Alternative block styles.
* @type array[] $variations Block variations.
* @type array $selectors Custom CSS selectors for theme.json style generation.
* @type array|null $supports Supported features.
* @type array|null $example Structured data for the block preview.
* @type callable|null $render_callback Block type render callback.

View File

@ -237,6 +237,7 @@ class WP_REST_Block_Types_Controller extends WP_REST_Controller {
*
* @since 5.5.0
* @since 5.9.0 Renamed `$block_type` to `$item` to match parent class for PHP 8 named parameter support.
* @since 6.3.0 Added `selectors` field.
*
* @param WP_Block_Type $item Block type data.
* @param WP_REST_Request $request Full details about the request.
@ -278,6 +279,7 @@ class WP_REST_Block_Types_Controller extends WP_REST_Controller {
'ancestor',
'provides_context',
'uses_context',
'selectors',
'supports',
'styles',
'textdomain',
@ -379,6 +381,7 @@ class WP_REST_Block_Types_Controller extends WP_REST_Controller {
* Retrieves the block type' schema, conforming to JSON Schema.
*
* @since 5.5.0
* @since 6.3.0 Added `selectors` field.
*
* @return array Item schema data.
*/
@ -518,6 +521,14 @@ class WP_REST_Block_Types_Controller extends WP_REST_Controller {
'context' => array( 'embed', 'view', 'edit' ),
'readonly' => true,
),
'selectors' => array(
'description' => __( 'Custom CSS selectors.' ),
'type' => 'object',
'default' => array(),
'properties' => array(),
'context' => array( 'embed', 'view', 'edit' ),
'readonly' => true,
),
'supports' => array(
'description' => __( 'Block supports.' ),
'type' => 'object',

View File

@ -27,6 +27,9 @@
"type": "string"
}
},
"selectors": {
"root": ".wp-block-notice"
},
"supports": {
"align": true,
"lightBlockWrapper": true

View File

@ -826,6 +826,7 @@ class Tests_Admin_IncludesPost extends WP_UnitTestCase {
'category' => 'common',
'render_callback' => 'foo',
'ancestor' => array( 'core/test-ancestor' ),
'selectors' => array( 'root' => '.wp-block-test' ),
);
register_block_type( $name, $settings );
@ -845,6 +846,7 @@ class Tests_Admin_IncludesPost extends WP_UnitTestCase {
'lock' => array( 'type' => 'object' ),
),
'usesContext' => array(),
'selectors' => array( 'root' => '.wp-block-test' ),
'category' => 'common',
'styles' => array(),
'ancestor' => array( 'core/test-ancestor' ),

View File

@ -483,6 +483,7 @@ class Tests_Blocks_Register extends WP_UnitTestCase {
*
* @ticket 50263
* @ticket 50328
* @ticket 57585
*/
public function test_block_registers_with_metadata_fixture() {
$result = register_block_type_from_metadata(
@ -515,6 +516,12 @@ class Tests_Blocks_Register extends WP_UnitTestCase {
$result->provides_context
);
$this->assertSameSets( array( 'groupId' ), $result->uses_context );
// @ticket 57585
$this->assertSame(
array( 'root' => '.wp-block-notice' ),
$result->selectors,
'Block type should contain selectors from metadata.'
);
$this->assertSame(
array(
'align' => true,

View File

@ -196,6 +196,7 @@ class REST_Block_Type_Controller_Test extends WP_Test_REST_Controller_Testcase {
/**
* @ticket 47620
* @ticket 57585
*/
public function test_get_item_invalid() {
$block_type = 'fake/invalid';
@ -216,6 +217,7 @@ class REST_Block_Type_Controller_Test extends WP_Test_REST_Controller_Testcase {
'example' => 'invalid_example',
'parent' => 'invalid_parent',
'ancestor' => 'invalid_ancestor',
'selectors' => 'invalid_selectors',
'supports' => 'invalid_supports',
'styles' => array(),
'render_callback' => 'invalid_callback',
@ -247,6 +249,7 @@ class REST_Block_Type_Controller_Test extends WP_Test_REST_Controller_Testcase {
$this->assertSameSets( array( 'invalid_keywords' ), $data['keywords'] );
$this->assertSameSets( array( 'invalid_parent' ), $data['parent'] );
$this->assertSameSets( array( 'invalid_ancestor' ), $data['ancestor'] );
$this->assertSameSets( array(), $data['selectors'], 'invalid selectors defaults to empty array' );
$this->assertSameSets( array(), $data['supports'] );
$this->assertSameSets( array(), $data['styles'] );
$this->assertNull( $data['example'] );
@ -265,6 +268,7 @@ class REST_Block_Type_Controller_Test extends WP_Test_REST_Controller_Testcase {
/**
* @ticket 47620
* @ticket 57585
*/
public function test_get_item_defaults() {
$block_type = 'fake/false';
@ -284,6 +288,7 @@ class REST_Block_Type_Controller_Test extends WP_Test_REST_Controller_Testcase {
'keywords' => false,
'parent' => false,
'ancestor' => false,
'selectors' => false,
'supports' => false,
'styles' => false,
'render_callback' => false,
@ -316,6 +321,7 @@ class REST_Block_Type_Controller_Test extends WP_Test_REST_Controller_Testcase {
$this->assertSameSets( array(), $data['keywords'] );
$this->assertSameSets( array(), $data['parent'] );
$this->assertSameSets( array(), $data['ancestor'] );
$this->assertSameSets( array(), $data['selectors'], 'selectors defaults to empty array' );
$this->assertSameSets( array(), $data['supports'] );
$this->assertSameSets( array(), $data['styles'] );
$this->assertNull( $data['example'] );
@ -534,6 +540,7 @@ class REST_Block_Type_Controller_Test extends WP_Test_REST_Controller_Testcase {
/**
* @ticket 47620
* @ticket 57585
*/
public function test_get_item_schema() {
wp_set_current_user( self::$admin_id );
@ -541,7 +548,7 @@ class REST_Block_Type_Controller_Test extends WP_Test_REST_Controller_Testcase {
$response = rest_get_server()->dispatch( $request );
$data = $response->get_data();
$properties = $data['schema']['properties'];
$this->assertCount( 28, $properties );
$this->assertCount( 29, $properties );
$this->assertArrayHasKey( 'api_version', $properties );
$this->assertArrayHasKey( 'title', $properties );
$this->assertArrayHasKey( 'icon', $properties );
@ -551,6 +558,7 @@ class REST_Block_Type_Controller_Test extends WP_Test_REST_Controller_Testcase {
$this->assertArrayHasKey( 'textdomain', $properties );
$this->assertArrayHasKey( 'name', $properties );
$this->assertArrayHasKey( 'attributes', $properties );
$this->assertArrayHasKey( 'selectors', $properties, 'schema must contain selectors' );
$this->assertArrayHasKey( 'supports', $properties );
$this->assertArrayHasKey( 'category', $properties );
$this->assertArrayHasKey( 'is_dynamic', $properties );