Make WordPress Core


Ignore:
Timestamp:
09/14/2023 08:50:43 AM (22 months ago)
Author:
Bernhard Reiter
Message:

Themes: Inject theme attribute during serialization.

Rather than using _inject_theme_attribute_in_block_template_content to inject the theme attribute into all Template Part blocks found in a given file-based Block Template, introduce a new function called _inject_theme_attribute_in_template_part_block, and use that as second argument to serialize_blocks() (introduced in [56557]) in order to inject said attribute during tree traversal for serialization.

This allows for a more modular approach that will eventually be extended to implement automatic insertion of hooked blocks.

Note that we're guarding _build_block_template_result_from_file() (i.e. the callsite of _inject_theme_attribute_in_template_part_block and previously of _inject_theme_attribute_in_block_template_content) against regressions through additional unit test coverage added in [56562].

Props @gziolo.
Fixes #59338. See #59313.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/block-template-utils.php

    r56562 r56578  
    209209            'a template with a template part block with an existing theme attribute' => array(
    210210                '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"} /-->',
     211                'expected' => '<!-- wp:template-part {"slug":"header","theme":"fake-theme","align":"full","tagName":"header","className":"site-header"} /-->',
    212212            ),
    213213            'a template with no template part block' => array(
     
    217217<!-- /wp:paragraph -->',
    218218            ),
     219        );
     220    }
     221
     222    /**
     223     * @ticket 59338
     224     *
     225     * @covers ::test_inject_theme_attribute_in_template_part_block
     226     */
     227    public function test_inject_theme_attribute_in_template_part_block() {
     228        $template_part_block_without_theme_attribute = array(
     229            'blockName'    => 'core/template-part',
     230            'attrs'        => array(
     231                'slug'      => 'header',
     232                'align'     => 'full',
     233                'tagName'   => 'header',
     234                'className' => 'site-header',
     235            ),
     236            'innerHTML'    => '',
     237            'innerContent' => array(),
     238            'innerBlocks'  => array(),
     239        );
     240
     241        $actual   = _inject_theme_attribute_in_template_part_block( $template_part_block_without_theme_attribute );
     242        $expected = array(
     243            'blockName'    => 'core/template-part',
     244            'attrs'        => array(
     245                'slug'      => 'header',
     246                'align'     => 'full',
     247                'tagName'   => 'header',
     248                'className' => 'site-header',
     249                'theme'     => get_stylesheet(),
     250            ),
     251            'innerHTML'    => '',
     252            'innerContent' => array(),
     253            'innerBlocks'  => array(),
     254        );
     255        $this->assertSame(
     256            $expected,
     257            $actual,
     258            '`theme` attribute was not correctly injected in template part block.'
     259        );
     260
     261        // Does not inject theme when there is an existing theme attribute.
     262        $template_part_block_with_existing_theme_attribute = array(
     263            'blockName'    => 'core/template-part',
     264            'attrs'        => array(
     265                'slug'      => 'header',
     266                'align'     => 'full',
     267                'tagName'   => 'header',
     268                'className' => 'site-header',
     269                'theme'     => 'fake-theme',
     270            ),
     271            'innerHTML'    => '',
     272            'innerContent' => array(),
     273            'innerBlocks'  => array(),
     274        );
     275
     276        $actual = _inject_theme_attribute_in_template_part_block( $template_part_block_with_existing_theme_attribute );
     277        $this->assertSame(
     278            $template_part_block_with_existing_theme_attribute,
     279            $actual,
     280            'Existing `theme` attribute in template part block was not respected by attribute injection.'
     281        );
     282
     283        // Does not inject theme when there is no template part.
     284        $non_template_part_block = array(
     285            'blockName'    => 'core/post-content',
     286            'attrs'        => array(),
     287            'innerHTML'    => '',
     288            'innerContent' => array(),
     289            'innerBlocks'  => array(),
     290        );
     291
     292        $actual = _inject_theme_attribute_in_template_part_block( $non_template_part_block );
     293        $this->assertSame(
     294            $non_template_part_block,
     295            $actual,
     296            '`theme` attribute injection modified non-template-part block.'
    219297        );
    220298    }
Note: See TracChangeset for help on using the changeset viewer.