From a9136b77dcf8db72f9dbeeb73039f62b6fdd59c2 Mon Sep 17 00:00:00 2001 From: Jonny Harris Date: Sat, 30 Dec 2023 19:03:14 -0500 Subject: [PATCH 1/3] Add variable callback and backwards compat. --- src/wp-admin/includes/post.php | 2 +- src/wp-includes/class-wp-block-type.php | 35 ++++++++++++++++++- .../class-wp-rest-block-types-controller.php | 5 ++- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/wp-admin/includes/post.php b/src/wp-admin/includes/post.php index b9986d1bdec7a..2b028b2e95f56 100644 --- a/src/wp-admin/includes/post.php +++ b/src/wp-admin/includes/post.php @@ -2302,7 +2302,6 @@ function get_block_editor_server_block_settings() { 'ancestor' => 'ancestor', 'keywords' => 'keywords', 'example' => 'example', - 'variations' => 'variations', ); foreach ( $block_registry->get_all_registered() as $block_name => $block_type ) { @@ -2317,6 +2316,7 @@ function get_block_editor_server_block_settings() { $blocks[ $block_name ][ $key ] = $block_type->{ $field }; } + $blocks[ $block_name ][ 'variations' ] = $block_type->get_variations(); } return $blocks; diff --git a/src/wp-includes/class-wp-block-type.php b/src/wp-includes/class-wp-block-type.php index 9caa366032a75..73681aadec9ac 100644 --- a/src/wp-includes/class-wp-block-type.php +++ b/src/wp-includes/class-wp-block-type.php @@ -115,7 +115,15 @@ class WP_Block_Type { * @since 5.8.0 * @var array[] */ - public $variations = array(); + protected $variations = array(); + + /** + * Block variations callback. + * + * @since 6.5.0 + * @var callable[] + */ + public $variation_callback; /** * Custom CSS selectors for theme.json style generation. @@ -292,6 +300,7 @@ class WP_Block_Type { * @type string|null $textdomain The translation textdomain. * @type array[] $styles Alternative block styles. * @type array[] $variations Block variations. + * @type callable $variation_callback Block variations callback. * @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. @@ -325,6 +334,11 @@ public function __construct( $block_type, $args = array() ) { * null when value not found, or void when unknown property name provided. */ public function __get( $name ) { + if ( 'variations' === $name ) { + _doing_it_wrong( __CLASS__, __( 'Calling the variation property is not recommended, call get_variations instead.' ), '6.5.0' ); + return $this->get_variations(); + } + if ( ! in_array( $name, $this->deprecated_properties, true ) ) { return; } @@ -353,6 +367,10 @@ public function __get( $name ) { * or false otherwise. */ public function __isset( $name ) { + if ( 'variations' === $name && isset( $this->variation_callback ) ) { + return true; + } + if ( ! in_array( $name, $this->deprecated_properties, true ) ) { return false; } @@ -540,4 +558,19 @@ public function get_attributes() { $this->attributes : array(); } + + /** + * Get block variations. + * + * @since 6.5.0 + * + * @return array[] + */ + public function get_variations() { + if ( isset( $this->variation_callback ) && is_callable( $this->variation_callback ) ) { + return call_user_func( $this->variation_callback ); + } + + return $this->variations; + } } diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php index 852143d96ec35..c9e94b4e73803 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php @@ -292,7 +292,6 @@ public function prepare_item_for_response( $item, $request ) { 'view_script_handles', 'editor_style_handles', 'style_handles', - 'variations', 'block_hooks', ), $deprecated_fields @@ -314,6 +313,10 @@ public function prepare_item_for_response( $item, $request ) { } } + if ( rest_is_field_included( 'variations', $fields ) ) { + $data['variations'] = $block_type->get_variations(); + } + if ( rest_is_field_included( 'styles', $fields ) ) { $styles = $this->style_registry->get_registered_styles_for_block( $block_type->name ); $styles = array_values( $styles ); From f3c7a5ab1bca4ef2df38ce8ad663381b60355632 Mon Sep 17 00:00:00 2001 From: Jonny Harris Date: Sat, 30 Dec 2023 19:03:29 -0500 Subject: [PATCH 2/3] Add callbacks. --- src/wp-includes/blocks/navigation-link.php | 41 +++++++++++++--------- src/wp-includes/blocks/post-terms.php | 36 +++++++++++-------- src/wp-includes/blocks/template-part.php | 2 +- 3 files changed, 47 insertions(+), 32 deletions(-) diff --git a/src/wp-includes/blocks/navigation-link.php b/src/wp-includes/blocks/navigation-link.php index 5333ab6ea3dc9..b84998a4a742d 100644 --- a/src/wp-includes/blocks/navigation-link.php +++ b/src/wp-includes/blocks/navigation-link.php @@ -323,36 +323,35 @@ function build_variation_for_navigation_link( $entity, $kind ) { } /** - * Register the navigation link block. + * Returns an array of variations for the navigation link block. * - * @uses render_block_core_navigation() - * @throws WP_Error An WP_Error exception parsing the block definition. + * @return array */ -function register_block_core_navigation_link() { - $post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' ); - $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'objects' ); +function build_navigation_link_block_variations() { + $post_types = get_post_types(array('show_in_nav_menus' => true), 'objects'); + $taxonomies = get_taxonomies(array('show_in_nav_menus' => true), 'objects'); // Use two separate arrays as a way to order the variations in the UI. // Known variations (like Post Link and Page Link) are added to the // `built_ins` array. Variations for custom post types and taxonomies are // added to the `variations` array and will always appear after `built-ins. - $built_ins = array(); + $built_ins = array(); $variations = array(); - if ( $post_types ) { - foreach ( $post_types as $post_type ) { - $variation = build_variation_for_navigation_link( $post_type, 'post-type' ); - if ( $post_type->_builtin ) { + if ($post_types) { + foreach ($post_types as $post_type) { + $variation = build_variation_for_navigation_link($post_type, 'post-type'); + if ($post_type->_builtin) { $built_ins[] = $variation; } else { $variations[] = $variation; } } } - if ( $taxonomies ) { - foreach ( $taxonomies as $taxonomy ) { - $variation = build_variation_for_navigation_link( $taxonomy, 'taxonomy' ); - if ( $taxonomy->_builtin ) { + if ($taxonomies) { + foreach ($taxonomies as $taxonomy) { + $variation = build_variation_for_navigation_link($taxonomy, 'taxonomy'); + if ($taxonomy->_builtin) { $built_ins[] = $variation; } else { $variations[] = $variation; @@ -360,11 +359,21 @@ function register_block_core_navigation_link() { } } + return array_merge( $built_ins, $variations ); +} + +/** + * Register the navigation link block. + * + * @uses render_block_core_navigation() + * @throws WP_Error An WP_Error exception parsing the block definition. + */ +function register_block_core_navigation_link() { register_block_type_from_metadata( __DIR__ . '/navigation-link', array( 'render_callback' => 'render_block_core_navigation_link', - 'variations' => array_merge( $built_ins, $variations ), + 'variation_callback' => 'build_navigation_link_block_variations', ) ); } diff --git a/src/wp-includes/blocks/post-terms.php b/src/wp-includes/blocks/post-terms.php index c97155b81e3a9..3cd2b06fbcd8e 100644 --- a/src/wp-includes/blocks/post-terms.php +++ b/src/wp-includes/blocks/post-terms.php @@ -59,13 +59,13 @@ function render_block_core_post_terms( $attributes, $content, $block ) { } /** - * Registers the `core/post-terms` block on the server. + * @return array */ -function register_block_core_post_terms() { +function build_post_term_block_variations() { $taxonomies = get_taxonomies( array( 'publicly_queryable' => true, - 'show_in_rest' => true, + 'show_in_rest' => true, ), 'objects' ); @@ -73,41 +73,47 @@ function register_block_core_post_terms() { // Split the available taxonomies to `built_in` and custom ones, // in order to prioritize the `built_in` taxonomies at the // search results. - $built_ins = array(); + $built_ins = array(); $custom_variations = array(); // Create and register the eligible taxonomies variations. - foreach ( $taxonomies as $taxonomy ) { + foreach ($taxonomies as $taxonomy) { $variation = array( - 'name' => $taxonomy->name, - 'title' => $taxonomy->label, + 'name' => $taxonomy->name, + 'title' => $taxonomy->label, 'description' => sprintf( - /* translators: %s: taxonomy's label */ - __( 'Display a list of assigned terms from the taxonomy: %s' ), + /* translators: %s: taxonomy's label */ + __('Display a list of assigned terms from the taxonomy: %s'), $taxonomy->label ), - 'attributes' => array( + 'attributes' => array( 'term' => $taxonomy->name, ), - 'isActive' => array( 'term' ), - 'scope' => array( 'inserter', 'transform' ), + 'isActive' => array('term'), + 'scope' => array('inserter', 'transform'), ); // Set the category variation as the default one. - if ( 'category' === $taxonomy->name ) { + if ('category' === $taxonomy->name) { $variation['isDefault'] = true; } - if ( $taxonomy->_builtin ) { + if ($taxonomy->_builtin) { $built_ins[] = $variation; } else { $custom_variations[] = $variation; } } + return array_merge( $built_ins, $custom_variations ); +} +/** + * Registers the `core/post-terms` block on the server. + */ +function register_block_core_post_terms() { register_block_type_from_metadata( __DIR__ . '/post-terms', array( 'render_callback' => 'render_block_core_post_terms', - 'variations' => array_merge( $built_ins, $custom_variations ), + 'variation_callback' => 'build_post_term_block_variations', ) ); } diff --git a/src/wp-includes/blocks/template-part.php b/src/wp-includes/blocks/template-part.php index 3ad400906945b..452c2ce079bbd 100644 --- a/src/wp-includes/blocks/template-part.php +++ b/src/wp-includes/blocks/template-part.php @@ -276,7 +276,7 @@ function register_block_core_template_part() { __DIR__ . '/template-part', array( 'render_callback' => 'render_block_core_template_part', - 'variations' => build_template_part_block_variations(), + 'variation_callback' => 'build_template_part_block_variations', ) ); } From ec6674e0a303acc2e60aa18a4c3972607fd71109 Mon Sep 17 00:00:00 2001 From: Jonny Harris Date: Sat, 30 Dec 2023 20:39:57 -0500 Subject: [PATCH 3/3] Fix lints. --- src/wp-includes/blocks/navigation-link.php | 26 +++++++++++----------- src/wp-includes/blocks/post-terms.php | 26 +++++++++++----------- src/wp-includes/blocks/template-part.php | 2 +- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/wp-includes/blocks/navigation-link.php b/src/wp-includes/blocks/navigation-link.php index b84998a4a742d..ee878451bc32d 100644 --- a/src/wp-includes/blocks/navigation-link.php +++ b/src/wp-includes/blocks/navigation-link.php @@ -328,30 +328,30 @@ function build_variation_for_navigation_link( $entity, $kind ) { * @return array */ function build_navigation_link_block_variations() { - $post_types = get_post_types(array('show_in_nav_menus' => true), 'objects'); - $taxonomies = get_taxonomies(array('show_in_nav_menus' => true), 'objects'); + $post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' ); + $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'objects' ); // Use two separate arrays as a way to order the variations in the UI. // Known variations (like Post Link and Page Link) are added to the // `built_ins` array. Variations for custom post types and taxonomies are // added to the `variations` array and will always appear after `built-ins. - $built_ins = array(); + $built_ins = array(); $variations = array(); - if ($post_types) { - foreach ($post_types as $post_type) { - $variation = build_variation_for_navigation_link($post_type, 'post-type'); - if ($post_type->_builtin) { + if ( $post_types ) { + foreach ( $post_types as $post_type ) { + $variation = build_variation_for_navigation_link( $post_type, 'post-type' ); + if ( $post_type->_builtin ) { $built_ins[] = $variation; } else { $variations[] = $variation; } } } - if ($taxonomies) { - foreach ($taxonomies as $taxonomy) { - $variation = build_variation_for_navigation_link($taxonomy, 'taxonomy'); - if ($taxonomy->_builtin) { + if ( $taxonomies ) { + foreach ( $taxonomies as $taxonomy ) { + $variation = build_variation_for_navigation_link( $taxonomy, 'taxonomy' ); + if ( $taxonomy->_builtin ) { $built_ins[] = $variation; } else { $variations[] = $variation; @@ -372,8 +372,8 @@ function register_block_core_navigation_link() { register_block_type_from_metadata( __DIR__ . '/navigation-link', array( - 'render_callback' => 'render_block_core_navigation_link', - 'variation_callback' => 'build_navigation_link_block_variations', + 'render_callback' => 'render_block_core_navigation_link', + 'variation_callback' => 'build_navigation_link_block_variations', ) ); } diff --git a/src/wp-includes/blocks/post-terms.php b/src/wp-includes/blocks/post-terms.php index 3cd2b06fbcd8e..41e7bd06df387 100644 --- a/src/wp-includes/blocks/post-terms.php +++ b/src/wp-includes/blocks/post-terms.php @@ -65,7 +65,7 @@ function build_post_term_block_variations() { $taxonomies = get_taxonomies( array( 'publicly_queryable' => true, - 'show_in_rest' => true, + 'show_in_rest' => true, ), 'objects' ); @@ -73,30 +73,30 @@ function build_post_term_block_variations() { // Split the available taxonomies to `built_in` and custom ones, // in order to prioritize the `built_in` taxonomies at the // search results. - $built_ins = array(); + $built_ins = array(); $custom_variations = array(); // Create and register the eligible taxonomies variations. - foreach ($taxonomies as $taxonomy) { + foreach ( $taxonomies as $taxonomy ) { $variation = array( - 'name' => $taxonomy->name, - 'title' => $taxonomy->label, + 'name' => $taxonomy->name, + 'title' => $taxonomy->label, 'description' => sprintf( /* translators: %s: taxonomy's label */ - __('Display a list of assigned terms from the taxonomy: %s'), + __( 'Display a list of assigned terms from the taxonomy: %s' ), $taxonomy->label ), - 'attributes' => array( + 'attributes' => array( 'term' => $taxonomy->name, ), - 'isActive' => array('term'), - 'scope' => array('inserter', 'transform'), + 'isActive' => array( 'term' ), + 'scope' => array( 'inserter', 'transform' ), ); // Set the category variation as the default one. - if ('category' === $taxonomy->name) { + if ( 'category' === $taxonomy->name ) { $variation['isDefault'] = true; } - if ($taxonomy->_builtin) { + if ( $taxonomy->_builtin ) { $built_ins[] = $variation; } else { $custom_variations[] = $variation; @@ -112,8 +112,8 @@ function register_block_core_post_terms() { register_block_type_from_metadata( __DIR__ . '/post-terms', array( - 'render_callback' => 'render_block_core_post_terms', - 'variation_callback' => 'build_post_term_block_variations', + 'render_callback' => 'render_block_core_post_terms', + 'variation_callback' => 'build_post_term_block_variations', ) ); } diff --git a/src/wp-includes/blocks/template-part.php b/src/wp-includes/blocks/template-part.php index 452c2ce079bbd..b3d0c9ce3c693 100644 --- a/src/wp-includes/blocks/template-part.php +++ b/src/wp-includes/blocks/template-part.php @@ -275,7 +275,7 @@ function register_block_core_template_part() { register_block_type_from_metadata( __DIR__ . '/template-part', array( - 'render_callback' => 'render_block_core_template_part', + 'render_callback' => 'render_block_core_template_part', 'variation_callback' => 'build_template_part_block_variations', ) );