Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Block Type: Add selectors to block.json schema #3942

2 changes: 2 additions & 0 deletions src/wp-admin/includes/post.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
Expand All @@ -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',
Expand Down
2 changes: 2 additions & 0 deletions src/wp-includes/blocks.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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',
Expand Down
10 changes: 10 additions & 0 deletions src/wp-includes/class-wp-block-type.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down Expand Up @@ -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()
*
Expand All @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ public function get_item( $request ) {
*
* @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.
Expand Down Expand Up @@ -278,6 +279,7 @@ public function prepare_item_for_response( $item, $request ) {
'ancestor',
'provides_context',
'uses_context',
'selectors',
'supports',
'styles',
'textdomain',
Expand Down Expand Up @@ -379,6 +381,7 @@ protected function prepare_links( $block_type ) {
* 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.
*/
Expand Down Expand Up @@ -518,6 +521,14 @@ public function get_item_schema() {
'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',
Expand Down
3 changes: 3 additions & 0 deletions tests/phpunit/data/blocks/notice/block.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@
"type": "string"
}
},
"selectors": {
"root": ".wp-block-notice"
},
"supports": {
"align": true,
"lightBlockWrapper": true
Expand Down
2 changes: 2 additions & 0 deletions tests/phpunit/tests/admin/includesPost.php
Original file line number Diff line number Diff line change
Expand Up @@ -826,6 +826,7 @@ public function test_get_block_editor_server_block_settings() {
'category' => 'common',
'render_callback' => 'foo',
'ancestor' => array( 'core/test-ancestor' ),
'selectors' => array( 'root' => '.wp-block-test' ),
);

register_block_type( $name, $settings );
Expand All @@ -845,6 +846,7 @@ public function test_get_block_editor_server_block_settings() {
'lock' => array( 'type' => 'object' ),
),
'usesContext' => array(),
'selectors' => array( 'root' => '.wp-block-test' ),
'category' => 'common',
'styles' => array(),
'ancestor' => array( 'core/test-ancestor' ),
Expand Down
7 changes: 7 additions & 0 deletions tests/phpunit/tests/blocks/register.php
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,7 @@ public function test_metadata_not_found_in_the_current_directory() {
*
* @ticket 50263
* @ticket 50328
* @ticket 57585
*/
public function test_block_registers_with_metadata_fixture() {
$result = register_block_type_from_metadata(
Expand Down Expand Up @@ -515,6 +516,12 @@ public function test_block_registers_with_metadata_fixture() {
$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,
Expand Down
10 changes: 9 additions & 1 deletion tests/phpunit/tests/rest-api/rest-block-type-controller.php
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ public function test_get_block_invalid_name() {

/**
* @ticket 47620
* @ticket 57585
*/
public function test_get_item_invalid() {
$block_type = 'fake/invalid';
Expand All @@ -216,6 +217,7 @@ public function test_get_item_invalid() {
'example' => 'invalid_example',
'parent' => 'invalid_parent',
'ancestor' => 'invalid_ancestor',
'selectors' => 'invalid_selectors',
'supports' => 'invalid_supports',
'styles' => array(),
'render_callback' => 'invalid_callback',
Expand Down Expand Up @@ -247,6 +249,7 @@ public function test_get_item_invalid() {
$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'] );
Expand All @@ -265,6 +268,7 @@ public function test_get_item_invalid() {

/**
* @ticket 47620
* @ticket 57585
*/
public function test_get_item_defaults() {
$block_type = 'fake/false';
Expand All @@ -284,6 +288,7 @@ public function test_get_item_defaults() {
'keywords' => false,
'parent' => false,
'ancestor' => false,
'selectors' => false,
'supports' => false,
'styles' => false,
'render_callback' => false,
Expand Down Expand Up @@ -316,6 +321,7 @@ public function test_get_item_defaults() {
$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'] );
Expand Down Expand Up @@ -534,14 +540,15 @@ public function test_get_variation() {

/**
* @ticket 47620
* @ticket 57585
*/
public function test_get_item_schema() {
wp_set_current_user( self::$admin_id );
$request = new WP_REST_Request( 'OPTIONS', '/wp/v2/block-types' );
$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 );
Expand All @@ -551,6 +558,7 @@ public function test_get_item_schema() {
$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 );
Expand Down