Make WordPress Core

Changeset 61122


Ignore:
Timestamp:
11/04/2025 07:53:24 AM (4 weeks 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.