Make WordPress Core

Changeset 61122


Ignore:
Timestamp:
11/04/2025 07:53:24 AM (10 months ago)
Author:
westonruter
Message:

Script Loader: Load block styles on demand in classic themes even when wp-block-styles support is absent.

This reverts part of [61076] which made wp-block-styles theme support a precondition for opting in to should_load_separate_core_block_assets and should_load_block_assets_on_demand. This meant that the Twenty Twenty theme (and other themes without this support declared) would not benefit from on-demand block style loading. Nevertheless, even though such themes were not getting block styles loaded on demand, the wp_load_classic_theme_block_styles_on_demand() function was proceeding to opt in to the output buffer for hoisting late-printed styles, even though it was unlikely there would then be any. This meant the template enhancement output buffer was being opened for no reason.

Enabling on-demand block style loading is measured to improve FCP and LCP in Twenty Twenty, for example a ~13% improvement over a Fast 4G connection when loading the Sample Page.

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

Follow-up to [61008], [61076], [60936].

Props westonruter.
See #64099, #64150, #64166, #43258.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/script-loader.php

    r61121 r61122  
    35783578 *
    35793579 * @since 6.9.0
     3580 *
     3581 * @see _add_default_theme_supports()
    35803582 */
    35813583function wp_load_classic_theme_block_styles_on_demand() {
     3584        // This is not relevant to block themes, as they are opted in to loading separate styles on demand via _add_default_theme_supports().
    35823585        if ( wp_is_block_theme() ) {
    35833586                return;
     
    35913594        add_filter( 'wp_should_output_buffer_template_for_enhancement', '__return_true', 0 );
    35923595
     3596        // If a site has opted out of the template enhancement output buffer, then bail.
    35933597        if ( ! wp_should_output_buffer_template_for_enhancement() ) {
    35943598                return;
    35953599        }
    35963600
     3601        // The following two filters are added by default for block themes in _add_default_theme_supports().
     3602
    35973603        /*
    3598          * If the theme supports block styles, add filters to ensure they are loaded separately and on demand. Without this,
    3599          * if a theme does not want or support block styles, then enabling these filters can result in undesired separate
    3600          * block-specific styles being enqueued, though a theme may also be trying to nullify the wp-block-library
    3601          * stylesheet.
    3602          */
    3603         if ( current_theme_supports( 'wp-block-styles' ) ) {
    3604                 /*
    3605                  * Load separate block styles so that the large block-library stylesheet is not enqueued unconditionally,
    3606                  * and so that block-specific styles will only be enqueued when they are used on the page.
    3607                  */
    3608                 add_filter( 'should_load_separate_core_block_assets', '__return_true', 0 );
    3609 
    3610                 // Also ensure that block assets are loaded on demand (although the default value is from should_load_separate_core_block_assets).
    3611                 add_filter( 'should_load_block_assets_on_demand', '__return_true', 0 );
     3604         * Load separate block styles so that the large block-library stylesheet is not enqueued unconditionally,
     3605         * and so that block-specific styles will only be enqueued when they are used on the page.
     3606         * A priority of zero allows for this to be easily overridden by themes which wish to opt out.
     3607         */
     3608        add_filter( 'should_load_separate_core_block_assets', '__return_true', 0 );
     3609
     3610        /*
     3611         * Also ensure that block assets are loaded on demand (although the default value is from should_load_separate_core_block_assets).
     3612         * As above, a priority of zero allows for this to be easily overridden by themes which wish to opt out.
     3613         */
     3614        add_filter( 'should_load_block_assets_on_demand', '__return_true', 0 );
     3615
     3616        // If a site has explicitly opted out of loading block styles on demand via filters with priorities higher than above, then abort.
     3617        if ( ! wp_should_load_separate_core_block_assets() || ! wp_should_load_block_assets_on_demand() ) {
     3618                return;
    36123619        }
    36133620
  • trunk/tests/phpunit/tests/template.php

    r61120 r61122  
    13941394        public function data_wp_load_classic_theme_block_styles_on_demand(): array {
    13951395                return array(
    1396                         'block_theme'                                => array(
     1396                        'block_theme'                              => array(
    13971397                                'theme'                   => 'block-theme',
    13981398                                'set_up'                  => static function () {},
    1399                                 'expected_on_demand'      => false,
     1399                                'expected_load_separate'  => true,
     1400                                'expected_on_demand'      => true,
    14001401                                'expected_buffer_started' => false,
    14011402                        ),
    1402                         'classic_theme_with_output_buffer_blocked'   => array(
     1403                        'classic_theme_with_output_buffer_blocked' => array(
    14031404                                'theme'                   => 'default',
    14041405                                'set_up'                  => static function () {
    14051406                                        add_filter( 'wp_should_output_buffer_template_for_enhancement', '__return_false' );
    14061407                                },
     1408                                'expected_load_separate'  => false,
    14071409                                'expected_on_demand'      => false,
    14081410                                'expected_buffer_started' => false,
    14091411                        ),
    1410                         'classic_theme_with_block_styles_support'    => array(
     1412                        'classic_theme_with_should_load_separate_core_block_assets_opt_out' => array(
    14111413                                'theme'                   => 'default',
    14121414                                'set_up'                  => static function () {
    1413                                         add_theme_support( 'wp-block-styles' );
    1414                                 },
     1415                                        add_filter( 'should_load_separate_core_block_assets', '__return_false' );
     1416                                },
     1417                                'expected_load_separate'  => false,
     1418                                'expected_on_demand'      => true,
     1419                                'expected_buffer_started' => false,
     1420                        ),
     1421                        'classic_theme_with_should_load_block_assets_on_demand_out_out' => array(
     1422                                'theme'                   => 'default',
     1423                                'set_up'                  => static function () {
     1424                                        add_filter( 'should_load_block_assets_on_demand', '__return_false' );
     1425                                },
     1426                                'expected_load_separate'  => true,
     1427                                'expected_on_demand'      => false,
     1428                                'expected_buffer_started' => false,
     1429                        ),
     1430                        'classic_theme_without_any_opt_out'        => array(
     1431                                'theme'                   => 'default',
     1432                                'set_up'                  => static function () {},
     1433                                'expected_load_separate'  => true,
    14151434                                'expected_on_demand'      => true,
    14161435                                'expected_buffer_started' => true,
    14171436                        ),
    1418                         'classic_theme_without_block_styles_support' => array(
    1419                                 'theme'                   => 'default',
    1420                                 'set_up'                  => static function () {
    1421                                         remove_theme_support( 'wp-block-styles' );
    1422                                 },
    1423                                 'expected_on_demand'      => false,
    1424                                 'expected_buffer_started' => true,
    1425                         ),
    14261437                );
    14271438        }
     
    14371448         * @dataProvider data_wp_load_classic_theme_block_styles_on_demand
    14381449         */
    1439         public function test_wp_load_classic_theme_block_styles_on_demand( string $theme, ?Closure $set_up, bool $expected_on_demand, bool $expected_buffer_started ) {
     1450        public function test_wp_load_classic_theme_block_styles_on_demand( string $theme, ?Closure $set_up, bool $expected_load_separate, bool $expected_on_demand, bool $expected_buffer_started ) {
    14401451                $this->assertFalse( wp_should_load_separate_core_block_assets(), 'Expected wp_should_load_separate_core_block_assets() to return false initially.' );
    14411452                $this->assertFalse( wp_should_load_block_assets_on_demand(), 'Expected wp_should_load_block_assets_on_demand() to return true' );
     
    14481459
    14491460                wp_load_classic_theme_block_styles_on_demand();
    1450 
    1451                 $this->assertSame( $expected_on_demand, wp_should_load_separate_core_block_assets(), 'Expected wp_should_load_separate_core_block_assets() return value.' );
     1461                _add_default_theme_supports();
     1462
     1463                $this->assertSame( $expected_load_separate, wp_should_load_separate_core_block_assets(), 'Expected wp_should_load_separate_core_block_assets() return value.' );
    14521464                $this->assertSame( $expected_on_demand, wp_should_load_block_assets_on_demand(), 'Expected wp_should_load_block_assets_on_demand() return value.' );
    14531465                $this->assertSame( $expected_buffer_started, (bool) has_action( 'wp_template_enhancement_output_buffer_started', 'wp_hoist_late_printed_styles' ), 'Expected wp_template_enhancement_output_buffer_started action added status.' );
Note: See TracChangeset for help on using the changeset viewer.