Make WordPress Core

Changeset 56896


Ignore:
Timestamp:
10/12/2023 04:39:27 PM (14 months ago)
Author:
Bernhard Reiter
Message:

Patterns: Don't inject theme attribute on frontend.

Having the patterns registry inject the theme attribute into all Template Part blocks inside every pattern was found to negatively impact performance. It turns out that it's only required for the editor (i.e. in the REST API) but not on the frontend; there, it's instead possible to fall back to the currently active theme.

The latter change was made to the Pattern and Template Part blocks in https://github.com/WordPress/gutenberg/pull/55217, which was sync'ed to Core in [56849]. Consequently, this changeset removes theme attribute insertion from the frontend.

Props flixos90, gziolo, dmsnell, hellofromtonya.
Fixes #59583.

Location:
trunk
Files:
1 added
5 edited

Legend:

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

    r56819 r56896  
    550550    }
    551551
    552     $before_block_visitor = '_inject_theme_attribute_in_template_part_block';
     552    $before_block_visitor = ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ? '_inject_theme_attribute_in_template_part_block' : null;
    553553    $after_block_visitor  = null;
    554554    $hooked_blocks        = get_hooked_blocks();
     
    557557        $after_block_visitor  = make_after_block_visitor( $hooked_blocks, $template );
    558558    }
    559     $blocks            = parse_blocks( $template_content );
    560     $template->content = traverse_and_serialize_blocks( $blocks, $before_block_visitor, $after_block_visitor );
     559    if ( null !== $before_block_visitor || null !== $after_block_visitor ) {
     560        $blocks           = parse_blocks( $template_content );
     561        $template_content = traverse_and_serialize_blocks( $blocks, $before_block_visitor, $after_block_visitor );
     562    }
     563    $template->content = $template_content;
    561564
    562565    return $template;
  • trunk/src/wp-includes/blocks.php

    r56845 r56896  
    780780     */
    781781    return function ( &$block, $parent_block = null, $prev = null ) use ( $hooked_blocks, $context ) {
    782         _inject_theme_attribute_in_template_part_block( $block );
     782        if ( defined( 'REST_REQUEST' ) && REST_REQUEST ) {
     783            _inject_theme_attribute_in_template_part_block( $block );
     784        }
    783785
    784786        $markup = '';
  • trunk/src/wp-includes/class-wp-block-patterns-registry.php

    r56835 r56896  
    166166        $content = $pattern['content'];
    167167
    168         $before_block_visitor = '_inject_theme_attribute_in_template_part_block';
     168        $before_block_visitor = ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ? '_inject_theme_attribute_in_template_part_block' : null;
    169169        $after_block_visitor  = null;
    170170        if ( ! empty( $hooked_blocks ) || has_filter( 'hooked_block_types' ) ) {
     
    172172            $after_block_visitor  = make_after_block_visitor( $hooked_blocks, $pattern );
    173173        }
    174         $blocks  = parse_blocks( $content );
    175         $content = traverse_and_serialize_blocks( $blocks, $before_block_visitor, $after_block_visitor );
     174        if ( null !== $before_block_visitor || null !== $after_block_visitor ) {
     175            $blocks  = parse_blocks( $content );
     176            $content = traverse_and_serialize_blocks( $blocks, $before_block_visitor, $after_block_visitor );
     177        }
    176178
    177179        return $content;
  • trunk/tests/phpunit/tests/block-template-utils.php

    r56724 r56896  
    163163
    164164    /**
    165      * @ticket 59325
    166      *
    167      * @covers ::_build_block_template_result_from_file
    168      *
    169      * @dataProvider data_build_block_template_result_from_file_injects_theme_attribute
    170      *
    171      * @param string $filename The template's filename.
    172      * @param string $expected The expected block markup.
    173      */
    174     public function test_build_block_template_result_from_file_injects_theme_attribute( $filename, $expected ) {
    175         $template = _build_block_template_result_from_file(
    176             array(
    177                 'slug' => 'single',
    178                 'path' => DIR_TESTDATA . "/templates/$filename",
    179             ),
    180             'wp_template'
    181         );
    182         $this->assertSame( $expected, $template->content );
    183     }
    184 
    185     /**
    186      * Data provider.
    187      *
    188      * @return array[]
    189      */
    190     public function data_build_block_template_result_from_file_injects_theme_attribute() {
    191         $theme = 'block-theme';
    192         return array(
    193             'a template with a template part block'  => array(
    194                 'filename' => 'template-with-template-part.html',
    195                 'expected' => sprintf(
    196                     '<!-- wp:template-part {"slug":"header","align":"full","tagName":"header","className":"site-header","theme":"%s"} /-->',
    197                     $theme
    198                 ),
    199             ),
    200             'a template with a template part block nested inside another block' => array(
    201                 'filename' => 'template-with-nested-template-part.html',
    202                 'expected' => sprintf(
    203                     '<!-- wp:group -->
    204 <!-- wp:template-part {"slug":"header","align":"full","tagName":"header","className":"site-header","theme":"%s"} /-->
    205 <!-- /wp:group -->',
    206                     $theme
    207                 ),
    208             ),
    209             'a template with a template part block with an existing theme attribute' => array(
    210                 'filename' => 'template-with-template-part-with-existing-theme-attribute.html',
    211                 'expected' => '<!-- wp:template-part {"slug":"header","theme":"fake-theme","align":"full","tagName":"header","className":"site-header"} /-->',
    212             ),
    213             'a template with no template part block' => array(
    214                 'filename' => 'template.html',
    215                 'expected' => '<!-- wp:paragraph -->
    216 <p>Just a paragraph</p>
    217 <!-- /wp:paragraph -->',
    218             ),
    219         );
    220     }
    221 
    222     /**
    223165     * @ticket 59338
    224166     *
  • trunk/tests/phpunit/tests/blocks/wpBlockPatternsRegistry.php

    r56818 r56896  
    318318
    319319    /**
    320      * Should insert a theme attribute into Template Part blocks in registered patterns.
    321      *
    322      * @ticket 59583
    323      *
    324      * @covers WP_Block_Patterns_Registry::register
    325      * @covers WP_Block_Patterns_Registry::get_all_registered
    326      */
    327     public function test_get_all_registered_includes_theme_attribute() {
    328         $test_pattern = array(
    329             'title'   => 'Test Pattern',
    330             'content' => '<!-- wp:template-part {"slug":"header","align":"full","tagName":"header","className":"site-header"} /-->',
    331         );
    332         $this->registry->register( 'test/pattern', $test_pattern );
    333 
    334         $expected = sprintf(
    335             '<!-- wp:template-part {"slug":"header","align":"full","tagName":"header","className":"site-header","theme":"%s"} /-->',
    336             get_stylesheet()
    337         );
    338         $patterns = $this->registry->get_all_registered();
    339         $this->assertSame( $expected, $patterns[0]['content'] );
    340     }
    341 
    342     /**
    343320     * Should insert hooked blocks into registered patterns.
    344321     *
     
    393370
    394371    /**
    395      * Should insert a theme attribute into Template Part blocks in registered patterns.
    396      *
    397      * @ticket 59583
    398      *
    399      * @covers WP_Block_Patterns_Registry::register
    400      * @covers WP_Block_Patterns_Registry::get_registered
    401      */
    402     public function test_get_registered_includes_theme_attribute() {
    403         $test_pattern = array(
    404             'title'   => 'Test Pattern',
    405             'content' => '<!-- wp:template-part {"slug":"header","align":"full","tagName":"header","className":"site-header"} /-->',
    406         );
    407         $this->registry->register( 'test/pattern', $test_pattern );
    408 
    409         $expected = sprintf(
    410             '<!-- wp:template-part {"slug":"header","align":"full","tagName":"header","className":"site-header","theme":"%s"} /-->',
    411             get_stylesheet()
    412         );
    413         $pattern  = $this->registry->get_registered( 'test/pattern' );
    414         $this->assertSame( $expected, $pattern['content'] );
    415     }
    416 
    417     /**
    418372     * Should insert hooked blocks into registered patterns.
    419373     *
Note: See TracChangeset for help on using the changeset viewer.