Make WordPress Core


Ignore:
Timestamp:
10/14/2025 12:10:31 AM (12 months ago)
Author:
westonruter
Message:

Editor: Avoid enqueueing assets for blocks which do not render content.

This change prevents scripts, styles, and script modules from being enqueued for blocks that do not render any HTML content. This is common for hidden blocks or blocks like the Featured Image block when no image is present. This change reduces the amount of unused CSS and JavaScript on a page, improving performance.

A new filter, enqueue_empty_block_content_assets, is introduced to allow developers to override this behavior and enqueue assets for empty blocks if needed.

The implementation involves capturing the asset queues before and after a block is rendered. The newly enqueued assets are only merged if the block's rendered content is not empty. This is done recursively for nested blocks to ensure that assets for inner blocks are also not enqueued if a parent block is hidden.

Developed in ​https://github.com/WordPress/wordpress-develop/pull/9213.

Props westonruter, aristath, peterwilsoncc, gziolo, krupajnanda, dd32, jorbin.
See #50328.
Fixes #63676.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-block.php

    r60807 r60930  
    492492        public function render( $options = array() ) {
    493493                global $post;
     494
     495                // Capture the current assets queues and then clear out to capture the diff of what was introduced by rendering.
     496                $before_styles_queue         = wp_styles()->queue;
     497                $before_scripts_queue        = wp_scripts()->queue;
     498                $before_script_modules_queue = wp_script_modules()->queue;
     499                wp_styles()->queue           = array();
     500                wp_scripts()->queue          = array();
     501                wp_script_modules()->queue   = array();
    494502
    495503                /*
    … …  
    662670                }
    663671
     672                // Capture the new assets enqueued during rendering, and restore the queues the state prior to rendering.
     673                $new_styles_queue          = wp_styles()->queue;
     674                $new_scripts_queue         = wp_scripts()->queue;
     675                $new_script_modules_queue  = wp_script_modules()->queue;
     676                wp_styles()->queue         = $before_styles_queue;
     677                wp_scripts()->queue        = $before_scripts_queue;
     678                wp_script_modules()->queue = $before_script_modules_queue;
     679                $has_new_styles            = count( $new_styles_queue ) > 0;
     680                $has_new_scripts           = count( $new_scripts_queue ) > 0;
     681                $has_new_script_modules    = count( $new_script_modules_queue ) > 0;
     682
     683                // Merge the newly enqueued assets with the existing assets if the rendered block is not empty.
     684                if (
     685                        ( $has_new_styles || $has_new_scripts || $has_new_script_modules ) &&
     686                        (
     687                                trim( $block_content ) !== '' ||
     688                                /**
     689                                 * Filters whether to enqueue assets for a block which has no rendered content.
     690                                 *
     691                                 * @since 6.9.0
     692                                 *
     693                                 * @param bool   $enqueue    Whether to enqueue assets.
     694                                 * @param string $block_name Block name.
     695                                 */
     696                                (bool) apply_filters( 'enqueue_empty_block_content_assets', false, $this->name )
     697                        )
     698                ) {
     699                        if ( $has_new_styles ) {
     700                                wp_styles()->queue = array_unique( array_merge( wp_styles()->queue, $new_styles_queue ) );
     701                        }
     702                        if ( $has_new_scripts ) {
     703                                wp_scripts()->queue = array_unique( array_merge( wp_scripts()->queue, $new_scripts_queue ) );
     704                        }
     705                        if ( $has_new_script_modules ) {
     706                                wp_script_modules()->queue = array_unique( array_merge( wp_script_modules()->queue, $new_script_modules_queue ) );
     707                        }
     708                }
     709
    664710                return $block_content;
    665711        }
Note: See TracChangeset for help on using the changeset viewer.