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 Style Variations: Reuse block metadata in WP_Theme_JSON::get_valid_block_style_variations() for better performance #66539

Merged
merged 2 commits into from
Oct 29, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 13 additions & 7 deletions lib/class-wp-theme-json-gutenberg.php
Original file line number Diff line number Diff line change
Expand Up @@ -745,10 +745,10 @@ public function __construct( $theme_json = array( 'version' => WP_Theme_JSON_Gut
}

$this->theme_json = WP_Theme_JSON_Schema_Gutenberg::migrate( $theme_json, $origin );
$registry = WP_Block_Type_Registry::get_instance();
$valid_block_names = array_keys( $registry->get_all_registered() );
$blocks_metadata = static::get_blocks_metadata();
$valid_block_names = array_keys( $blocks_metadata );
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm tentatively backporting this change too.

Core uses ::get_blocks_metadata() to get valid block names. See: https://github.com/mukeshpanchal27/wordpress-develop/blob/trunk/src/wp-includes/class-wp-theme-json.php#L762

It has done it this way since 5.9 😄

Then I found this Gutenberg PR from 2022, which doesn't appear to have been backported:

Which is correct?

I think maybe we could use what Core has since ::get_valid_block_style_variations() will now call ::get_blocks_metadata() anyway.

cc @ajlende @oandregal @aaronrobertshaw @mukeshpanchal27 for advice.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for highlighting this. It might have been a factor in why the valid variations function evolved as it did.

I think maybe we could use what Core has since ::get_valid_block_style_variations() will now call ::get_blocks_metadata() anyway.

Agreed. It saves another update in core too.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mmm, perhaps something that was added in gutenberg but not backported later to core? anyway, this seems a safe change to me given blocks metadata will recalculate the blocks that are registered (if they're different).

$valid_element_names = array_keys( static::ELEMENTS );
$valid_variations = static::get_valid_block_style_variations();
$valid_variations = static::get_valid_block_style_variations( $blocks_metadata );
$this->theme_json = static::unwrap_shared_block_style_variations( $this->theme_json, $valid_variations );
$this->theme_json = static::sanitize( $this->theme_json, $valid_block_names, $valid_element_names, $valid_variations );
$this->theme_json = static::maybe_opt_in_into_settings( $this->theme_json );
Expand Down Expand Up @@ -3506,9 +3506,10 @@ public static function remove_insecure_properties( $theme_json, $origin = 'theme

$theme_json = WP_Theme_JSON_Schema_Gutenberg::migrate( $theme_json, $origin );

$valid_block_names = array_keys( static::get_blocks_metadata() );
$blocks_metadata = static::get_blocks_metadata();
$valid_block_names = array_keys( $blocks_metadata );
$valid_element_names = array_keys( static::ELEMENTS );
$valid_variations = static::get_valid_block_style_variations();
$valid_variations = static::get_valid_block_style_variations( $blocks_metadata );

$theme_json = static::sanitize( $theme_json, $valid_block_names, $valid_element_names, $valid_variations );

Expand Down Expand Up @@ -4511,11 +4512,16 @@ function ( $matches ) use ( $variation_class ) {
/**
* Collects valid block style variations keyed by block type.
*
* @since 6.6.0
* @since 6.8.0 Added the `$blocks_metadata` parameter.
*
* @param array $blocks_metadata Optional. List of metadata per block. Default is the metadata for all blocks.
* @return array Valid block style variations by block type.
*/
protected static function get_valid_block_style_variations() {
protected static function get_valid_block_style_variations( $blocks_metadata = array() ) {
$valid_variations = array();
foreach ( self::get_blocks_metadata() as $block_name => $block_meta ) {
$blocks_metadata = empty( $blocks_metadata ) ? static::get_blocks_metadata() : $blocks_metadata;
foreach ( $blocks_metadata as $block_name => $block_meta ) {
if ( ! isset( $block_meta['styleVariations'] ) ) {
continue;
}
Expand Down
Loading